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