http://ift.tt/2ARJ9dy
目标:再程序入口点前执行一个MessageBox,然后返回到程序入口点,正常执行程序
00411358 64:A1 30000000 MOV EAX,DWORD PTR FS:[0x30]
0041135E 8B40 0C MOV EAX,DWORD PTR DS:[EAX+0xC]
00411361 8B40 0C MOV EAX,DWORD PTR DS:[EAX+0xC]
00411364 8B00 MOV EAX,DWORD PTR DS:[EAX]
00411366 8B00 MOV EAX,DWORD PTR DS:[EAX]
00411368 8B40 18 MOV EAX,DWORD PTR DS:[EAX+0x18] ; 获取kernel32.dll的Hmoudle
0041136B 51 PUSH ECX ; 保存寄存器环境
0041136C 8BC8 MOV ECX,EAX
0041136E 51 PUSH ECX ; 保存一下kernel32的hModule,GetPRocessd 的时候还要用
0041136F E8 0C000000 CALL 00411380
00411374 75 73 JNZ SHORT 004113E9
00411376 65:72 33 JB SHORT 004113AC
00411379 322E XOR CH,BYTE PTR DS:[ESI]
0041137B 64:6C INS BYTE PTR ES:[EDI],DX
0041137D 6C INS BYTE PTR ES:[EDI],DX
0041137E 00CC ADD AH,CL ; 这上面一直到call 其实都是user32.dll的字符串
00411380 81C1 00850200 ADD ECX,0x28500 ; LoadLibraryA
00411386 FFD1 CALL ECX
00411388 90 NOP
00411389 90 NOP
0041138A 90 NOP
0041138B 59 POP ECX ; 重新获取kernel32.dll 的HMODULE
0041138C E8 0D000000 CALL 0041139E
00411391 4D DEC EBP
00411392 65:73 73 JAE SHORT 00411408
00411395 61 POPAD
00411396 67:65:42 INC EDX
00411399 6F OUTS DX,DWORD PTR DS:[ESI]
0041139A 78 57 JS SHORT 004113F3
0041139C 00CC ADD AH,CL
0041139E 81C1 00A20100 ADD ECX,0x1A200 ; 上面一直到call 都是MessageBoxW的字符串
004113A4 50 PUSH EAX
004113A5 FFD1 CALL ECX ; call的是GetProcAddress
004113A7 83C4 08 ADD ESP,0x8
004113AA 6A 00 PUSH 0x0
004113AC 6A 00 PUSH 0x0
004113AE 6A 00 PUSH 0x0
004113B0 6A 00 PUSH 0x0
004113B2 FFD0 CALL EAX ; 调用MessageBoxW
004113B4 83C4 10 ADD ESP,0x10
004113B7 59 POP ECX ; 回复寄存器环境
004113B8 ^ E9 89FCFFFF JMP <ModuleEntryPoint> ; 返回原本的OEP
- 至于上免的字符串跳转为什么要用call 不用jmp,因为call的话直接把下一条的地址入栈了,也就是把字符串入栈了,可以直接作为参数使用
The post 加壳原理之在OEP前执行代码 appeared first on cole.
http://ift.tt/eA8V8J reverse engineering, hack, Program packers, reverse December 04, 2017 at 09:19PM
评论
发表评论