OD手动修改PE文件入口代码
1、先脱壳!这里就不再说明了,网上有多种方法脱壳。脱壳完后就是这样:


2、接着用Stud_PE 来获取一些 导入地址表(IAT)的信息(RVA)和 添加一个 区段,用来存放我们添加的代码,如图:
ShellExecuteA RVA: 0007C380
MessageBoxA RVA: 0007C4B8
Sleep RVA: 0007C260

3、在添加一个新区段:

4、用OD加载程序,并记下 开头的地址,一会添加的代码还要跳回到这里继续执行,不然程序会崩溃!!

5、按Alt +M打开内存窗口,找到我们添加的区段的 基地址:为004C3000

6、Ctrl +G 来到新区段:(注意,这里什么都没有,因此我们可以在此添加代码!)

7、接下来可以添加代码了,注意 函数的调用约定 , 从右到左依次压栈!明白这一点就可以继续了,
注意这里,要调用 MessageBoxA函数,应该 是 VA=RVA+baseaddress
如: PUSH [0007C4B8+400000]
修改后的代码如下:
004C3000 6A 00 push 0x0
004C3002 68 20304C00 push dumped_.004C3020 ; ASCII "HELLO !"
004C3007 68 30304C00 push dumped_.004C3030 ; ASCII "THIS IS A MESSAGE!"
004C300C 6A 00 push 0x0
004C300E FF15 B8C44700 call dword ptr ds:[<&user32.MessageBoxA>>; user32.MessageBoxA
004C3014 EB 37 jmp short dumped_.004C304D
004C3016 0000 add byte ptr ds:[eax],al
004C3018 0000 add byte ptr ds:[eax],al
004C301A 0000 add byte ptr ds:[eax],al
004C301C 0000 add byte ptr ds:[eax],al
004C301E 0000 add byte ptr ds:[eax],al
004C3020 48 dec eax
004C3021 45 inc ebp
004C3022 4c dec esp
004C3023 4c dec esp
004C3024 4F dec edi
004C3025 2021 and byte ptr ds:[ecx],ah
004C3027 0000 add byte ptr ds:[eax],al
004C3029 0000 add byte ptr ds:[eax],al
004C302B 0000 add byte ptr ds:[eax],al
004C302D 0000 add byte ptr ds:[eax],al
004C302F 005448 49 add byte ptr ds:[eax+ecx*2+0x49],dl
004C3033 53 push ebx
004C3034 2049 53 and byte ptr ds:[ecx+0x53],cl
004C3037 2041 20 and byte ptr ds:[ecx+0x20],al
004C303A 4D dec ebp
004C303B 45 inc ebp
004C303C 53 push ebx
004C303D 53 push ebx
004C303E 41 inc ecx
004C303F 47 inc edi
004C3040 45 inc ebp
004C3041 2100 and dword ptr ds:[eax],eax
004C3043 0000 add byte ptr ds:[eax],al
004C3045 0000 add byte ptr ds:[eax],al
004C3047 0000 add byte ptr ds:[eax],al
004C3049 0000 add byte ptr ds:[eax],al
004C304B 0000 add byte ptr ds:[eax],al
004C304D 68 B80B0000 push 0xBB8 ; BB8 十进制 3000
004C3052 FF15 60C24700 call dword ptr ds:[<&kernel32.Sleep>] ; kernel32.Sleep
004C3058 EB 02 jmp short dumped_.004C305C
004C305A 0000 add byte ptr ds:[eax],al
004C305C 6A 01 push 0x1
004C305E 6A 00 push 0x0
004C3060 6A 00 push 0x0
004C3062 68 9A304C00 push dumped_.004C309A ; ASCII "http://www.baidu.com"
004C3067 68 BA304C00 push dumped_.004C30BA ; ASCII "open"
004C306C 6A 00 push 0x0
004C306E FF15 80C34700 call dword ptr ds:[<&shell32.ShellExecut>; shell32.ShellExecuteA
004C3074 - E9 9EA1F9FF jmp dumped_.<ModuleEntryPoint>
004C3079 0000 add byte ptr ds:[eax],al
004C307B 0000 add byte ptr ds:[eax],al
004C307D 0000 add byte ptr ds:[eax],al
004C307F 0000 add byte ptr ds:[eax],al
004C3081 0000 add byte ptr ds:[eax],al
004C3083 0000 add byte ptr ds:[eax],al
004C3085 0000 add byte ptr ds:[eax],al
004C3087 0000 add byte ptr ds:[eax],al
004C3089 0000 add byte ptr ds:[eax],al
004C308B 0000 add byte ptr ds:[eax],al
004C308D 0000 add byte ptr ds:[eax],al
004C308F 0000 add byte ptr ds:[eax],al
004C3091 0000 add byte ptr ds:[eax],al
004C3093 0000 add byte ptr ds:[eax],al
004C3095 0000 add byte ptr ds:[eax],al
004C3097 0000 add byte ptr ds:[eax],al
004C3099 0068 74 add byte ptr ds:[eax+0x74],ch
004C309C 74 70 je short dumped_.004C310E
004C309E 3A2F cmp ch,byte ptr ds:[edi]
004C30A0 2F das
004C30A1 77 77 ja short dumped_.004C311A
004C30A3 77 2E ja short dumped_.004C30D3
004C30A5 6261 69 bound esp,qword ptr ds:[ecx+0x69]
004C30A8 64:75 2e jne short 004c30d9
004C30AB 636F 6D arpl word ptr ds:[edi+0x6D],bp
004C30AE 0000 add byte ptr ds:[eax],al
004C30B0 0000 add byte ptr ds:[eax],al
004C30B2 0000 add byte ptr ds:[eax],al
004C30B4 0000 add byte ptr ds:[eax],al
004C30B6 0000 add byte ptr ds:[eax],al
004C30B8 0000 add byte ptr ds:[eax],al
004C30BA 6f outs dx,dword ptr ds:[esi]
004C30BB 70 65 jo short dumped_.004C3122
004C30BD 6e outs dx,byte ptr ds:[esi]
004C30BE 0000 add byte ptr ds:[eax],al
004C30C0 0000 add byte ptr ds:[eax],al


8、注意,还没有完成!还要用Stud_PE 修改程序的 OEP:


9、这里的C3000也就是 4c3000 – 400000=c3000
或者转换下:

10、结果,打开后:
等待3秒:
看!成功了!
如果有兴趣的可以在添加一些代码。。。。。。
当前也要注意在修改时小心小心再小心,不然就搞得程序崩溃了。。。

