本文以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软件进行反汇编修复流程相关推荐

  1. 安利7款珍藏已久的windows软件,每一个都非常强大

    给大家精心分享7款我珍藏已久windows软件,直接上干货! 1.智办事(全平台) 智办事是一款基于阿里工作方法论的目标管理协作软件,可以提升团队效率,敏捷管理,降低管理成本,打造超强的个人和团队执行 ...

  2. 推荐7款超良心的windows软件,每一个都是精品!

    安利7款使用已久的windows软件,每一个都是精品,可以解决很多问题,让电脑更好用. 1.格式工厂 格式工厂是一款办公利器,可以转换几乎所有类型多媒体格式,还有文件压缩.图片处理.视频文件修复.文件 ...

  3. Windows XP Professional系统修复的操作方法

    实践证明,修复功能基本上行不通:还得重装系统. Windows XP Professional系统修复的操作方法: 1.使用Windows XP系统修复功能时,重新启动电脑,将Windows XP系统 ...

  4. android记账软件开发源代码_如何开发直播软件?直播软件开发的具体流程有哪些?...

    知乎视频​ 随着互联网的发展和智能手机的迅速普及,对直播软件的需求也在增加.开发直播软件和直播app开发都属于直播软件开发的服务.那么直播平台的发展过程是怎样的呢?在软件开发期间需要注意什么?小编来说 ...

  5. windows功能_这 12 个好用 Windows 软件,让你也能用上 macOS 的独占功能

    在离开 macOS 这段时间,每天在家依赖 Windows To Go 为生,感到日常工作流程在四处冒烟.这才发现 macOS 的有些特性就如同空气一样,虽然毫无存在感,却不可缺失. 关于「如何在 W ...

  6. 如何在Linux上运行Windows软件?

    因此,您已经准备好过渡到Linux ,但是您仍然有一些程序还不十分乐于使用. 您仍然可以在Linux上运行Windows软件吗? 答案可能是肯定的,但是有一些警告. 在继续之前,我想作一个重要的区分. ...

  7. windows保护无法启动修复服务器,如何解决win10“Windows资源保护无法启动修复服务”错误 | MOS86...

    Win10现在将成为您的数字生活的一部分.在Win10专门开发的所有功能和增强,事实上,非常有吸引力.其主要功能之一是系统文件检查程序或SFC.这主要用于对PC的完整文件系统进行彻底扫描.这可以很容易 ...

  8. 用 Windows 的 diskpart 命令修复U盘

    用 Windows 的 diskpart 命令修复U盘 有时用一些软件处理过的U盘在Windows资源管理器中看不到了(比如用Win32 Disk Imager 或 Fedora Media Writ ...

  9. 2-1 windows软件 --- x-shell/seurecrt/puty

    2019独角兽企业重金招聘Python工程师标准>>> 2-1 windows软件 --- x-shell/seurecrt/puty 更新历史 20150105,10:22,v1. ...

最新文章

  1. Windows 2000和WindowsXP中神秘的数字签名
  2. HDU 2504 又见GCD
  3. opencv对应python版本_【求问各位大佬python3.6怎么使用opencv,用哪个版本】python3 opencv...
  4. a data source instance has not been supplied for the datasource 'dataset1'. rdlc
  5. 片偏移字段的值怎么算_搞懂钢丝网片计算原理,怎么算都不怕出错!
  6. git忽略文件【转】
  7. effective c++条款11扩展——关于拷贝构造函数和赋值运算符
  8. MacPort 的使用
  9. MySQL主从复制的原理及配置方法(比较详细)
  10. pandas dataframe 如何把带有千位分隔符的字符串转化为浮点数
  11. Android第十七课 Jni string空串跨模块使用崩溃注意事项
  12. 神州数码交换机配置基本命令
  13. int content=Integer.parseInt(jtf.getText().trim());
  14. 全球及中国图书出版发行业营销策略与运行前景分析报告2022版
  15. 14 POJ3363 Annoying painting tool
  16. 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的8种坑
  17. 2019人工智能企业100强
  18. Oracle 中常用的字符串函数总结
  19. 深度学习之BatchNorm(批量标准化)
  20. 随机从长度未知的数组中抽取数字,且保证每个元素被抽到的概率相同

热门文章

  1. epoll EPOLLOUT事件未触发
  2. ANSI环境下支持多语言输入的单行文本编辑器 V0.01
  3. c语言程序设计教程北京大学,C语言程序设计教程北京大学第章ppt课件.ppt
  4. CFT50首席经济学家杨涛:认识金融科技的价值逻辑
  5. 网络中的各层与http、https等协议
  6. 专访“澳洲中本聪”:我打算用钱摧毁比特大陆
  7. 泰克示波器校准显示无校准文件怎么办?
  8. 周立发的 Linux 视频讲座(VeryCD下载)
  9. 全志平台设备固件升级的方法
  10. 负数与无符号数的转变