内嵌补丁练习

参考资料:《逆向工程核心原理》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,可以看样本分析过程中的相应部分,对照地址来查看,还有个注意的地方就是这个必须在调试的最之前来改这个部分(具体来说是未解密之前)。

正式运行打补丁后的程序