内嵌补丁练习
参考资料:《逆向工程核心原理》20章。
样本:找了很久,网上基本没人发到网上,发了的都是要钱的(难受),只不过还是在吾爱破解注册了个号下载下来了(花了19块,QAQ)。所以这里给一个我的百度网盘连接给所有爱学习的人https://pan.baidu.com/s/1GlrUwfRX1aMBDLr54B1iLQ 提取码yeah
目的:通过内嵌补丁来修改样本中的两个字符串。
什么叫内嵌补丁
先给一张图
大概意思就是,有些时候我们不能直接改代码,可能是因为代码被加密了,或者有其他一些检查,于是我们就需要通过插入补丁代码,让程序运行同时,也运行我们的补丁,然后这个补丁就可以来修改代码(这个样本就是通过修改解密后的代码达到修改字符串的目的)。
分析样本
先打开文件,会跳出这两个窗口,我们就是要改变这两个窗口的字符串
然后放入x32dbg分析,先f9来到EP处
然后跟进call unpackmecrc.4010E9这个函数,进去后再跟进call unpackmecrc.40109B这个函数,也就来到了解密函数。
可以先看看经过两次解密后004010F5–00401249大概是什么内容,可以看到窗口出现的字符串。
然后继续跟,来到call unpackmecrc.401039这个函数,这个函数是已经被解密了的。
跟进去看会发现是一个Crc效检。
-
然后先看看解密出来的0040124A–401280
来到OEP处,有一个关键的函数
先来看看这个函数DialogBoxParamA()
INT_PTR DialogBoxParamA(
HINSTANCE hInstance,
LPCSTR lpTemplateName,
HWND hWndParent,
DLGPROC lpDialogFunc,对话框过程的指点。有关对话框程序的更多信息,请参阅对话程序。
LPARAM dwInitParam
);
详细到这个网站去看https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-dialogboxparama
然后就先进入第4个参数地址处内部去看看,原来004010F5–00401249是被加密过的,现在已经解密了。
分析到这里就差不多了,开始打补丁。
打补丁
1.先说一下补丁打在哪。
①设置到文件的空白区域。
②扩展最后节区后设置。
③添加新节区后设置。
③和②的方法适合添加代码较多的适合运用。
这个文件就特地的设置了一个1000的空白区域,在地址00401280处,学过PE就可以很容易知道这部分内容了。
2.打补丁的大致思路
先修改最后到OEP的jmp指令,修改使其跳转到我们的补丁处,然后执行我们的补丁,然后补丁的最后再写一个jmp指令跳到OEP处。
3.正式写补丁
直接抄的书上的,因为不会写汇编,但是书上也比较易懂,直接用Ctrl+e来编辑
然后还有一件事,就是将原来跳到OEP的指令改为跳到我们的补丁地址处,这里涉及到jmp指令的原理,《汇编语言》一书中有讲原理,并且我们修改的是被解密的部分,所以在还要加密回去。
通过上述分析样本过程我们可以知道
图片中的xor 7是因为这部分地址的加密过程就是用的xor 7,可以看样本分析过程中的相应部分,对照地址来查看,还有个注意的地方就是这个必须在调试的最之前来改这个部分(具体来说是未解密之前)。