调用 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("[%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;
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-988138/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10752043/viewspace-988138/
本文介绍了一种在程序中拦截API函数的方法,通过自定义函数func并利用apiSpy函数实现对特定API(如TextOutA)的拦截。为保持原有功能,需在自定义函数内调用原API。若要拦截整个系统的API,还需使用全局HOOK。
57

被折叠的 条评论
为什么被折叠?



