windows软件进行反汇编修复流程
本文以Crackme160为例子,示例文件都在该例子中https://gitee.com/cnhellorui/Crackme160
节一:x64dbg逐步调试修复
前言与总结
该节里只需x64dbg即可,windows 7和windows 10,xp都可以。
该节中修复掉那个弹框关键做法:找到关键call,找到关键跳。
找到关键call的目的是:确定你所看到的那个弹框或者事件,在反汇编代码的哪个位置发生的,那么你知道那个事件在哪里发生的后,你所想要修复的逻辑就在他的附近。幸运汇编语言按行一条一条执行,找到那个关键call后,那个逻辑一般就在它的关键call的前面几行。
确定逻辑的大概位置后,我们不需要过于了解反汇编中的每个细节,只需要知道关键跳如jmp,je,jne,test,cmp
这些的比较指令。因为这些关键跳工作后,会修改ZF这种标志位寄存器。
那么其他的程序会根据这个修改后的ZF标志位寄存器,从而跳转到指定位置。
我们着手去修改这些关键跳后,让它不跳转到那些不想要的弹框和事件后就可以完成反汇编修复了。
示例
首先我们自己打开运行该需要修复的可执行软件(开始就打开只能在修改程序中用,在病毒和未知软件检查的时候不能冒然打开软件)。
打开软件后,我们发现需要killme第一个窗口。
这时直接将该软件拖入x64dbg中,显示成如下界面。
首先使用简单粗暴的方式,一步一步调试下去,像调试一个Java业务逻辑代码一样,只是它是汇编而已,直到出现hello you have to kill me
那个弹框(是的,反编译修复软件就是这样繁琐,需要有耐心)。
不断的步过(step over)调试,我们发现到如下图的关键call,执行完了这个关键call后出现了hello you have to kill me
那个弹框。那么我们需要在这里加一个注释和断点提示自己。
在关键call也就是0042FD97位置附近没有发现有关键跳(类似je, test, cmp这种比较语句)。那么我再需要进入到这个call的函数里面。再次寻找。
如上图进入函数后,再次不断的执行到关键call,检查这里的关键call。该关键call附近依然没有关键跳(就是一些标志的生成汇编指令)。再次进入这个关键call的函数里,然后再一步一步的调试下去。
然后再次到达位置0042563D的关键call,我们找一下关键跳,竟然发现就在它的前四行,我们发现到了关键跳je acid burn.425643
。
此时从强大的x64dbg上能够看到它的跳转方向,可以到达地址00425643位置。那么为了进一步验证是否可以跳转。我们重新运行调试到这个关键跳位置,尝试修改一下ZF标志位寄存器数据,检测是否是关键跳。
如上图重新修改了标志位后,是可以不跳转到hello you have to kill me
那个弹框。那么我们就验证了该je
是我们所想要的关键跳,为了保障这个软件以后也不走这个弹框,我们修改一下汇编代码,让它不用验证ZF标志位寄存器的值,直接跳转到指定位置。
修改方式如下图所示。
如上图选择位置,鼠标右击对其汇编,je改成jmp。jmp acid burn.425643
。那么将修改的文件另存位新的一个可执行文件。
鼠标右键,选择补丁,然后修补文件,填写名称,后缀名改为exe即可。
我们可以运行一下看看,软件没有hello you have to kill me
出现那个弹框了。
节二:IDA Pro协助下快速找到大概的逻辑位置,x64dbg再验证并修复
在上一节中,我们只使用了x64dbg一步一步的跟踪,找到大概的逻辑位置,也就是关键跳和关键call。在本节中,IDA pro的加入帮助我们快速找到关键跳和call的大概位置。
首先打开待修复的软件,还是先运行到我们所期待功能处,并随意填写一些内容。如下图显示,显示Failed失败弹框。现在我们要做的是,让它弹出来一个成功的弹框。
通过功能分析后,将该软件拖入IDA中,根据弹框中的Failed和Try Again提示的字符串进行搜索,确定该字符串在代码中的位置。如下图显示是IDA显示Strings窗口。
在Strings窗口中找到了Failed或者Try again字符串后,双击进去;然后可以看到该字符串在汇编中是数据段来表示的。
查看这些数据段被哪些汇编代码所引用的就知道了Failed在汇编代码逻辑的位置了。 ctrl + x 快捷键是查找交叉引用的快捷键。
双击进去找到了所在汇编逻辑代码的位置。小技巧:space快捷键是显示和关闭下图的结构性的汇编,选择Options -> Disassembly -> line prefixes是显示行号的。
下面是简要步骤总结
Strings
找到Failed, ctrl + x交叉引用,找到所在代码的位置
关键call函数
CODE:0042F470 _Tserial_button1Click proc near
关键call可以改变标志位寄存器ZF
CODE:0042F4D0 call sub_4039FC
从而影响 关键跳 会跳转到哪里
关键跳
CODE:0042F4D5 jnz short loc_42F4F1
成功
CODE:0042F4D7 push 0 ; uType
失败
CODE:0042F4F1
x64dbg修复
IDA完成了大致逻辑分析后,需要采用x64dbg进行修复与验证。
根据上面的简要步骤里总结的关键call和关键跳,以及成功和失败的地址,在x64dbg中找到对应的位置,然后下断点进行逐一调试(调试方法跟节一中一样,只是加了这些断点后能够直接运行到断点处了)。
根据如下图,我们可以发现到关键call函数是修改ZF标志位寄存器的。在自己的测试中,可以点进去看看里面的逻辑。
我这里采用的方式不管,关键call函数如何对比,将关键跳给nop掉,直接nop掉,让它持续性的往下走。
然后再补丁,然后点击修复文件,最后产生新的修复后的可执行文件。
windows软件进行反汇编修复流程相关推荐
- 安利7款珍藏已久的windows软件,每一个都非常强大
给大家精心分享7款我珍藏已久windows软件,直接上干货! 1.智办事(全平台) 智办事是一款基于阿里工作方法论的目标管理协作软件,可以提升团队效率,敏捷管理,降低管理成本,打造超强的个人和团队执行 ...
- 推荐7款超良心的windows软件,每一个都是精品!
安利7款使用已久的windows软件,每一个都是精品,可以解决很多问题,让电脑更好用. 1.格式工厂 格式工厂是一款办公利器,可以转换几乎所有类型多媒体格式,还有文件压缩.图片处理.视频文件修复.文件 ...
- Windows XP Professional系统修复的操作方法
实践证明,修复功能基本上行不通:还得重装系统. Windows XP Professional系统修复的操作方法: 1.使用Windows XP系统修复功能时,重新启动电脑,将Windows XP系统 ...
- android记账软件开发源代码_如何开发直播软件?直播软件开发的具体流程有哪些?...
知乎视频 随着互联网的发展和智能手机的迅速普及,对直播软件的需求也在增加.开发直播软件和直播app开发都属于直播软件开发的服务.那么直播平台的发展过程是怎样的呢?在软件开发期间需要注意什么?小编来说 ...
- windows功能_这 12 个好用 Windows 软件,让你也能用上 macOS 的独占功能
在离开 macOS 这段时间,每天在家依赖 Windows To Go 为生,感到日常工作流程在四处冒烟.这才发现 macOS 的有些特性就如同空气一样,虽然毫无存在感,却不可缺失. 关于「如何在 W ...
- 如何在Linux上运行Windows软件?
因此,您已经准备好过渡到Linux ,但是您仍然有一些程序还不十分乐于使用. 您仍然可以在Linux上运行Windows软件吗? 答案可能是肯定的,但是有一些警告. 在继续之前,我想作一个重要的区分. ...
- windows保护无法启动修复服务器,如何解决win10“Windows资源保护无法启动修复服务”错误 | MOS86...
Win10现在将成为您的数字生活的一部分.在Win10专门开发的所有功能和增强,事实上,非常有吸引力.其主要功能之一是系统文件检查程序或SFC.这主要用于对PC的完整文件系统进行彻底扫描.这可以很容易 ...
- 用 Windows 的 diskpart 命令修复U盘
用 Windows 的 diskpart 命令修复U盘 有时用一些软件处理过的U盘在Windows资源管理器中看不到了(比如用Win32 Disk Imager 或 Fedora Media Writ ...
- 2-1 windows软件 --- x-shell/seurecrt/puty
2019独角兽企业重金招聘Python工程师标准>>> 2-1 windows软件 --- x-shell/seurecrt/puty 更新历史 20150105,10:22,v1. ...
最新文章
- Windows 2000和WindowsXP中神秘的数字签名
- HDU 2504 又见GCD
- opencv对应python版本_【求问各位大佬python3.6怎么使用opencv,用哪个版本】python3 opencv...
- a data source instance has not been supplied for the datasource 'dataset1'. rdlc
- 片偏移字段的值怎么算_搞懂钢丝网片计算原理,怎么算都不怕出错!
- git忽略文件【转】
- effective c++条款11扩展——关于拷贝构造函数和赋值运算符
- MacPort 的使用
- MySQL主从复制的原理及配置方法(比较详细)
- pandas dataframe 如何把带有千位分隔符的字符串转化为浮点数
- Android第十七课 Jni string空串跨模块使用崩溃注意事项
- 神州数码交换机配置基本命令
- int content=Integer.parseInt(jtf.getText().trim());
- 全球及中国图书出版发行业营销策略与运行前景分析报告2022版
- 14 POJ3363 Annoying painting tool
- 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的8种坑
- 2019人工智能企业100强
- Oracle 中常用的字符串函数总结
- 深度学习之BatchNorm(批量标准化)
- 随机从长度未知的数组中抽取数字,且保证每个元素被抽到的概率相同