首页
社区
课程
招聘
[原创]海风月影前辈的HOOKlib疑问
发表于: 2015-4-4 13:08 5455

[原创]海风月影前辈的HOOKlib疑问

2015-4-4 13:08
5455
测试的时候是没有成功的,打开源码寻找问题,发现一些弄不明白的问题
第一,这个既然是API HOOK,不继续执行原来的流程直接返回他是怎么平衡的栈?????

Code_Begin:
    call next1
next1:
    pop ecx
    sub ecx, offset next1
    lea edx, [ecx + HookProc]				//取hookProc
    mov eax, [ecx + pEsp]				//+4是pEsp
    mov [ecx + eax * 8 + SaveEsp],esp			//Esp保存到相应的位置
	push [esp]
	pop DWORD PTR [ecx + eax * 8 + SaveRet]		//保存真实返回地址到相应位置
    inc DWORD PTR [ecx + pEsp]				//pEsp ++;
	lea eax, [ecx + IsCallApi]			//压栈,是否调用真实API的地址
	push eax
    call [edx]

	sub esp,0x100
    call next2
next2:
    pop ecx
    sub ecx, offset next2
	add esp,0x100
	
	dec BYTE PTR [ecx + IsCallApi]			//看看是不是1
	je NormalCall					//是1,就表示需要继续执行
	dec DWORD PTR [ecx + pEsp]
	mov edx, [ecx + pEsp]
	push [ecx + edx * 8 + SaveRet]			//返回到相应的地址
[B][COLOR="Red"]//PS:这里栈平衡了吗????怎么平衡的????[/COLOR][/B]
	ret						//默认是不执行真实API
NormalCall:
    dec DWORD PTR [ecx + pEsp]				//pEsp --;
    mov eax, [ecx + pEsp]				//取出Esp
    mov esp, [ecx + eax * 8 + SaveEsp]	

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
push xxxxx
ret

模拟 jmp 的
2015-4-4 13:24
0
雪    币: 6911
活跃值: (9074)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
3
汗,我说他是怎么平衡栈的,API都是stdcall,自己平衡。这个直接就返回了。
2015-4-4 13:30
0
雪    币: 6911
活跃值: (9074)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=wormfox;1363402]这个是模拟jmp指令的,push [ecx + edx * 8 + SaveRet] 压入栈,然后又弹出了,栈是平衡的!ret相当一个 pop eip

        printf("\"\n");
        printf("ShellCode StrLen = %d\n",i+1);
        pr...[/QUOTE]
不是问题怎么跳转,我是问它就这样返回了?
这个是从API函数头部跳进来,如果要返回,是要平衡堆栈的,这个是怎么做的?
2015-4-4 22:56
0
雪    币: 2420
活跃值: (1417)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
你必须定义一个自己的 (Hooked) WinAPI,
因此,堆栈就平衡了。
2015-4-7 14:19
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
call [edx]  难道不是调用原函数 ret  xxx  平衡了吗
2015-4-7 14:33
0
游客
登录 | 注册 方可回帖
返回
//