首页
社区
课程
招聘
[旧帖] 汇编函数中获取指定位置的代码片段 0.00雪花
发表于: 2012-8-19 14:31 3098

[旧帖] 汇编函数中获取指定位置的代码片段 0.00雪花

2012-8-19 14:31
3098
注:eax是一个call地址,在执行下列代码时,已经压入了一个返回地址,该地址会返回到其他代码去.
我的目的是修改压入的返回地址为jmp eax之后的代码(即NewRetAddr处),使得执行jmp eax后,可以返回到本代码继续执行.
下面这个代码在OD中看看是没问题的,但实际执行到call NewRetAddr时,系统异常

                //计算新返回地址NewRetAddr
                mov edi, 0x123        //获取地址标记

                        mov esi,esi //TEST
                        mov esi,esi
                        mov esi,esi
                        mov esi,esi

                call NewRetAddr
Contine:
                add esp,0x4                //平衡call NewRetAddr堆栈
                mov [esp], edx        //更改返回地址
                mov edi,0                //取消获取地址标记
                jmp eax                        //调用模拟的原API代码
NewRetAddr:
                cmp edi, 0x123
                mov edx, [esp]        //将call NewRetAddr后下一条指令地址保存至edx中
                add edx, 0xD        //加上Contine->NewRetAddr的指令长度
                jz Contine

OD中看到的代码,在call NewRetAddr下断

单步执行call NewRetAddr,立即跳转到异常处,如下


求指点,为什么会进入到异常? call某个地址后,是不是还要经过系统检测,像我这种内部call某个地址,是不是非法的? 一般如何实现我的这个功能?
先谢了

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 126
活跃值: (10)
能力值: ( 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!
2012-8-19 16:32
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
还在学汇编 暂时还看不懂 帮顶
2012-8-19 17:34
0
游客
登录 | 注册 方可回帖
返回
//