首页
社区
课程
招聘
[求助]在什么情况下会将Call的返回地址抹除?
发表于: 2009-7-31 10:49 4156

[求助]在什么情况下会将Call的返回地址抹除?

2009-7-31 10:49
4156
写了一个Hook
void startHook(DWORD threadID,char* fileStr)//打开钩子函数
{
	pinstance = LoadLibrary((LPCTSTR)fileStr);
	
	startClientHook=(startClientHook_PROC)GetProcAddress(pinstance,"startClientHook");

	startClientHook(threadID);
}

反汇编如下
100010A0 >/$  64:A1 0000000>mov     eax, dword ptr fs:[0]
100010A6  |.  6A FF         push    -1
100010A8  |.  68 58DB0010   push    1000DB58
100010AD  |.  50            push    eax
100010AE  |.  64:8925 00000>mov     dword ptr fs:[0], esp
100010B5  |.  8B4424 14     mov     eax, dword ptr ss:[esp+14]
100010B9  |.  C74424 08 000>mov     dword ptr ss:[esp+8], 0
100010C1  |.  50            push    eax                              ; /FileName
100010C2  |.  FF15 C0E10010 call    dword ptr ds:[<&KERNEL32.LoadLib>; \LoadLibraryA
100010C8  |.  68 A0200110   push    100120A0                         ; /ProcNameOrOrdinal = "startClientHook"
100010CD  |.  50            push    eax                              ; |hModule
100010CE  |.  A3 04800110   mov     dword ptr ds:[10018004], eax     ; |
100010D3  |.  FF15 44E10010 call    dword ptr ds:[<&KERNEL32.GetProc>; \GetProcAddress
100010D9  |.  8B4C24 10     mov     ecx, dword ptr ss:[esp+10]
100010DD  |.  A3 34500110   mov     dword ptr ds:[10015034], eax
100010E2  |.  51            push    ecx
100010E3  |.  FFD0          call    eax
100010E5  |.  83C4 04       add     esp, 4                           ;  .....
100010E8  |.  8D4C24 14     lea     ecx, dword ptr ss:[esp+14]
100010EC  |.  C74424 08 FFF>mov     dword ptr ss:[esp+8], -1         ;  *
100010F4  |.  E8 32760000   call    1000872B
100010F9  |.  8B4C24 00     mov     ecx, dword ptr ss:[esp]
100010FD  |.  64:890D 00000>mov     dword ptr fs:[0], ecx
10001104  |.  83C4 0C       add     esp, 0C
10001107  \.  C3            retn


100010EC  |.  C74424 08 FFF>mov     dword ptr ss:[esp+8], -1         ;  *
这里不明白,[esp+8]的值原本是存放执行完后返回的地址,为什么这里却修改成了-1?
代码中也没有提现啊。在什么情况下会出现这种情况呢?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 171
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
看了半天,越看越奇怪……
2009-7-31 14:50
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
3
楼主仔细地计算一下堆栈吧,那个时候[esp+8]并不是返回地址。
进入函数时,返回地址保存在[esp],之后经过三次push,因此到达这里:
100010B9  |.  C74424 08 000>mov     dword ptr ss:[esp+8], 0
这时返回地址保存在[ebp+0C],而[esp+8]则是一个局部变量。到达下面这句时也是一样的:
100010EC  |.  C74424 08 FFF>mov     dword ptr ss:[esp+8], -1         ;  *

所以不存在改返回地址的问题,只是楼主算错了堆栈位置。

这里[esp+8]似乎是指以下这句
100010A6  |.  6A FF         push    -1
push进去的这个-1,这跟异常处理程序的安装和启用过程有关。
2009-7-31 19:01
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
4
VC++写的?
2009-7-31 20:27
0
游客
登录 | 注册 方可回帖
返回
//