首页
社区
课程
招聘
[讨论]关于remotethread注入后的回调的执行(PE)
发表于: 2010-6-21 01:31 7332

[讨论]关于remotethread注入后的回调的执行(PE)

2010-6-21 01:31
7332
1、通过remotethread方式将dll注入目标进程(正常);
2、dll在attach的时候创建一工作线程A(正常);
3、在A线程中通过遍历PE获得当前需要hook的函数,例如loadlibrary/getprocessaddress,然后通过VirtualProtect方式设置thunk_data的u1.function的分页属性为PAGE_EXECUTE_READWRITE,再将u1.function指向我们需要的某个回调函数,例如CallBack.B,重新设置u1.function的分页属性(正常);
4、CallBack.B没有得到执行(疑惑)。

ps:通过这种方式注入自身loader是正常的,比如user32.dll的MessageBox,但是注入到其他进程的话,CallBack.B就无法执行,IDA动态跟踪后,u1.function的确是指向CallBack.B的入口地址的,请大牛牛指点下,搞了几个小时都不知道回调执行不了的原因,感觉有点偏头疼。。。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
既然注入自身loader是正常的,莫非是CallBack.B的地址空间处理有问题?
2010-6-21 07:14
0
雪    币: 175
活跃值: (10)
能力值: ( 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,也没框弹出来。。。
2010-6-21 16:59
0
雪    币: 75
活跃值: (698)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
问下,你的u1.function是指的什么,能详细说明下不
2010-6-21 17:16
0
雪    币: 175
活跃值: (10)
能力值: ( 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++;
        }
2010-6-21 17:41
0
雪    币: 175
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
pNewFunction是我传入的一个DWORD指针,他是CallBack.B的入口地址,就是我举例的那个0x12345678
2010-6-21 17:43
0
雪    币: 175
活跃值: (10)
能力值: ( 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 );                  
         }
}
2010-6-21 17:45
0
雪    币: 175
活跃值: (10)
能力值: ( 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);
}
2010-6-21 17:47
0
雪    币: 75
活跃值: (698)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
哦,没看出你的iat hook 有啥问题,找找其他原因
或者传上来,一起研究研究
2010-6-21 20:31
0
雪    币: 175
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢skypismire的指点,项目是在目标进程运行中进行远程注入的,而目标进程在运行时没有调用GetProcAddress,所以我的CallBack.B木有机会被执行到。

换了个函数就能hook到,并执行我的CallBack.B了~

thx!
2010-6-23 18:11
0
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
11
也许目标进程不是直接调用iat的地址。可以inline hook一下,然后看看调用堆栈。看它是怎么调用的。
2010-6-26 11:42
0
游客
登录 | 注册 方可回帖
返回
//