首页
社区
课程
招聘
6
[旧帖] [原创]Exeinfo PE在虚拟机中的运行问题 0.00雪花
发表于: 2012-6-4 17:05 4025

[旧帖] [原创]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直播授课

上传的附件:
收藏
免费 6
支持
分享
赞赏记录
参与人
雪币
留言
时间
伟叔叔
为你点赞~
2024-5-31 05:00
心游尘世外
为你点赞~
2024-5-31 01:44
QinBeast
为你点赞~
2024-5-31 01:34
飘零丶
为你点赞~
2024-3-28 04:09
shinratensei
为你点赞~
2024-1-30 01:29
PLEBFE
为你点赞~
2023-3-7 00:43
最新回复 (2)
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
2
记录了,谢谢楼主的分享。晚些时候注意查看悄悄话哈
2012-6-4 17:31
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼主的分享

拜读了!
2012-8-17 13:31
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册