能力值:
( LV2,RANK:10 )
|
-
-
2 楼
换了一种思路,用jmp解决了这个问题,代码如下:
//获取调用call GetCurrentIP此指令的地址
__declspec(naked) int GetCurrentIP()
{
_asm
{
mov eax, [esp]
sub eax, 0x5
ret
}
}
//计算新返回地址NewRetAddr
mov edi, 0x123 //获取地址标记
mov esi,esi //TEST
mov esi,esi
mov esi,esi
mov esi,esi
jmp NewRetAddr //call会导致进入系统异常
Contine:
pop eax //pop模拟原API的代码地址
mov [esp], edx //更改返回地址
mov edi,0 //取消获取地址标记
jmp eax //调用模拟的原API代码
NewRetAddr:
push eax //第一次执行压入的是模拟原API的代码地址 第二次执行压入的是模拟API返回结果
call GetCurrentIP //获取当前指令地址
sub eax, 0x1 //减去push eax指令长度1
mov edx, eax //将call NewRetAddr后下一条指令地址保存至edx中
cmp edi, 0x123
jz Contine
这个测试没有问题. 对于用call为什么异常,知道的朋友还请指点下 ths!
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
还在学汇编 暂时还看不懂 帮顶
|
|
|