吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5673|回复: 19
收起左侧

[原创] 内嵌补丁分析和实践

[复制链接]
yaoyao7 发表于 2019-1-17 16:58
内嵌补丁,内嵌代码补丁的简称,在我们难以直接修改指定代码时,插入并运行“洞穴代码(Code Cave)”的补丁代码,实现对程序打补丁。
这种技术常用于对程序经过运行时压缩(或加密处理)而难以直接修改的情况。


原理图如下:


原理图.png

左侧是典型的运行时压缩或加密代码,EP代码先将加密的OEP代码揭秘,然后再跳转到OEP处。
如果需要打补丁的代码位于经过加密的OEP区域,是很难成功打上补丁的,这是因为解码过程中可能会解出不一样的结果。
右侧是一种简单的解决办法,在文件中另外设置称为“洞穴代码”的“补丁代码‘,EP代码解码完成后,修改JMP指令,运行洞穴代码。在洞穴代码中执行补丁代码后(此时已经揭秘OEP),
再跳转到OEP处。也就是说,每次运行时都要对进程内存的代码打补丁,所以这种打补丁的办法成为”内嵌补丁“法。
下面以一个简单的例子实践说明一下:
1,首先运行一下程序:


运行界面1.png 运行界面2.png

程序有两个弹窗,我们的目标是修改对话框中的两个字符串。

2,OD走起:


OD初始.png

我们可以很清楚地看到,有两个字符串很怪,明显是经过处理了。
而且EP代码十分简单,而在401007之后是加密代码。看一下字符串:

被加密了字符串.png

都被加密了,在这个时候我们是无法通过普通的方法找到指定字符串的
3,跟踪进入401001处的CALL,进入4010E9,然后继续进入CALL看下:


44异或解密代码.png

我们在这里看到了一个循环体,这是一段解密循环。
004010A3  |> /8033 44       /XOR     BYTE PTR DS:[EBX], 44           ;  对4010f5-401248的数据进行与44的异或解密
然后跟踪进入4010B3的CALL:


另外两个循环.png

在这里我们看到了另外两个解密循环,
004010C8  |> /8033 07       /XOR     BYTE PTR DS:[EBX], 7            ;  对401007-401086的数据进行与7的异或解密

004010DB  |> /8033 11       XOR     BYTE PTR DS:[EBX], 11            ;  对4010f5-401248的数据进行与11的二次异或解密



尤其是第三个解密循环,这里的解密区域与第一个解密循环的区域是一样的,这说明这段空间的数据进行了双重加密处理。
4,执行完三个解密循环后,通过4010B6的CALL进入401039:

校验和计算.png

在这里我们需要注意,这里在401046地址处有校验和计算的循环,这是从4010F5~401248的区域每次读入4个字节,进行数值加法运算,
累加结果保存在EDX寄存器。循环结束,EDX中保存校验和值。
根据前面的过程我们容易知道,4010F5~401248的区域是一个双重加密区域,我们需要修改的字符串就在这里
401062-401068处的CMP/JE命令将校验和(EDX)与31EB8DB0做对比,相同这说明代码没有被改动,然后JMP到OEP,不同这输出错误信息。
5,进入OEP:


OEP代码.png

这里需要注意40123E处的调用DialogBoxParamA(),它的结构大家可以上网查一下,我们需要关注它的第四个参数lpDialogFunc用来指出Dialog Box Procedure的地址。
我们可以看到这行代码的上面就是push 4010F5,所以第四个参数DlgProc(OD中的表示)的地址为4010F5.
6,进入4010F5查看:

4010F5.png

我们看到了我们需要修改的字符串
7,OK,原理和程序流我们都清楚了,接下来开始打补丁:
首先是选择补丁代码的位置,这里我放在第一个节区(.text)
位置选择:使用LordPE看到.text的SizeOfRAW为400,VirtualSize为280,那么区域680~800是没有被使用的,我们可以放在这里。
重新调试程序,运行到OEP(40121E):

OEP空白部分.png


401280(680-400+1000)处为空白区域,在此处我们填入补丁代码:
[Asm] 纯文本查看 复制代码
mov ecx,0c
mov esi, 004012a8
mov edi,00401123
rep movs ptr es:[edi], byte ptr ds:[esi]
mov ecx,9
mov esi,004012b4
mov edi,0040110a
rep movs ptr es:[edi], byte ptr ds:[esi]
jmp 0040121e



然后在4012a8与4012b4处放入我们要修改的字符串:“ReverseCore”,"Unpacked"


补丁代码.png

8,最后一步:直接修改文件以运行创建的补丁代码
我们前面知道在401083处有JMP 40121E,40121E是我们的OEP代码,所以修改这条JMP到我们的补丁代码地址就可以了
需要注意的是,401083位于原来的加密区域,也就是说直接打开二进制文件看到的是加密后的数据


401083加密数据.png

解密是 XOR 7,那么我们再COR 7回去就可以了:
也就是E9 F8 01与7异或,得到EE FF 06,这个才是正确的跳转到我们补丁代码地址的指令数据,写入,验证:

修改后二进制文件.png



验证1.png

验证2.png

OK,搞定~

过程中涉及到的一些位置定位需要大家亲自动手计算一下,温故知新嘛,就当稳定基础了~
(附件中是源程序,大家可以动手试一试)
unpackme#1.aC.zip (1.72 KB, 下载次数: 12)

免费评分

参与人数 2吾爱币 +7 热心值 +2 收起 理由
Hmily + 6 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
wangxp + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| yaoyao7 发表于 2020-2-20 10:12
xueeee 发表于 2020-2-19 21:38
楼主我想问你一下 一个辅助的破解问题可可9.5的验证有动态数据 有个破解版的 我想学习这个人怎么破解的 他 ...

这种我个人不应该根据DLL来判断,要看这个DLL具体做了什么。如果是运行时替换掉了程序自身的函数或着流程,属于HOOK更改执行流;如果是修改程序自身的某些代码或者参数值,属于补丁。补丁和HOOK不是两类,补丁里也会用到HOOK。
xueeee 发表于 2020-2-19 21:38
楼主我想问你一下 一个辅助的破解问题可可9.5的验证有动态数据 有个破解版的 我想学习这个人怎么破解的 他不是打的补丁 是把辅助变成DLL 他编写的EXE打开会加载辅助 然后辅助就运行了 随便输入密码就可以用了~ 这是什么方法?也属于补丁把?还是HOOK?
dongfang155 发表于 2019-1-17 17:34
bester 发表于 2019-1-17 18:37
这个跟SMC(self-Modifying Code)代码自修改有什么区别?
沉浮2018 发表于 2019-1-18 06:59
谢谢,学习了
whyida 发表于 2019-1-18 07:28
SMC动态补丁。                                 
 楼主| yaoyao7 发表于 2019-1-18 09:09
bester 发表于 2019-1-17 18:37
这个跟SMC(self-Modifying Code)代码自修改有什么区别?

这个本质上是一样的
 楼主| yaoyao7 发表于 2019-1-18 09:10

对,只是称呼不一样
 楼主| yaoyao7 发表于 2019-1-18 09:12

技术是一样的,只是称呼不一样
bester 发表于 2019-1-18 09:36
yaoyao7 发表于 2019-1-18 09:09
这个本质上是一样的

这个技术现在基本用不上,压缩壳基本秒脱,加密壳有md5自校验,smc跟内存补丁根本没法比啊,不过知道有这么一个玩法还是可以的,应用范围真的很低很低
whyida 发表于 2019-1-18 11:21
yaoyao7 发表于 2019-1-18 09:10
对,只是称呼不一样

SMC对压缩壳有用,对加密壳无效。现在用的很少了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 16:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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