首页
社区
课程
招聘
[求助]关于反汇编 CALL 跟 retn
发表于: 2015-10-27 14:21 7424

[求助]关于反汇编 CALL 跟 retn

2015-10-27 14:21
7424
现在情况是HOOK了一个地址  CALL进我自己的裸函数          代码如下       

__asm
{
pushad
popad
       
LEA EAX,[ESP+0xC]
PUSH EAX

add esp, 4
retn  
}
红色的是被HOOK的那5个字节的代码 而然插入了一个栈( PUSH EAX)导致栈平行出问题 所以我加了一个  add esp 指令 后返回成功 但返回后还是因为栈平行问题 程序出错 而然把retn改成功retn 4
retn -4 都一一失败 请问为什么????。。。。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 31
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
可能因为你是 jmp 到你这里的. 而 ret实际操作是从栈顶弹出一个地址, 然后跳向那里,
2015-10-27 14:29
0
雪    币: 18
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
hook 我用CALL 不是JMP哦 0XE9 0XE8的分别
2015-10-27 14:55
0
雪    币: 1515
活跃值: (6002)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
从你的CALL出来之后再执行被HOOK的指令。不然你retn到别的地方去了
2015-10-27 14:59
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
5
混乱的 HOOK 思维
2015-10-27 16:59
0
雪    币: 18
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
主要是躲检测 不然也不用这么麻烦  本来JMP 2次就行
2015-10-27 17:03
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
7
JMP  或 call 多少次 都不是问题,问题是最后 堆栈需要平衡、参数需要正确、返回地址正确不能飞到外星去了,回不来的!

下面这两个宏编译的机器码可以被 HOOK 技术利用

#define JMP_CODE_TAB1_000000(EdiCode) \
        __asm push ecx \
        __asm push dword ptr 0xbcdf6a99 \
        __asm push dword ptr [esp + 0x2c] \
        __asm push dword ptr 0x9d6ad411 \
        __asm push dword ptr 0xcf24f46e \
        __asm push dword ptr 0xd6ca35f7 \
        __asm push dword ptr [esp + 0x20] \
        __asm push edx \
        __asm push dword ptr [esp + 0xc] \
        __asm push ebp \
        __asm push dword ptr [esp + 0x10] \
        __asm call JMP_CODE_TAB1_000000_000 \
        __asm _emit 0x81 \
        __asm _emit 0xb5 \
        __asm JMP_CODE_TAB1_000000_000: \
        __asm push offset EdiCode + -1439573014 \
        __asm sub dword ptr[esp],-1439573014 \
        __asm jnz JMP_CODE_TAB1_000000_001 \
        __asm _emit 0x81 \
        __asm _emit 0x81 \
        __asm JMP_CODE_TAB1_000000_001: \
        __asm ret 44 \
        __asm _emit 0x81 \
        __asm _emit 0xc9

#define JMP_CODE_TAB_000(EdiCode) \
        __asm push dword ptr [esp + 0x28] \
        __asm push dword ptr 0xd2212ca1 \
        __asm push edi \
        __asm push dword ptr [esp + 0x24] \
        __asm sub esp,68  \
        __asm call JMP_CODE_TAB_000_000 \
        __asm _emit 0xb8 \
        __asm JMP_CODE_TAB_000_000: \
        __asm xchg edi,[esp] \
        __asm sub edi,offset JMP_CODE_TAB_000_000 - 1 - -1045432137 \
        __asm add edi,offset EdiCode - -1045432137 \
        __asm jz JMP_CODE_TAB_000_E000 \
        __asm xchg edi,[esp] \
        __asm ret 84 \
        __asm _emit 0x81 \
        __asm _emit 0xb3 \
        __asm JMP_CODE_TAB_000_E000: \
        __asm _emit 0x81 \
        __asm _emit 0xa7
2015-10-28 09:03
0
雪    币: 68
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
ret 只是返回你调用前的地址 比如你 0054  call  3333     他ret的其实只是 0054 然后再执行下一条命令 相当于pop ip

retn  相当于多了一个 pop ip  还pop 一个cs
2015-10-28 09:09
0
雪    币: 13
活跃值: (26)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
老大有空吗上下qq
2015-10-30 19:56
0
雪    币: 5613
活跃值: (1595)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
首先你这个祼函数、返回及栈平衡应该是没错的,但出错的原因应该是:红色的是被HOOK的那5个字节的代码;

你这个裸函数因为是CALL过来的,在你的裸函数里ESP已经和原来函数中ESP指针不相同了,红色指令又是原来函数的,那么你LEA EAX,[ESP+0xC]中EAX就已经指向了错误地址,然后再PUSH EAX将错误地址压栈,然后又ADD ESP,4等于将PUSH EAX这句作废了;其实就是间接的修改掉了原来函数的流程和数据,程序不出错才怪呢。其实这样的流程最终将原来这个函数的PUSH EAX压栈指令取消了造成原函数的栈不平衡,不是你的裸函数栈不平衡。

一般做INLINE HOOK是建议用JMP到裸函数的,如果功能复杂,可以在裸函数里CALL你自己的函数,这样容易做到栈平衡,也容易补充原来被HOOK的几条指令。
2015-10-30 23:28
0
游客
登录 | 注册 方可回帖
返回