能力值:
( LV2,RANK:10 )
|
-
-
2 楼
既然注入自身loader是正常的,莫非是CallBack.B的地址空间处理有问题?
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我用IDA动态加载目标进程,然后用loader.exe将dll注入进去,单步调试,也进入到pthunk->u1.function=CallBack.B这句,这时CallBack.B的地址显示也是对的(0x12345678),然后我在IDA里面用G跳转到0x12345678,正好是CallBack.B函数的入口地址,这点也是正常的。
我就奇怪了,既然我都将CallBack.B的入口地址传给pthunk->u1.function了,为什么没有执行到CallBack.B这个函数呢?我在里面用了MessageBox,也没框弹出来。。。
|
能力值:
( LV6,RANK:90 )
|
-
-
4 楼
问下,你的u1.function是指的什么,能详细说明下不
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
不好意思,我打字太懒了。。。
PIMAGE_THUNK_DATA pThunk;
pThunk = MakePtr( PIMAGE_THUNK_DATA, pDosHeader, pImportDesc->FirstThunk );
while( pThunk->u1.Function )
{
// 如果找到szFunctionName(GetProcAddress)的基地址
if( pThunk->u1.Function == (DWORD)pOldFunction )
{
DWORD dwOldProtect;
BOOL ret = VirtualProtect( ( void * )&pThunk->u1.Function, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect );
log("A.ret = 0x%X , pNewFunction = 0x%X , dwOldProtect = 0x%X",ret,pNewFunction,dwOldProtect);
pThunk->u1.Function = pNewFunction;
ret = VirtualProtect( ( void * )&pThunk->u1.Function, sizeof(DWORD), dwOldProtect, &dwOldProtect );
log("B.ret = 0x%X , pNewFunction = 0x%X , dwOldProtect = 0x%X",ret,pNewFunction,dwOldProtect);
return( pOldFunction );
}
pThunk++;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
pNewFunction是我传入的一个DWORD指针,他是CallBack.B的入口地址,就是我举例的那个0x12345678
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
这个修改PE表的函数原型是:
void *PECall( HMODULE hModule, char *szDllName, char *szFunctionName, DWORD pNewFunction )
我在dllmain里面是这样调用的:
switch (xxx):
{
case DLL_PROCESS_ATTACH:
{
pGetProcAddress = ( FARPROC(WINAPI*)(HMODULE,LPCSTR))PECall(GetModuleHandle(NULL)
,"Kernel32.dll"
,"GetProcAddress"
,(DWORD)&newGetProcAddress );
}
}
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
事实上,注入的dll进到DLL_PROCESS_ATTACH里面,PECall也执行到pThunk->u1.Function = pNewFunction;这一步了,就剩下CallBack.B(newGetProcAddress )没有进入。。。
CallBack.B回调函数如下:
FARPROC ( WINAPI *pGetProcAddress )( HMODULE hModule, LPCSTR lpProcName );
FARPROC WINAPI newGetProcAddress( HMODULE hModule, LPCSTR lpProcName )
{
MessageBox(0,"newGetProcAddress",0,0);
}
|
能力值:
( LV6,RANK:90 )
|
-
-
9 楼
哦,没看出你的iat hook 有啥问题,找找其他原因
或者传上来,一起研究研究
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
感谢skypismire的指点,项目是在目标进程运行中进行远程注入的,而目标进程在运行时没有调用GetProcAddress,所以我的CallBack.B木有机会被执行到。
换了个函数就能hook到,并执行我的CallBack.B了~
thx!
|
能力值:
( LV12,RANK:290 )
|
-
-
11 楼
也许目标进程不是直接调用iat的地址。可以inline hook一下,然后看看调用堆栈。看它是怎么调用的。
|
|
|