17. OD-带有多态、变形的程序进行打补丁去掉nag(分析xor加密解密、自身修改代码的程序)
win32程序
此程序打开会弹出一个neg,确定后弹出主对话框
查找字符串,下断点,发现程序并没有进断点,这些汇编是坑爹的,故意搞混我们
此程序非主流,一般我们写的程序均为push ebp
往上看代码,发现这些字符均不是代码,好像进入数据段一样,因为这是OD帮你自动分析了
我们取消OD的自动分析
代码恢复正常
自己在异或代码,也就是自己改代码,变形
最常用的加密手段
7 xor 2 = 5
2 xor 5 = 7
第一个call进行xor解密
第二个call进入继续解读
这里还有一个xor解密
循环地址为00403000 -> 00403120
观察发现MessageBox中的参数地址就是这个循环里的过程地址
可见原本是乱码的字符串参数进行xor解密后得到正确的字符串
那么我们如果打补丁
如果将MessageBox给nop掉,异或的数据将会出错,直接运行程序出错
开始分析
进入第一个call
1. 解密401000到401218, xor 0x5A,下图
进入第二个call
2. 修改自身代码,从401011到401025,这样就把对话框的代码修改出现了,下图
3. 对nag窗口加密的标题和文本进行xor解密,就是把对话框窗口的参数解密出来。
4. 接下来再次修改自身代码,401011到401027进行覆盖,将neg窗口代码修改为主窗口代码
5. 对nag窗口的标题和文本加密,用完就加密
程序结束。
开始打补丁
第一种方法,将MessageBox的第一给参数修改为1,使其找不到父窗口
但是因为有xor加密解密过程,所以我们要找使到哪里修改了0040101D的代码
因为代码使xor 0x5A解密得到的新代码,那么我们直接将0x6A改为0x016A这样不行(注意大小端)
所以我们要用1 xor 0x5A = 0x5B
所以我们应该改成这样
nag窗口成功去掉了。
第二种方法,将对话框代码忽略,直接跳转到0040106A处,这样就删除了nag代码
所以我们要将00401011地址处的值改为 EB 57
我们找到修改此地址的代码处
进行反异或运算
EB xor 0x5A = B1
57 xor 0x5A = 0D
修改时注意大小端
我们要再内存数据种修改,不能再代码段种修改,否则程序运行崩溃
成功。