反汇编程序导致程序crash的解决思路
曾经发现win7下程序基地址不停地变动,又发现下移代码会导致程序crash,一度怀疑win7系统或者vs编译器是不是做了什么校验机制,专门针对数据逆向者,限制反汇编修改代码,打断了我学习外挂编写的信心和脚步,后来在一骗博客中解决了基地址不停地变动的问题,现在一块儿看看这个下移代码导致程序crash的问题,首先写个测试工程,VS2008,Debug版,就有一对话框,点击按钮相应代码如下:
void CttDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
__asm mov eax,eax
if (mint==1)
{
AfxMessageBox(_T("1111"));
}
else
{
AfxMessageBox(_T("2222"));
}
}
内嵌汇编是方便反汇编定位时用的,比较方便
看看这个成员按钮响应函数的反汇编:
00412D0C CC int3
00412D0D CC int3
00412D0E CC int3
00412D0F CC int3
00412D10 > 55 push ebp
00412D11 8BEC mov ebp,esp
00412D13 81EC CC000000 sub esp,0xCC
00412D19 53 push ebx
00412D1A 56 push esi
00412D1B 57 push edi
00412D1C 51 push ecx
00412D1D 8DBD 34FFFFFF lea edi,dword ptr ss:[ebp-0xCC]
00412D23 B9 33000000 mov ecx,0x33
00412D28 B8 CCCCCCCC mov eax,0xCCCCCCCC
00412D2D F3:AB rep stos dword ptr es:[edi]
00412D2F 59 pop ecx
00412D30 894D F8 mov dword ptr ss:[ebp-0x8],ecx
00412D33 8BC0 mov eax,eax
00412D35 8B45 F8 mov eax,dword ptr ss:[ebp-0x8]
00412D38 8378 78 01 cmp dword ptr ds:[eax+0x78],0x1
00412D3C 75 10 jnz short tt.00412D4E
00412D3E 6A 00 push 0x0
00412D40 6A 00 push 0x0
00412D42 68 F0CE4100 push tt.0041CEF0 ; UNICODE "1111"
00412D47 E8 5FE7FFFF call tt.004114AB
00412D4C EB 0E jmp short tt.00412D5C
00412D4E 6A 00 push 0x0
00412D50 6A 00 push 0x0
00412D52 68 E4CE4100 push tt.0041CEE4 ; UNICODE "2222"
00412D57 E8 4FE7FFFF call tt.004114AB
00412D5C 5F pop edi
00412D5D 5E pop esi
00412D5E 5B pop ebx
00412D5F 81C4 CC000000 add esp,0xCC
00412D65 3BEC cmp ebp,esp
00412D67 E8 16E8FFFF call tt.00411582
00412D6C 8BE5 mov esp,ebp
00412D6E 5D pop ebp
00412D6F C3 retn
00412D70 CC int3
00412D71 CC int3
00412D72 CC int3
00412D73 CC int3
测试1:把最后retn指令后面的几个int3改为NOP指令,保存文件,双击执行看看程序是否运行正常
结果:正常运行
猜想:VS应该没有做反汇编方面的限制,否则程序应该crash
测试2:把下面几个指令下移(空出来的位置用NOP填充)
00412D6C 8BE5 mov esp,ebp
00412D6E 5D pop ebp
00412D6F C3 retn
结果:正常运行
猜想:vs和win7应该没有做限制吧,最少限制没有那么绝,但是自己反汇编修改代码的时候经常会导致程序crash又是什么原因呢,难道是堆栈平衡,应该不是吧,只是下移代码,又没有缺少什么指令,继续看测试3
测试3:把00412d3c地址后的指令下移(具体操作:选中下移代码->二进制复制->选中下移目标区域->二进制填充->二进制粘贴)得到的代码:
00412D0E CC int3
00412D0F CC int3
00412D10 > 55 push ebp
00412D11 8BEC mov ebp,esp
00412D13 81EC CC000000 sub esp,0xCC
00412D19 53 push ebx
00412D1A 56 push esi
00412D1B 57 push edi
00412D1C 51 push ecx
00412D1D 8DBD 34FFFFFF lea edi,dword ptr ss:[ebp-0xCC]
00412D23 B9 33000000 mov ecx,0x33
00412D28 B8 CCCCCCCC mov eax,0xCCCCCCCC
00412D2D F3:AB rep stos dword ptr es:[edi]
00412D2F 59 pop ecx
00412D30 894D F8 mov dword ptr ss:[ebp-0x8],ecx
00412D33 8BC0 mov eax,eax
00412D35 8B45 F8 mov eax,dword ptr ss:[ebp-0x8]
00412D38 8378 78 01 cmp dword ptr ds:[eax+0x78],0x1
00412D3C 90 nop
00412D3D 75 10 jnz short tt2.00412D4F
00412D3F 6A 00 push 0x0
00412D41 6A 00 push 0x0
00412D43 68 F0CE4100 push tt2.0041CEF0 ; UNICODE "1111"
00412D48 E8 5FE7FFFF call tt2.004114AC
00412D4D EB 0E jmp short tt2.00412D5D
00412D4F 6A 00 push 0x0
00412D51 6A 00 push 0x0
00412D53 68 E4CE4100 push tt2.0041CEE4 ; UNICODE "2222"
00412D58 E8 4FE7FFFF call tt2.004114AC
00412D5D 5F pop edi
00412D5E 5E pop esi
00412D5F 5B pop ebx
00412D60 81C4 CC000000 add esp,0xCC
00412D66 3BEC cmp ebp,esp
00412D68 E8 16E8FFFF call tt2.00411583
00412D6D 8BE5 mov esp,ebp
00412D6F 5D pop ebp
00412D70 C3 retn
00412D71 90 nop
00412D72 90 nop
00412D73 90 nop
00412D74 90 nop
00412D75 90 nop
00412D76 90 nop
00412D77 90 nop
00412D78 90 nop
00412D79 CC int3
结果:程序crash
猜想:妹的,小弟瞬间崩溃,为什么这个就会崩溃呢?
解决:一步一步调试发现程序崩溃在一个call函数上边,仔细观察发现call函数的地址变了,代码下移之后call函数地址也随之加一,这不胡扯吗?Call函数实际调用的是afxmessagebox函数,这是API,地址应该是不会变的,下移部分代码,里面的call的地址会发生变化,这个还真没注意到,以前知道跳转指令的地址可能会发生变化,因为有的跳转的是绝对地址,有的跳转的是相对偏移,所以移动跳转指令的时候一定要注意移动之后的代码跳转的位置是否和移动之前的一致,这个call应该是call的绝对地址啊,怎么会有改变呢?暂时不知道,不过先改过来再说,把两个call地址都改回原来的之后程序正常运行。
反汇编程序导致程序crash的解决思路相关推荐
- 关于keil MDK调整优先级程序出错的解决思路
先说一下标准:一个好的工程,基本可以做到IDE所有优化等级通吃. 关于优化和调试的问题:只要开启优化哪怕O1也不具备调试的意义了(因为变量可能在寄存器中而不是在RAM中),只能通过串口打印的方式查看变 ...
- 挂载错误导致无法正常开机解决思路
一.问题描述 在项目部署现场时候,启动centos7.3时候,卡在启动界面,按F1时候,提示Error getting authority: Give root password for mainte ...
- Android程序闪退解决思路
这几天在做Android程序的实验,完全新手,遇到一些问题,其中最让人头疼的是程序闪退,相信很多人都有点感觉无从下手,特地分享一下我的经验. 首先,做了一个程序,在模拟器上运行,显示 " * ...
- 关于CALayer导致的crash问题
push到一个页面进行绘图时,设置如下: CALayer * layer = [CALayer layer]; layer.frame = CGRectMake(0, 0, 300, 300); la ...
- Android程序crash处理
转载请注明出处: http://blog.csdn.net/allen315410/article/details/41444053 在实际项目开发中,会出现很多的异常直接导致程序crash掉,在开 ...
- 定位程序Crash常用工具和方法
一.引言 任何程序正确则只有一种结果,但是错误却有千万种,而众多的错误有些是可容忍,有些则是致命的,如除零错误.堆栈溢出.内存越界等导致程序Crash.由于很多错误并不是发生在开发工作者调试阶段,而是 ...
- ios开发遇到的memory持续上涨导致页面crash解决思路总结
我在IOS遇到过的闪退主要分为程序启动完Lanch page在初始化页面就崩溃,和在程序运行中crash两种: 后者我遇到的情况是memory占用过多,被系统kill掉了一部分正在占用的内存,导致程序 ...
- 无盘服务器0x00000124,知识分享电脑故障0x00000124导致蓝屏的原因和解决思路-电脑蓝屏原因...
电脑知识分享电脑故障0x00000124导致蓝屏的原因和解决思路 电脑知识分享 电脑故障0x00000124导致蓝屏的原因和解决思路 电脑知识分享 电脑知识分享:蓝屏的原因和解决思路 蓝屏出错代码的缘 ...
- 小程序网络最大并发限制解决思路
小程序关于request请求的限制 默认超时时间和最大超时时间都是 60s request.uploadFile.downloadFile 的最大并发限制是 10 个 网络请求的 referer he ...
最新文章
- python20191031_20191031:Python取反运算详解
- 开机秒全国99%电脑 实战UEFI安装Win8
- mysql的topsql_TOP SQL监控之MySQL篇
- 汇编语言(三)之判断数值是否大于42H并统计个数
- 哈工大博士历时半年整理的《Pytorch常用函数函数手册》开放下载!内含200余个函数!...
- OpenStack精华问答 | OpenStack的网络类型有哪些?
- Caffe框架详细梳理
- java linq select_Java 8是否还需要LINQ?还是已经比LINQ 更好?
- (经典中的经典!)IT学生解惑真经(转),真会有人看完这15万字吗
- php 左侧飘浮广告代码,JS随机漂浮广告代码具体实例
- linux安装CUPS详细教程,ubuntu安装打印机CUPS
- JNPF快速开发平台-业务流程系统(BPM)开发方案
- HC05蓝牙模块AT指令与手机蓝牙控制STM32板载LED
- SolidWorks 2023软件安装教程SW2023软件安装包
- stdin, stdout, stderr
- 前端通过后端返回文件流下载文件
- 开发笔记--项目部署到linux服务器
- Spring Boot与Elasticsearch的对应版本
- 【Tips】史上最全H1B问题合辑——保持H1B身份终级篇
- C++一本通题库1024
热门文章
- 循环控制_continue语句
- [坑] IDEA Unable to import maven project 解决办法
- springboot No Java compiler available for configuration options compilerClassName
- FastDFS在项目中的应用
- android按钮点击后闪退_Android开发【04-27求助贴】点击button闪退
- mongodb语法与spring实现
- 【报错笔记】使用MultipartFile 出现异常:java.lang.ClassNotFoundException: org.apache.commons.fileupload...
- git遇到的问题-- Another git process seems to be running in this repository
- chapter3.1封装和解构
- 达梦数据迁移工具的使用