开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4064|回复: 10
收起左侧

[易语言纯源码] 【汇编技术】函数式汇编popad的实现解析

[复制链接]
结帖率:33% (2/6)
发表于 2019-1-29 14:31:24 | 显示全部楼层 |阅读模式   广东省*
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
要做到一个函数式popad(也就是用一个函数来实现popad)不是很容易的事
比如这个函数命名为 popad()

但call你这个 popad() 时,栈压入了返回地址,
你不可能直接在函数里直接popad 因为你得让eip指向调用处的下一句代码
你也不可能直接跳转到返回地址,因为你用了popad后所有寄存器会被改变包括esp,ebp,你不能找到原本的返回地址在哪个位置
所以我们得不改变任何寄存器,却能正常的使用popad  并且找到返回地址  并跳转到返回地址处

在逻辑原理上 我们可以在写代码时预留一段空指令 比如5字节  置入代码{144,144,144,144,144}   可以通过写预留代码 成 跳转到返回地址 来实现
但是这是不可行的,因为代码段内存受保护,是不可写的
总的来说就是我们需要动态写一块内存,把返回调用处的处理代码写进去,并让它执行,因为我们一开始并不知道调用处的返回地址是什么,也不能改变使用popad后的任何寄存器的状态。

既然代码段内存无法写入,那我们是不是得向系统申请一段内存?
其实不需要,那样更麻烦
而且,还有一块闲置的内存,也是非常重要的内存是已经分配好的:栈

先看看偏移地址和绝对地址之间的转换:

偏移地址=绝对地址-call指令所在地址-5
绝对地址=call指令所在地址+5+偏移地址
上面两条计算规则是针对与4字节指针跳转,如 call:0xE8  和  jmp:0xE9

置入定位代码用od跟踪看看

QQ截图20190129125701.png

来到我们两个 call的地方
QQ截图20190129125949.png

先清0  等下再看看 pushad()的效果  esp:0019FCE8
QQ截图20190129132803.png

压入成功,esp:0019FCC8
QQ截图20190129133004.png

在f8 看看 popad()效果
QQ截图20190129133323.png

恢复成功,很完美,下面一步一步分析其原理。

看看动态执行效果
GIF.gif

来到函数内部,返回地址在栈顶
返回地址被压入.png

这是我们自己的代码
我们自己的代码.png

mov esp,ebp
pop ebp
mov eax,dword ptr ss:[esp]
sub esp,0x190
mov ecx,eax
sub ecx,esp
sub ecx,0xC
mov dword ptr ss:[esp],0x194C481
mov dword ptr ss:[esp+0x4],0xE9610000
mov dword ptr ss:[esp+0x8],ecx
jmp esp

***********************************
mov esp,ebp
pop ebp

用于平掉编译器开的栈帧,也可以用leave

mov eax,dword ptr ss:[esp]
将返回地址放到eax,因为popad将从栈弹到寄存器,所以这时候是可以不保存随意改变寄存器也不影响

sub esp,0x190
将栈指针esp 弄成我们的内存指针,不一定要0x190,写入代码后不要覆盖到栈顶就好 , 只是考虑到我一般喜欢写栈顶往上的几个字节,预留多一点好,不然覆盖了自己的数据就不好了。

mov ecx,eax    //用ecx计算偏移地址

sub ecx,esp     //ecx=eax=[esp],也就是说ecx是返回地址,我们要跳到这,偏移地址=绝对地址-call指令所在地址-5。我们这里减去的是栈代码的起始地址,还没有计算jmp指令的位置

sub ecx,0xC  //这是什么意思?不是减去5?  因为刚刚减去的是代码的起始地址,还得减去 起始地址与jmp指令所在位置的距离。 那jmp指令在哪?
**********************

mov dword ptr ss:[esp],0x194C481
mov dword ptr ss:[esp+0x4],0xE9610000
mov dword ptr ss:[esp+0x8],ecx


//往[esp],写入0x194C481,再往[esp+0x4]写入0xE9610000,最后往[esp+0x8]写入ecx,ecx也就是计算后的偏移地址

0x194C481 是什么。栈有个特殊性,字节顺序是颠倒的,所以写入的是颠倒后的,再颠倒过来就是0x81C49401  字节集就是:{129,196,148,1}  汇编代码就是:ADD esp,0x194
刚刚不是sub 0x190 吗 ? 为什么  现在要add 0x194?   因为当时栈顶是返回地址,而返回地址不需要的,我们得add 0x194把栈顶的返回地址干掉,
也就是说执行完这步的时候,栈上就是原本pushad存进去的了。 那么我们怎么跳回去?
关键是后边写入的,0xE9610000  和 ecx,ecx就是刚刚计算出来的偏移地址
0xE9610000反转就是0x000061E9,  这是什么意思?   其实,前面4个0  是补充上面ADD esp,0x194 的2个字节0,也就是说ADD esp,0x194这句代码是6字节
    真正意义上,这里写入的代码是0x61E9,也就是  popad , jmp

这时候刚刚计算偏移地址为什么减去0xc就知道了   add esp,0x194  popad   这里是7字节    jmp指令所在位置就是   代码起始位置(esp)+7,  所以减去7再减去5,  就等于  减去0xc (12)

再写入ecx   最后就是 (popad  jmp ecx里边的值) 的意思

我们的栈代码就是 add esp,0x194
                           popad
                           jmp ecx的值(计算后的偏移地址)

****************
jmp esp  //跳到栈code执行。

最后完美popad并完美返回到调用处。

总结:栈code的代码得是反转后再写入,代码跟着的数值(前面用的ecx)不需要反转,因为本身就是反转的。


popad.e (3.8 KB, 下载次数: 40)

评分

参与人数 1好评 +1 精币 +2 收起 理由
zl2017 + 1 + 2 感谢分享,很给力!~

查看全部评分


签到天数: 5 天

发表于 2019-3-11 23:46:54 | 显示全部楼层   广东省珠海市
刚刚在看帖子分析时 竟不禁鼓起了掌 恰好阿姨从身后经过看到OD说了句  “你也炒股啊”   

哈哈 差点没反应过来  话说如今还保留着上古8位时代配色的软件也就炒股软件了。
回复 支持 反对

使用道具 举报

发表于 2019-2-12 18:30:30 | 显示全部楼层   山东省聊城市
感谢发布原创作品,精易因你更精彩!
回复 支持 反对

使用道具 举报

发表于 2019-2-12 18:28:23 | 显示全部楼层   山东省聊城市
感谢发布原创作品,精易因你更精彩!
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2019-2-3 08:40:31 高大上手机用户 | 显示全部楼层   湖南省岳阳市
虽然看不懂,你这6的不要不要的,加油,以后太空飞船的代码就交给你了
回复 支持 反对

使用道具 举报

结帖率:100% (9/9)

签到天数: 5 天

发表于 2019-1-30 08:38:54 | 显示全部楼层   广东省韶关市
17176qq 发表于 2019-1-29 19:17
终于找到一个比我还无聊的人了

你头像好骚啊
回复 支持 反对

使用道具 举报

结帖率:33% (2/6)
 楼主| 发表于 2019-1-29 22:34:38 | 显示全部楼层   广东省广州市
影知 发表于 2019-1-29 22:30
自己分析自己还有这种操作的

                        
回复 支持 反对

使用道具 举报

结帖率:99% (71/72)
发表于 2019-1-29 22:30:16 | 显示全部楼层   广东省深圳市
自己分析自己还有这种操作的
回复 支持 反对

使用道具 举报

结帖率:33% (2/6)
 楼主| 发表于 2019-1-29 20:29:26 | 显示全部楼层   广东省*
17176qq 发表于 2019-1-29 19:17
终于找到一个比我还无聊的人了

                        
回复 支持 反对

使用道具 举报

签到天数: 11 天

发表于 2019-1-29 20:29:15 | 显示全部楼层   广东省阳江市
高级货,下载收藏
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表