-
-
[旧帖] [原创]Exeinfo PE在虚拟机中的运行问题 0.00雪花
-
发表于: 2012-6-4 17:05 4025
-
前言
多年来已经习惯了虚拟机(此虚拟机非VMP的虚拟机)的环境,安全、清爽且灵活。不用装360,也从不用QQ,他们那些愚蠢的行为,就好比俄国人和日本人为了自己的利益在我们的土地上干仗,让人无法接受。
Exeinfo PE在虚拟机中运行时,没有任何提示信息就退出了。虽有PEiD和Protection ID等可用,但始终困扰着,直到有一天,决定一探究竟,看看是什么个情况。
站在别人的肩膀上总是好的。当时人肉的结果就是下面参考资料中的1)和2)。
得知Exeinfo PE的大致信息:用Borland Delphi写的,加壳时区段被合并了,UPX壳。UPX解开后,当然无法运行,自查一下去壳后的文件:A.S.L Packer/Crypter/Protector ( Generic signature ),hint: no idea :-)。应该是作者自己整的。
写这篇文章是因为最近在学习VMProtect的知识,为方便下载资料和教程,刚注册,发出来指望骗点分分:)。
高手们的文章总是点到为止,新人呐就希望过程越详细越好。这里把以前的记录摘要点贴出来,有的东西就不细说了,恐误导于人;谬误之处,恳请指正。
『目标软件』
Exeinfo PE v0.0.3.0 617 sign 2011.07.29
『调试器』
OD - 原版OllyDbg 1.10
『调试器插件』
StrongOD 0.4.6.816 by 海风月影
OllyDump 3.00.110 by Gigapede
『其他工具』
UIF - Universal Import Fixer v1.2
ImpREC - Import REConstructor v1.7F
RB - Resource Binder v3.1.5
『参考资料』
1)
by cxx17
2)
脱壳版 ExeinfoPE v0.0.2.3 508 sign 2009.05.20
by RegKiller
3)
Exeinfo PE v0.0.3.0 617 sign 2011.07.29 UnPacKeD & CrAcKeD
by RegKiller
4)
by RegKiller
一.寻找OEP
虚拟机的操作系统是Windows XP Professional SP3简体中文版。OD插件一个是StrongOD,这个版本会自动Patch原版OD,让调试过程省去很多麻烦;用OllyDump图个方便。
OD的设置:
StrongOD的设置:
1. OD载入目标程序后停在这里:
1 2 3 4 5 6 7 8 9 10 | 05BCF7D0 > 60 PUSHAD 05BCF7D1 BE 00D0B005 MOV ESI,exeinfop.05B0D000 05BCF7D6 8DBE 00408FFA LEA EDI,DWORD PTR DS:[ESI+FA8F4000] 05BCF7DC 57 PUSH EDI 05BCF7DD 89E5 MOV EBP,ESP 05BCF7DF 8D9C24 80C1FFFF LEA EBX,DWORD PTR SS:[ESP-3E80] 05BCF7E6 31C0 XOR EAX,EAX 05BCF7E8 50 PUSH EAX 05BCF7E9 39DC CMP ESP,EBX 05BCF7EB ^75 FB JNZ SHORT exeinfop.05BCF7E8 |
2. F7,HR ESP(传说中的ESP定律),F9后:
1 2 3 4 5 6 7 8 9 10 11 | 05BD034D 8D4424 80 LEA EAX,DWORD PTR SS:[ESP-80] 05BD0351 6A 00 PUSH 0 05BD0353 39C4 CMP ESP,EAX 05BD0355 ^75 FA JNZ SHORT exeinfop.05BD0351 05BD0357 83EC 80 SUB ESP,-80 05BD035A ^E9 A1ACFFFF JMP exeinfop.05BCB000 05BD035F 0078 03 ADD BYTE PTR DS:[EAX+3],BH 05BD0362 BD 05AC03BD MOV EBP,BD03AC05 05BD0367 05 B0075400 ADD EAX,exeinfop.005407B0 05BD036C 0000 ADD BYTE PTR DS:[EAX],AL ... |
看看05BCB000:
1 2 3 4 5 6 | 05BCB000 41 INC ECX 05BCB001 2E:53 PUSH EBX ; Superfluous prefix 05BCB003 2E:4C DEC ESP ; Superfluous prefix 05BCB005 F8 CLC 05BCB006 43 INC EBX 05BCB007 72 79 JB SHORT exeinfop.05BCB082 |
目标用upx -d解开后的入口就是这里。
3. 清除硬件断点,在Memory map窗口中地址00401000起始的段,下内存访问断点,F9后(此段为作者自己的解码部分):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 05BCB07B C10B 17 ROR DWORD PTR DS:[EBX],17 05BCB07E 83C3 04 ADD EBX,4 05BCB081 ^E2 F8 LOOPD SHORT exeinfop.05BCB07B 05BCB083 83F8 00 CMP EAX,0 05BCB086 74 2A JE SHORT exeinfop.05BCB0B2 05BCB088 BB 00104000 MOV EBX,exeinfop.00401000 05BCB08D B9 80F70400 MOV ECX,4F780 05BCB092 C103 17 ROL DWORD PTR DS:[EBX],17 05BCB095 83C3 04 ADD EBX,4 05BCB098 ^E2 F8 LOOPD SHORT exeinfop.05BCB092 05BCB09A 83F8 02 CMP EAX,2 05BCB09D 74 13 JE SHORT exeinfop.05BCB0B2 05BCB09F 58 POP EAX 05BCB0A0 5A POP EDX 05BCB0A1 C3 RETN ... 05BCB0B2 90 NOP 05BCB0B3 90 NOP 05BCB0B4 90 NOP 05BCB0B5 90 NOP 05BCB0B6 B8 17FB5300 MOV EAX,exeinfop.0053FB17 05BCB0BB 5B POP EBX 05BCB0BC 5B POP EBX 05BCB0BD 50 PUSH EAX 05BCB0BE 31C0 XOR EAX,EAX 05BCB0C0 E9 02000000 JMP exeinfop.05BCB0C7 ... 05BCB0C7 C3 RETN |
4. 清除内存访问断点,在05BCB0A1和05BCB0C7处各下一个F2断点,F9后停在05BCB0C7。清除两个F2断点,F7来到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 0053FB17 71 00 JNO SHORT exeinfop.0053FB19 0053FB19 31C9 XOR ECX,ECX 0053FB1B 55 PUSH EBP 0053FB1C 76 00 JBE SHORT exeinfop.0053FB1E 0053FB1E 54 PUSH ESP 0053FB1F 72 00 JB SHORT exeinfop.0053FB21 0053FB21 5D POP EBP 0053FB22 41 INC ECX 0053FB23 -E2 FE LOOPD SHORT exeinfop.0053FB23 0053FB25 83C4 E0 ADD ESP,-20 0053FB28 67:E3 01 JCXZ SHORT exeinfop.0053FB2C ... 0053FB2C ^EB A6 JMP SHORT exeinfop.0053FAD4 ... |
5. 在0053FAD4处下硬件执行断点,F9停下来:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 0053FAD4 D9D0 FNOP 0053FAD6 31C0 XOR EAX,EAX 0053FAD8 D9D0 FNOP 0053FADA 53 PUSH EBX 0053FADB 56 PUSH ESI 0053FADC 57 PUSH EDI 0053FADD 33C0 XOR EAX,EAX 0053FADF 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX 0053FAE2 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX 0053FAE5 8945 EC MOV DWORD PTR SS:[EBP-14],EAX 0053FAE8 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX 0053FAEB B8 44EA5300 MOV EAX,exeinfop.0053EA44 0053FAF0 E8 C77AECFF CALL exeinfop.004075BC |
这段代码比较眼熟。先看看004075BC:
1 2 3 4 5 6 | 004075BC 53 PUSH EBX 004075BD 8BD8 MOV EBX,EAX 004075BF 33C0 XOR EAX,EAX 004075C1 A3 B0075400 MOV DWORD PTR DS:[5407B0],EAX 004075C6 6A 00 PUSH 0 004075C8 E8 2BFFFFFF CALL exeinfop.004074F8 ; JMP to kernel32.GetModuleHandleA |
再看看004074F8:
1 2 3 4 5 6 7 | 004074F8 -FF25 04CAB505 JMP DWORD PTR DS:[5B5CA04] ; kernel32.GetModuleHandleA 004074FE 8BC0 MOV EAX,EAX 00407500 -FF25 00CAB505 JMP DWORD PTR DS:[5B5CA00] ; kernel32.LocalAlloc 00407506 8BC0 MOV EAX,EAX 00407508 -FF25 FCC9B505 JMP DWORD PTR DS:[5B5C9FC] ; kernel32.TlsGetValue 0040750E 8BC0 MOV EAX,EAX 00407510 -FF25 F8C9B505 JMP DWORD PTR DS:[5B5C9F8] ; kernel32.TlsSetValue |
浏览一下5B5CA04附近的指针,找到头和尾,发现比较乱:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 05B5C908 00000000 05B5C90C 00000000 05B5C910 00000000 05B5C914 770F4880 oleaut32.SysFreeString 05B5C918 770FA3EC oleaut32.SysReAllocStringLen 05B5C91C 770F4B39 oleaut32.SysAllocStringLen 05B5C920 00000000 05B5C924 77DA7ABB advapi32.RegQueryValueExA 05B5C928 77DA7852 advapi32.RegOpenKeyExA ... 05B5C9EC 7C801A28 kernel32.CreateFileA 05B5C9F0 7C809BE7 kernel32.CloseHandle 05B5C9F4 00000000 05B5C9F8 7C809C65 kernel32.TlsSetValue 05B5C9FC 7C8097E0 kernel32.TlsGetValue 05B5CA00 7C809A2D kernel32.LocalAlloc 05B5CA04 7C80B741 kernel32.GetModuleHandleA 05B5CA08 00000000 05B5CA0C 77D2E4A9 user32.CreateWindowExA 05B5CA10 77D66783 user32.keybd_event 05B5CA14 77D29766 user32.WindowFromPoint 05B5CA18 77D1940C user32.WaitMessage ... 05B5D074 00000000 05B5D078 7632309F comdlg32.GetOpenFileNameA 05B5D07C 00000000 05B5D080 77D2CE12 user32.SetLayeredWindowAttributes 05B5D084 77D22156 user32.AnimateWindow 05B5D088 00000000 05B5D08C 7C92D7FE ntdll.ZwQueryInformationProcess 05B5D090 7C92DCAE ntdll.ZwSetInformationThread 05B5D094 00000000 05B5D098 00000000 05B5D09C 00000000 ... |
看来我们已经找到IAT了,地址0053FAD4应该就是OEP了,清掉硬件断点。
对比一下Exeinfo PE v0.0.2.9 598 sign 2011.01.27的OEP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 0053BAD4 > 55 PUSH EBP 0053BAD5 54 PUSH ESP 0053BAD6 5D POP EBP 0053BAD7 83C4 E0 ADD ESP,-20 0053BADA 53 PUSH EBX 0053BADB 56 PUSH ESI 0053BADC 57 PUSH EDI 0053BADD 33C0 XOR EAX,EAX 0053BADF 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX 0053BAE2 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX 0053BAE5 8945 EC MOV DWORD PTR SS:[EBP-14],EAX 0053BAE8 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX 0053BAEB B8 8CA85300 MOV EAX,exeinfop.0053A88C 0053BAF0 E8 6FBAECFF CALL exeinfop.00407564 ... |
二.重建IAT
运行UIF。UIF需要Process ID,从OD的Log data窗口找到目标载入时的值:00000C40,填入UIF后,点'Start'
重用原来的IAT起始位置,在'New IAT VA:'内填入05B5C914,点'Start'
注意05B5CFEC这个值,就是IAT的尾。退出UIF。在OD里选中从05B5CFEC开始到05B5D094的内存区域,用右键->'Binary'->'Fill with 00's'清理掉残存的指针,省去后面在ImpREC里的麻烦。
三.Dump目标进程
OD里菜单'Plugins'->'OllyDump'->'Dump debugged process',去掉'Rebuild Import'前面的勾选,检查'Entry Point:'由57CF7D0修改为13FAD4,点'Dump'为exeinfope_dumped.exe:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课