我先是跟到了EPE里面,用OD对当前进程脱壳..脱壳后是1.14MB..
F8跟到了
010131CD 6A 00 PUSH 0
010131CF 68 80000000 PUSH 80
010131D4 6A 04 PUSH 4
010131D6 6A 00 PUSH 0
010131D8 6A 00 PUSH 0
010131DA 68 000000C0 PUSH C0000000
010131DF 89E8 MOV EAX,EBP
010131E1 83C0 4C ADD EAX,4C
010131E4 50 PUSH EAX
010131E5 89E8 MOV EAX,EBP
010131E7 83C0 2C ADD EAX,2C
010131EA FF10 CALL DWORD PTR DS:[EAX] ;在这里动态创建了.EPE文件
010131EC 83F8 FF CMP EAX,-1
010131EF 0F84 86000000 JE Notepad.0101327B
然后是多次跟踪知道是在:
CALL EBX的地方进入EPE
并且用..PEID查到是是UPX的壳..好难过....
E:\unpack\V22006105.EPE
UPX 0.80 - 1.24 DLL -> Markus & Laszlo
好不容易把UPX的壳也给扒了..
我还跟到了这里全是API..就用IMPREC把它给修好保存了下来..
7112729A 8BC0 MOV EAX,EAX
7112729C - FF25 68942171 JMP DWORD PTR DS:[71219468] ; kernel32.GetCommandLineA
再用IMPREC把这个IAT表修复到了EPE文件..原来EPE文件是个DLL文件.
我现在把它放到了
C:\Documents and Settings\new\Local Settings\Temp
这个目录下.
因为在这个版本里把WINDOWS\SYSTEM32这样的目录换到了这个临时地方..
经过改名..发现..我修改的EPE脱壳程序正常...并没有提示错误!
可是由于原文件是临时在内存中创建的,对加壳后的文件不解压缩.
从我跟来看加壳文件和运行文件为不同进程..当加壳文件把运行文件释放到内存后就退出进程.所以和以前的壳来说这次老王把最毒的一招放了出来!
根本就跟不到OEP....全都是动态生成的!
而我把程序DUMP出来后.是不知道怎么修复了..
程序DUMP出来是560KB..原文件是430KB...
把我跟踪的临时记录写在下面大家看看了,乱七八遭的...
-------------------------------------------------------------
//OD进入在这里...
//WINXP的记事本为0000739D
01013000 > 60 PUSHAD
01013001 9C PUSHFD
01013002 64:FF35 0000000>PUSH DWORD PTR FS:[0]
01013009 E8 73010000 CALL Notepad.01013181
//保留INT3,其他都忽略...
BP IsDebuggerPresent
BP GetProcAddress
//无论怎么样都不会再像以前一样断下了....直接就运行了,有难度...不喜欢!
比以前厉害多了下什么断点都 不会再断下...
//我选择了F8..直接跟到这里...
0101329F 83F8 00 CMP EAX,0
010132A2 74 18 JE SHORT Notepad.010132BC
010132A4 89C3 MOV EBX,EAX
010132A6 89E8 MOV EAX,EBP
010132A8 05 6A010000 ADD EAX,16A
010132AD 8B08 MOV ECX,DWORD PTR DS:[EAX]
010132AF 8B50 04 MOV EDX,DWORD PTR DS:[EAX+4]
010132B2 83C0 09 ADD EAX,9
010132B5 01D0 ADD EAX,EDX
010132B7 01C8 ADD EAX,ECX
010132B9 50 PUSH EAX
010132BA FFD3 CALL EBX //程序运行...
010132BC 6A 00 PUSH 0
010132BE 89E8 MOV EAX,EBP
010132C0 83C0 48 ADD EAX,48
010132C3 FF10 CALL DWORD PTR DS:[EAX]
//重来...
下断 BP GetProcAddress
N....多后又运行....实在是抓不住重点...
//第一次:
7C80AC28 > 8BFF MOV EDI,EDI ; V2200610.7123600F
7C80AC2A 55 PUSH EBP
7C80AC2B 8BEC MOV EBP,ESP
7C80AC2D 51 PUSH ECX
7C80AC2E 51 PUSH ECX
0007F854 7123F375 /CALL 到 GetProcAddress 来自 V2200610.7123F36F
0007F858 7C800000 |hModule = 7C800000 (kernel32)
0007F85C 71236009 \ProcNameOrOrdinal = "Sleep"
//N....次后出现这个..^_^有点希望..
0007FF90 0101329F /CALL 到 GetProcAddress 来自 Notepad.0101329D
0007FF94 71120000 |hModule = 71120000 (V2200610)
0007FF98 01013169 \ProcNameOrOrdinal = "EncryptPE_Init"
//窗口跟随到这里...
01013286 FF10 CALL DWORD PTR DS:[EAX]
01013288 83F8 00 CMP EAX,0
0101328B 74 2F JE SHORT Notepad.010132BC
0101328D 89C3 MOV EBX,EAX
0101328F 89E8 MOV EAX,EBP
01013291 05 5B010000 ADD EAX,15B
01013296 50 PUSH EAX
01013297 53 PUSH EBX
01013298 89E8 MOV EAX,EBP
0101329A 83C0 44 ADD EAX,44
0101329D FF10 CALL DWORD PTR DS:[EAX]
0101329F 83F8 00 CMP EAX,0
010132A2 74 18 JE SHORT Notepad.010132BC
010132A4 89C3 MOV EBX,EAX
010132A6 89E8 MOV EAX,EBP
010132A8 05 6A010000 ADD EAX,16A
010132AD 8B08 MOV ECX,DWORD PTR DS:[EAX]
010132AF 8B50 04 MOV EDX,DWORD PTR DS:[EAX+4]
010132B2 83C0 09 ADD EAX,9
010132B5 01D0 ADD EAX,EDX
010132B7 01C8 ADD EAX,ECX
010132B9 50 PUSH EAX
010132BA FFD3 CALL EBX ;在这里会程序运行..
//到了EPE1的代码里..
711EB50C > 55 PUSH EBP ; Notepad.0101300E
711EB50D 8BEC MOV EBP,ESP
711EB50F 51 PUSH ECX
711EB510 E8 01000000 CALL V2200610.711EB516 ;这里程序就运行了
//继续看了....我们F8直接跟到这里....
0101327B 89E8 MOV EAX,EBP ; Notepad.0101300E
0101327D 83C0 4C ADD EAX,4C
01013280 50 PUSH EAX
01013281 89E8 MOV EAX,EBP
01013283 83C0 40 ADD EAX,40
01013286 FF10 CALL DWORD PTR DS:[EAX]
01013288 83F8 00 CMP EAX,0
//往下就是..
010132B7 01C8 ADD EAX,ECX
010132B9 50 PUSH EAX
010132BA FFD3 CALL EBX ;程序运行...
010132BC 6A 00 PUSH 0
010132BE 89E8 MOV EAX,EBP
//我们看到了受保护的IAT..
711EB7B3 53 PUSH EBX ; V2200610.EncryptPE_Init
//如果我没猜错的话,IAT表要从这里破..
711EB7EC 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14] ; Notepad.01080EC5
711EB7EF 8B00 MOV EAX,DWORD PTR DS:[EAX]
//我们在这里看到了API..
71124B9B E8 E8FEFFFF CALL V2200610.71124A88
71124BA0 893B MOV DWORD PTR DS:[EBX],EDI
71124BA2 5F POP EDI
71124BA3 5E POP ESI
71124BA4 5B POP EBX
71124BA5 C3 RETN
//让我猜对了API表都在这里....嘿嘿...找到IMPREC把IAT列表保存起来..
7112729A 8BC0 MOV EAX,EAX
7112729C - FF25 68942171 JMP DWORD PTR DS:[71219468] ; kernel32.GetCommandLineA
//跟到这里程序运行...
//可怜估计是文件不会解压缩的,只是动态创建..郁闷了!
711EBAEB E8 E4C3F3FF CALL V2200610.71127ED4 ; JMP 到 USER32.SendMessageA
//发现这个...
EBX=0101305A (Notepad.0101305A), ASCII "C:\DOCUME~1\new\LOCALS~1\Temp\"
010131CD 6A 00 PUSH 0
010131CF 68 80000000 PUSH 80
010131D4 6A 04 PUSH 4
010131D6 6A 00 PUSH 0
010131D8 6A 00 PUSH 0
010131DA 68 000000C0 PUSH C0000000
010131DF 89E8 MOV EAX,EBP
010131E1 83C0 4C ADD EAX,4C
010131E4 50 PUSH EAX
010131E5 89E8 MOV EAX,EBP
010131E7 83C0 2C ADD EAX,2C
010131EA FF10 CALL DWORD PTR DS:[EAX] ;在这里动态创建了.EPE文件
010131EC 83F8 FF CMP EAX,-1
010131EF 0F84 86000000 JE Notepad.0101327B
我把它按路径复制了下来...
并且用..PEID查到是是UPX的壳..好难过....
E:\unpack\V22006105.EPE
UPX 0.80 - 1.24 DLL -> Markus & Laszlo
看来我是跟本搞不定了看大大们帮忙了..太菜了!!
我们先来看看怎么脱这个文件吧...
每次都到这里就运行了..!_!
711EBAE8 8B00 MOV EAX,DWORD PTR DS:[EAX]
711EBAEA 50 PUSH EAX
711EBAEB E8 E4C3F3FF CALL V2200610.71127ED4 ; JMP 到 USER32.SendMessageA
71124495 64:8902 MOV DWORD PTR FS:[EDX],EAX
71124498 FFD1 CALL ECX ; V2200610.71122325
7112449A C2 0C00 RETN 0C
7112449D C3 RETN
脱的太垃圾了....EPE的UPX壳让我给扒了..不知道为什么只有深度扫描才出来..是普通程序...真的很晕哦.
EPE的壳是UPX..我不知道为什么..我扒的很垃圾了...但是,程序却运行正常...
711249B2 E8 A1FEFFFF CALL V2200610.71124858 就在这里了.....程序关键的地方...
最后请大大们说说怎么可以脱掉程序....怎么才能找到OEP.....
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!