原文:https://www.pediy.com/kssd/pediy12/100106.html
自打学破解以来,经常听人说指令修改内存、动态解压指令什么的,看得我是一头雾水。在研究一个壳是如何隐藏OEP的时候,无意间有了一些发现。现在总结一下,希望能为和我一样的菜鸟们提供些帮助,高手莫要见笑哈
(老大啥时候能把我升级为会员啊,还是临时会员呢,哎....)
请看这段跳到OEP之前的一段代码
0040D39A B8 CC100000 mov eax,10CC 0040D39F 50 push eax 0040D3A0 0385 22040000 add eax,dword ptr ss:[ebp+422] 0040D3A6 59 pop ecx 0040D3A7 0BC9 or ecx,ecx 0040D3A9 8985 A8030000 mov dword ptr ss:[ebp+3A8],eax 0040D3AF 61 popad 0040D3B0 75 08 jnz short NotePad_.0040D3BA 0040D3B2 B8 01000000 mov eax,1 0040D3B7 C2 0C00 retn 0C 0040D3BA 68 00000000 push 0 0040D3BF C3 retn
0040D39A B8 CC100000 mov eax,10CC 0040D39F 50 push eax 0040D3A0 0385 22040000 add eax,dword ptr ss:[ebp+422] 0040D3A6 59 pop ecx 0040D3A7 0BC9 or ecx,ecx 0040D3A9 8985 A8030000 mov dword ptr ss:[ebp+3A8],eax 0040D3AF 61 popad 0040D3B0 75 08 jnz short NotePad_.0040D3BA 0040D3B2 B8 01000000 mov eax,1 0040D3B7 C2 0C00 retn 0C 0040D3BA 68 CC104000 push NotePad_.004010CC 0040D3BF C3 retn
0040D39A B8 CC100000 MOV EAX,10CC ;10CC赋给EAX 0040D39F 50 PUSH EAX ;EAX入栈,即10CC 0040D3A0 0385 22040000 ADD EAX,DWORD PTR SS:[EBP+422] ;将【EBP+422】内存地址的内容赋值给EAX,此时EBP=0040D013,因此【EBP+422】=0040D435,Crtl+G跟随到该地址,在数据窗口中跟随,在数据窗口 查看该地址的内存值(16进制显示),此时该值为 00 00 40 00,(反序)即00400000,该值与EAX(10CC)相加为004010CC即将004010CC赋给EAX 0040D3A6 59 POP ECX ;10CC出栈赋给ECX 0040D3A7 0BC9 OR ECX,ECX ;或,ECX不变 0040D3A9 8985 A8030000 MOV DWORD PTR SS: [EBP+3A8],EAX ;将EAX赋给内存地址[EBP+3A8](经同上计算,该值为0040D3BB),即将004010CC赋给内存地址0040D3BB,可以看到该地址即是 PUSH 0 这句指令。 由此可知这条指令其实是把0040D3BA处的这句指令修改为PUSH 004010CC,由此实现了动态修改指令,隐藏入口点的目的。 0040D3AF 61 POPAD 0040D3B0 75 08 JNZ SHORT 0040D3BA 0040D3B2 B8 01000000 MOV EAX,1 0040D3B7 C2 0C00 RETN 0C 0040D3BA 68 00000000 PUSH 0 ;执行完0040D3A9处的指令后该指令变为PUSH 004010CC 0040D3BF C3 RETN ;返回到入口点
0040D3BA 68 00 00 00 00 C3 8B 85 26 04 00 00 8D 8D 3B 04 h....? ..; 0040D3CA 00 00 51 50 FF 95 49 0F 00 00 89 85 55 05 00 00 ..QP ..U .. 0040D3DA 8D 85 47 04 00 00 50 FF 95 51 0F 00 00 89 85 2A G ..P ..*
0040D3BA 68 CC 10 40 00 C3 8B 85 26 04 00 00 8D 8D 3B 04 h?@.?