想在你的程序中截住API函数吗?那就快看吧!

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在你的程序中做一个函数func(...)

调用 func1 = ApiSpy(NULL,"GDI32.DLL","TextOutA",(PROC)func)

那么你的程序没次调用TextOut时,就会调用func 为了不破坏原有功能

请在func中调用func1。如果想截获整个系统的api,你需要做一个全局HOOK

在HOOK的DLL里的初始化时调用本函数。主要代码如下:

PROC WINAPI

ApiSpy(PSTR pDllUse,PSTR pDllName,PSTR pApiName,PROC pNewPorc)

{

PIMAGE_DOS_HEADER pDosHeader;

PIMAGE_NT_HEADERS pNTHeader;

PIMAGE_IMPORT_DESCRIPTOR pImportDesc;

PIMAGE_THUNK_DATA pThunk;

PROC pOldProc;

DWORD oldpr;

static int Layer = 0;

if ( pDllUse == NULL )

Layer = 0;

pOldProc = GetProcAddress( GetModuleHandle(pDllName),pApiName );

if ( pOldProc == NULL )

return NULL;

pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(pDllUse);

if ( IsBadReadPtr(pDosHeader, sizeof(IMAGE_DOS_HEADER)) )

return NULL;

if ( pDosHeader->e_magic != IMAGE_DOS_SIGNATURE )

return NULL;

pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDosHeader, pDosHeader->e_lfanew);

if ( IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) )

return NULL;

if ( pNTHeader->Signature != IMAGE_NT_SIGNATURE )

return NULL;

pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDosHeader,

pNTHeader->OptionalHeader.

DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].

VirtualAddress);

if ( pImportDesc == (PIMAGE_IMPORT_DESCRIPTOR)pNTHeader )

return NULL;

__try{

while ( pImportDesc->Name ){

PSTR pszModName = MakePtr(PSTR, pDosHeader, pImportDesc->Name);

REM[url=file://REM][/url]("[%s]",pszModName);

if ( stricmp(pszModName, pDllName) == 0 ){

pThunk = MakePtr(PIMAGE_THUNK_DATA, pDosHeader, pImportDesc->FirstThunk);

while ( pThunk->u1.Function ){

REM("[%s:%s] ? %s %8x ==> %8x",pDllName,pApiName,pszModName,

// (DWORD)pOldProc,(DWORD)pThunk->u1.Function);

if ( pThunk->u1.Function == (PDWORD)pOldProc ){

if (!VirtualProtect(pThunk, 16, PAGE_READWRITE,&oldpr)){

REM("VirtualProtect False");

}

REM("ApiSpy [%s:%s] OK !",pDllName,pApiName);

pThunk->u1.Function=(PDWORD)pNewPorc;

return pOldProc;

}

pThunk++;

}

return NULL;

}

else{

if ( Layer < __Layer ){

Layer ++;

ApiSpy(pszModName,pDllName,pApiName,pNewPorc);

}

}

pImportDesc++;

}

}

__except(TRUE){

return NULL;

}

return NULL;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航