• 抬起头,继续前进吧,去把这个不完美的故事,变成你成所期望的样子
  • 登山路上我们会放弃很多东西,但这些被我们丢掉在我们登上山顶之际,都会一一回来
  • 不论开发还是逆向,数学水平的高低直接决定了”你的饭碗里有没有肉”
  • 万丈高楼平地起,勿在浮沙筑高台

逆向常用调试技术练习-内嵌补丁的使用

安全 菜鸟 8个月前 (12-01) 5942次浏览 已收录 0个评论
[隐藏]

一、前言

        学了那么久的汇编和 PE 文件格式,今天我们来做一个简单的练习,使用下内嵌补丁技术。
        什么是内嵌补丁,简单介绍下,就比如说程序的实际代码被加密了,程序在装载到内存后先执行解密代码,然后在跳到 OEP,而内嵌补丁就是修改解密代码执行后的那个 jmp 指令,先跳到我们想要执行的代码,然后再跳到 OEP。
废话不多说了,开始动手吧。(由于流量原因传的中等尺寸,如果看不清的话可点击查看大图)

系统: Win7 SP1
工具:IDA 7.0 OllyDbg 1.1.0
目标程序:unpackme.exe
逆向常用调试技术练习-内嵌补丁的使用
逆向常用调试技术练习-内嵌补丁的使用
要求:修改 Status 的字符串显示

二、动手实践

1. 调试分析

用 IDA 打开目标程序,看到 main 函数里就一个 callsp-analysis failed 表示没有平栈)
图 1:
逆向常用调试技术练习-内嵌补丁的使用
跟到 0x4010E9,又一个 call,压入了一个地址 0x4010F5
图 2:
逆向常用调试技术练习-内嵌补丁的使用
跟到 0x40109B,发现从 0x4010F5 位置开始按字节与 0x44 做异或,大小为 0x154(即 0x4010F5-0x401249)
图 3:
逆向常用调试技术练习-内嵌补丁的使用
我们跳到 0x4010F5 看一下,猜测应该是某段加密后的数据(如果觉得不方便,也可转成 db)
图 4:
逆向常用调试技术练习-内嵌补丁的使用
接着回到 0x40109B,继续向下,调用了两个 call,地址分别为 0x4010BD 和 0x401039
图 5:
逆向常用调试技术练习-内嵌补丁的使用
先看 0x4010BD,从 0x401007 位置开始按字节与 7 做异或,大小为 0x7fh(即 0x401007-0x401086)
图 6:
逆向常用调试技术练习-内嵌补丁的使用
我们看下 0x401007,由于 0x401039 有被 call 调用执行,所以 IDA 先帮我们将其解释为代码,即从 0x401039 开始是一部分加密的代码(0x401038 应该也是上面数据的一部分,有强迫症的可以先取消它的代码解释)
图 7:
逆向常用调试技术练习-内嵌补丁的使用
回到 0x4010BD 的代码段,继续向下,又是对从 0x4010F5 位置开始大小为 0x154 的块做操作,不过这次是与 0x11 做异或
图 8:
逆向常用调试技术练习-内嵌补丁的使用
回到 0x40109B 后,继续向下就是压入 0x4010F5,然后调用 0x401039
由于菜鸟水平有限,还不会写 IDA 脚本,这里先转到 OllyDBG 吧。(尴尬…),直接跳到 0x401039,
图 9:
逆向常用调试技术练习-内嵌补丁的使用
然后 F4,发生了变化。
第一个箭头处,是对 0x4010F5 大小为 0x154 的块按 4 字节相加,然后第二个箭头处是比对。
校验成功则跳到下面,也就是防止有更改代码的行为
图 10:
逆向常用调试技术练习-内嵌补丁的使用
图 11:
逆向常用调试技术练习-内嵌补丁的使用
图 10 中间有段压入 0x40124A 和 0x401280,然后调用 0x40108A
就在我们目前位置的下面,我们直接过去看,就是将一个指定范围的块按字节与 0x17 做异或。
图 12:
逆向常用调试技术练习-内嵌补丁的使用
我们直接执行到 cmp edx, 31EB8DB0 的位置,也就是执行完 0x40108A 的子程序,看到 OllyDBG 的显示发生了变化(对比图 11)
这里我们可以确定 0x40124A-0x401280 原本应该一个加密后的 IAT 表,而 0x40108A 就是 IAT 表解密函数
图 13:
逆向常用调试技术练习-内嵌补丁的使用
由于我们没有修改过代码,所以校验是肯定成功的,我们继续向下跳到 0x40121E,看到了程序的真正代码
图 14:
逆向常用调试技术练习-内嵌补丁的使用
在下面是 0x40124A-0x401280,确实是一个 IAT 表
图 15:
逆向常用调试技术练习-内嵌补丁的使用
真正的程序代码使用 DialogBoxParamA 这个 API,第 4 个参数了 0x4010F5 进入,代码如下
图 16:
逆向常用调试技术练习-内嵌补丁的使用
图 17:
逆向常用调试技术练习-内嵌补丁的使用
这就是那两个对话框的代码,也找到了要修改字符串的位置,0x40110A。

2. 信息总结

地址描述
0x4010F5-0x401249程序真正的代码块
0x40109B对真正的代码块进行第一层解密
0x401039-0x401086校验与修复 IAT 表的代码块
0x4010BD解密校验与修复 IAT 表的代码块,对真正的代码块进行第二层解密
0x40121E程序真正入口点
0x40110A目标字符串地址

3. 编写补丁代码

        现在我们要做的就是修改 0x40110A 的数据,由于内存对齐的原因,我们看到 0x401280 到 0x402000 都是空的,可以在这里填写我们的代码,然后保存回文件。
逆向常用调试技术练习-内嵌补丁的使用

4. 修改执行流程

找到最后的 jmp 指令位置 0x401083,我们将其改为 jmp 00401284,即 E9 FC 01
由于之前是按字节与 0x7 做异或操作进行加密,那我们也进行异或操作,得到 EE FB 06,直接修改,然后保存
逆向常用调试技术练习-内嵌补丁的使用

5、结果测试

重新运行保存后的程序,结果如下:
逆向常用调试技术练习-内嵌补丁的使用

三、小结

        这只是个小小的简单动手练习,不过也让我们再次加深了认识:对于计算机来说数据和代码都是一样的,只是我们人为的将其做了区分。
        如果有额外时间的话,大家也可以写个程序来实现,提高效率。
        那就先这样啦,Happy coding~^_^


学习心得 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明逆向常用调试技术练习-内嵌补丁的使用
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址