能力值:
(RANK:10 )
|
-
-
2 楼
可能因为你是 jmp 到你这里的. 而 ret实际操作是从栈顶弹出一个地址, 然后跳向那里,
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
hook 我用CALL 不是JMP哦 0XE9 0XE8的分别
|
能力值:
( LV13,RANK:240 )
|
-
-
4 楼
从你的CALL出来之后再执行被HOOK的指令。不然你retn到别的地方去了
|
能力值:
( LV9,RANK:190 )
|
-
-
5 楼
混乱的 HOOK 思维
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
主要是躲检测 不然也不用这么麻烦 本来JMP 2次就行
|
能力值:
( 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
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
ret 只是返回你调用前的地址 比如你 0054 call 3333 他ret的其实只是 0054 然后再执行下一条命令 相当于pop ip
retn 相当于多了一个 pop ip 还pop 一个cs
|
能力值:
(RANK:10 )
|
-
-
9 楼
 老大有空吗上下qq
|
能力值:
( 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的几条指令。
|
|
|