1.1 源程序分析
![](data/attach/1907/1akk3ilu0f893l8pphbmpp0ufsbykv7r.jpg)
![](data/attach/1907/yc6p3ymneoxatsaj9ktz8c76ge7y9zp5.jpg)
第一次解密4010F5,与0x44异或
![](data/attach/1907/x1556njg2jnl11sjb4jth6ela1kstjic.jpg)
解密401007,与0x7异或,一直到0x401086
![](data/attach/1907/s1tim64v92kvu3ds8xbdb2ez1mv2ormq.jpg)
第二次解密4010F5,与0x11异或。
![](data/attach/1907/3zl9os79gmrrn9b6xdxt7s35chhtiev3.jpg)
将4010F5处的内容累加得到校验和,与0x31EB8DB0作比较,来判断代码/数据是否被改动过。下图是我们将要修改的字符串。分别位于0x40110A和0x401123
![](data/attach/1907/3tjwdeam81hsgm1nvk6w73sxodmbdzd7.jpg)
解密代码。
![](data/attach/1907/khg66jqxeybyv6psf1amy37j0acrbcop.jpg)
1.2 内嵌补丁
思路:解密结束后会跳到OEP,把JMP OEP改成JMP 补丁代码,补丁代码执行完成后再JMP OEP。补丁代码有3种设置方法:设置到文件的空白区域扩展最后节区后设置添加新节区后设置。
打补丁过程:![](data/attach/1907/ld216aowxesws9je8x9vpvqjvpaag6bd.jpg)
.text节区起始偏移是0x400,大小是0x280,从0x680-0x800都是NULL,这个文件偏移所对应RVA是0x1000+(0x680-0x400)+ImageBase=0x401280,在0x401280处填充补丁代码。
![](data/attach/1907/spd9c5908x1u19y39b7e1d3f7klv61bl.jpg)
补丁代码填充结束后,需要修改之前跳转到OEP的代码修改成跳转到401280。
![](data/attach/1907/r3k9r81jolopl599uyii4m4zuvdef61q.jpg)
修改0x401083处的内容,内容为“E9 96 01”,这一部分到0x401086就结束了。文件偏移是0x401083-0x401000+0x400=0x483 0x483处的内容是未解密的,和0x7异或之后得到jmp40121e。
![](data/attach/1907/6dy05doivuuxu44c9it63lhbe9ufrexf.jpg)
现在需要将JMP 40121e改成JMP 401280,“E9 F8 01”,需要将“E9 F8 01”与0x7异或后再写入0x483-0x486。
打了补丁之后的程序:![](data/attach/1907/y3ata04pjsy9613r1ao2gglkj1n0o5rs.jpg)