-
-
[旧帖] [原创]Exeinfo PE在虚拟机中的运行问题 0.00雪花
-
2012-6-4 17:05 3470
-
前言
多年来已经习惯了虚拟机(此虚拟机非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
http://www.exeinfo.xwp.pl
http://users.cjb.net/exeinfope/exeinfope.zip
『调试器』
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) ExeInfo PE ver. 0.0.2.4 正式版 脱壳+资源优化+去自校验 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) Exeinfo PE v0.0.2.9 598 sign 2011.02.26 UnPacKeD & CrAcKeD by RegKiller
一.寻找OEP
虚拟机的操作系统是Windows XP Professional SP3简体中文版。OD插件一个是StrongOD,这个版本会自动Patch原版OD,让调试过程省去很多麻烦;用OllyDump图个方便。
OD的设置:
StrongOD的设置:
1. OD载入目标程序后停在这里:
2. F7,HR ESP(传说中的ESP定律),F9后:
看看05BCB000:
目标用upx -d解开后的入口就是这里。
3. 清除硬件断点,在Memory map窗口中地址00401000起始的段,下内存访问断点,F9后(此段为作者自己的解码部分):
4. 清除内存访问断点,在05BCB0A1和05BCB0C7处各下一个F2断点,F9后停在05BCB0C7。清除两个F2断点,F7来到:
5. 在0053FAD4处下硬件执行断点,F9停下来:
这段代码比较眼熟。先看看004075BC:
再看看004074F8:
浏览一下5B5CA04附近的指针,找到头和尾,发现比较乱:
看来我们已经找到IAT了,地址0053FAD4应该就是OEP了,清掉硬件断点。
对比一下Exeinfo PE v0.0.2.9 598 sign 2011.01.27的OEP:
二.重建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:
四.修复Dump的文件
运行ImpREC。选中目标进程,先去Options里面,将勾选全清掉:
'IAT Infos Needed'的OEP内填入13FAD4,然后点'AutoSearch',在跳出的'Found something!'对话框点'确定',再点'Get Imports'。
去掉'New Import Infos'下'Add New Section'前的勾选,RAV内填入0575CFF0。这里不新建区段,直接使用IAT后面的空间。
注:0575CFF0 = IAT尾05B5CFEC -> 圆整为05B5CFF0 -> 减去基址00400000。点'Fix Dump',保存为exeinfope_dumped_.exe:
退出ImpREC和OD。
到这里,exeinfope_dumped_.exe就能运行了。由于是在虚拟机里,直接就退出了。在物理机上运行,提示:
意味着有自校验。后面再说怎么过,先“减肥”。由于第一个区段的Virtual Size比较大0570C000,直接导致dump文件在磁盘上的大小为87.8MB。用Resource Binder比较方便,'Action'下面就用第一个选项:
处理后的文件大小为2.03MB。
五.在虚拟机中不能运行的原因
OD载入exeinfope_dumped_.exe,停在入口0053FAD4。由于有花指令,慢慢看,就在下面不远:
哈哈,RDTSC!
抄段理论:从Intel Pentium开始的x86处理器都有一个叫时间戳计数器(Time Stamp Counter)的64位寄存器,保存处理器自复位以来的时钟周期数。指令RDTSC返回TSC寄存器的值在EDX:EAX中;在x86-64模式下,RDTSC指令还回清除RAX的高32位。
在这里F9,程序直接就结束了。注意到退出码为0DE01。上面两处00405444调用即结束进程,EAX含Exit Code。跟进去最后来到这里:
两个RDTSC指令只用了TSC寄存器低32位的差值,应该在5~398之间,否则程序就终止。在我的虚拟机中,差值已经大于398,程序必定退出。所以,只需要修改一个字节,将398改为0FF98,程序就可以继续执行了,和在物理机里跑的情况一样,显示“Virus Detected”。
注:参考资料3)里RegKiller的Crack不能在虚拟机里运行,只改这里就可以了。
六.自校验分析及处理
1. 程序在这里将自己前400h字节读到地址05B5AD3C处:
调用00403740读文件:
2. 自校验代码部分
稍微编辑了一下,消除花指令的影响以增强可读性:
可以看出校验了三个东西:程序入口点、区段数和输入表大小。
a) 程序入口点
偏移128处(DWORD)为IMAGE_OPTIONAL_HEADER里的AddressOfEntryPoint;偏移158处(DWORD)为CheckSum,但并非真正的校验和,是EP的副本。
b) 区段数
偏移106处(WORD)为IMAGE_FILE_HEADER里NumberOfSections。
c) 输入表大小
偏移184处(DWORD)为IMAGE_DATA_DIRECTORY里IMAGE_DIRECTORY_ENTRY_IMPORT的Size。
当然,我们在这里再次看到了结束进程调用00405444的身影。
另外,偏移208处(DWORD),即第一个区段IMAGE_SECTION_HEADER里的SizeOfRawData,作者把这个字段清零了。较早的Exeinfo PE v0.0.2.9 598 sign 2011.01.27版本会校验它,但不知为什么这个版本去掉了校验该字段。
3. 去自校验处理
exeinfope.exe的PE Header:
exeinfope_dumped_.exe的PE Header:
a) 程序入口点
对比发现,原文件的Entry Point和CheckSum均为057CF7D0,而脱壳后的文件已改为OEP:0013FAD4,所以需要处理。这里只修改两个字节,将:
简单地改为:
b) 区段数
由于我们修复Dump时,没有新增区段,区段数为3,没有变化,不需处理。如果你的区段数有变化,可修改这里:
将2改为你的区段数减1。
c) 输入表大小
修复后,输入表的RVA由057D5114变为0575CFF0,Size由000002C8变为000000DC。需要处理,这里只修改2个字节,将:
改为:
将:
改为:
就好了!
附件为最后的结果。
文件名:exeinfope_dumped_.7z,MD5:E3CD81C3CEDDE6244EA07C04B29BE610
解开后文件名:exeinfope_dumped_.exe,MD5:E9508BFFABC33D12E59118B04A7BF73E
多年来已经习惯了虚拟机(此虚拟机非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
http://www.exeinfo.xwp.pl
http://users.cjb.net/exeinfope/exeinfope.zip
『调试器』
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) ExeInfo PE ver. 0.0.2.4 正式版 脱壳+资源优化+去自校验 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) Exeinfo PE v0.0.2.9 598 sign 2011.02.26 UnPacKeD & CrAcKeD by RegKiller
一.寻找OEP
虚拟机的操作系统是Windows XP Professional SP3简体中文版。OD插件一个是StrongOD,这个版本会自动Patch原版OD,让调试过程省去很多麻烦;用OllyDump图个方便。
OD的设置:
StrongOD的设置:
1. OD载入目标程序后停在这里:
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后:
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:
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后(此段为作者自己的解码部分):
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来到:
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停下来:
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:
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:
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附近的指针,找到头和尾,发现比较乱:
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:
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:
四.修复Dump的文件
运行ImpREC。选中目标进程,先去Options里面,将勾选全清掉:
'IAT Infos Needed'的OEP内填入13FAD4,然后点'AutoSearch',在跳出的'Found something!'对话框点'确定',再点'Get Imports'。
去掉'New Import Infos'下'Add New Section'前的勾选,RAV内填入0575CFF0。这里不新建区段,直接使用IAT后面的空间。
注:0575CFF0 = IAT尾05B5CFEC -> 圆整为05B5CFF0 -> 减去基址00400000。点'Fix Dump',保存为exeinfope_dumped_.exe:
退出ImpREC和OD。
到这里,exeinfope_dumped_.exe就能运行了。由于是在虚拟机里,直接就退出了。在物理机上运行,提示:
意味着有自校验。后面再说怎么过,先“减肥”。由于第一个区段的Virtual Size比较大0570C000,直接导致dump文件在磁盘上的大小为87.8MB。用Resource Binder比较方便,'Action'下面就用第一个选项:
处理后的文件大小为2.03MB。
五.在虚拟机中不能运行的原因
OD载入exeinfope_dumped_.exe,停在入口0053FAD4。由于有花指令,慢慢看,就在下面不远:
0053FB4C 0F31 RDTSC 0053FB4E 43 INC EBX 0053FB4F 91 XCHG EAX,ECX 0053FB50 4B DEC EBX 0053FB51 0F31 RDTSC 0053FB53 29C8 SUB EAX,ECX 0053FB55 3D 98030000 CMP EAX,398 0053FB5A A3 6CB1B505 MOV DWORD PTR DS:[5B5B16C],EAX 0053FB5F 77 06 JA SHORT exeinfop.0053FB67 0053FB61 87C9 XCHG ECX,ECX 0053FB63 EB 09 JMP SHORT exeinfop.0053FB6E 0053FB65 87C9 XCHG ECX,ECX 0053FB67 C605 69B1B505 01 MOV BYTE PTR DS:[5B5B169],1 0053FB6E 91 XCHG EAX,ECX 0053FB6F 803D 69B1B505 01 CMP BYTE PTR DS:[5B5B169],1 0053FB76 75 0A JNZ SHORT exeinfop.0053FB82 0053FB78 B8 01DE0000 MOV EAX,0DE01 0053FB7D E8 C258ECFF CALL exeinfop.00405444 0053FB82 833D 6CB1B505 05 CMP DWORD PTR DS:[5B5B16C],5 0053FB89 73 0A JNB SHORT exeinfop.0053FB95 0053FB8B B8 05DE0000 MOV EAX,0DE05 0053FB90 E8 AF58ECFF CALL exeinfop.00405444 0053FB95 33C0 XOR EAX,EAX 0053FB97 55 PUSH EBP 0053FB98 68 CCFB5300 PUSH exeinfop.0053FBCC 0053FB9D 64:FF30 PUSH DWORD PTR FS:[EAX] 0053FBA0 64:8920 MOV DWORD PTR FS:[EAX],ESP 0053FBA3 F8 CLC 0053FBA4 87C9 XCHG ECX,ECX
哈哈,RDTSC!
抄段理论:从Intel Pentium开始的x86处理器都有一个叫时间戳计数器(Time Stamp Counter)的64位寄存器,保存处理器自复位以来的时钟周期数。指令RDTSC返回TSC寄存器的值在EDX:EAX中;在x86-64模式下,RDTSC指令还回清除RAX的高32位。
在这里F9,程序直接就结束了。注意到退出码为0DE01。上面两处00405444调用即结束进程,EAX含Exit Code。跟进去最后来到这里:
00405422 A1 00005400 MOV EAX,DWORD PTR DS:[540000] 00405427 50 PUSH EAX 00405428 E8 57BEFFFF CALL <JMP.&kernel32.ExitProcess>
两个RDTSC指令只用了TSC寄存器低32位的差值,应该在5~398之间,否则程序就终止。在我的虚拟机中,差值已经大于398,程序必定退出。所以,只需要修改一个字节,将398改为0FF98,程序就可以继续执行了,和在物理机里跑的情况一样,显示“Virus Detected”。
注:参考资料3)里RegKiller的Crack不能在虚拟机里运行,只改这里就可以了。
六.自校验分析及处理
1. 程序在这里将自己前400h字节读到地址05B5AD3C处:
00523A48 6A 00 PUSH 0 00523A4A BA 3CADB505 MOV EDX,exeinfop.05B5AD3C 00523A4F B9 00040000 MOV ECX,400 00523A54 B8 38745500 MOV EAX,exeinfop.00557438 00523A59 E8 E2FCEDFF CALL exeinfop.00403740 00523A5E B8 38745500 MOV EAX,exeinfop.00557438 00523A63 E8 18FDEDFF CALL exeinfop.00403780
调用00403740读文件:
00403740 55 PUSH EBP 00403741 8BEC MOV EBP,ESP 00403743 53 PUSH EBX 00403744 8B5D 08 MOV EBX,DWORD PTR SS:[EBP+8] 00403747 53 PUSH EBX 00403748 68 B1D70000 PUSH 0D7B1 0040374D 68 A0364000 PUSH <JMP.&kernel32.ReadFile> 00403752 6A 64 PUSH 64 00403754 E8 57FFFFFF CALL exeinfop.004036B0 00403759 5B POP EBX 0040375A 5D POP EBP 0040375B C2 0400 RETN 4
2. 自校验代码部分
稍微编辑了一下,消除花指令的影响以增强可读性:
00523A6B 8B05 64AEB505 MOV EAX,DWORD PTR DS:[5B5AE64] ; 5B5AE64 - 05B5AD3C = 128 00523A71 8B1D 94AEB505 MOV EBX,DWORD PTR DS:[5B5AE94] ; 5B5AE94 - 05B5AD3C = 158 00523A77 F8 CLC 00523A78 41 INC ECX 00523A79 73 03 JNB SHORT exeinfop.00523A7E 00523A7B F7 0D F7 00523A7E 39D8 CMP EAX,EBX ; 校验程序入口点 00523A80 ^0F85 F2FCFFFF JNZ exeinfop.00523778 00523A86 B3 02 MOV BL,2 00523A88 43 INC EBX 00523A89 A1 30745500 MOV EAX,DWORD PTR DS:[557430] 00523A8E 8B80 60030000 MOV EAX,DWORD PTR DS:[EAX+360] 00523A94 33D2 XOR EDX,EDX 00523A96 E8 6D05F2FF CALL exeinfop.00444008 00523A9B EB 02 JMP SHORT exeinfop.00523A9F 00523A9D A1 A1 00523A9F 3A1D 42AEB505 CMP BL,BYTE PTR DS:[5B5AE42] ; 5B5AE42 - 05B5AD3C = 106, 校验区段数 00523AA5 75 14 JNZ SHORT exeinfop.00523ABB 00523AA7 A1 30745500 MOV EAX,DWORD PTR DS:[557430] 00523AAC 8B80 60030000 MOV EAX,DWORD PTR DS:[EAX+360] 00523AB2 B2 01 MOV DL,1 00523AB4 E8 4F05F2FF CALL exeinfop.00444008 00523AB9 EB 1A JMP SHORT exeinfop.00523AD5 00523ABB E8 58FCFFFF CALL exeinfop.00523718 00523AC0 A1 30745500 MOV EAX,DWORD PTR DS:[557430] 00523AC5 8B80 A4030000 MOV EAX,DWORD PTR DS:[EAX+3A4] 00523ACB 33D2 XOR EDX,EDX 00523ACD E8 3605F2FF CALL exeinfop.00444008 00523AD2 EB 01 JMP SHORT exeinfop.00523AD5 00523AD4 E9 00523AD5 803D C0AEB505 C8 CMP BYTE PTR DS:[5B5AEC0],0C8 ; 5B5AEC0 - 05B5AD3C = 184, 校验输入表大小 00523ADC 74 0A JE SHORT exeinfop.00523AE8 00523ADE B8 F1000000 MOV EAX,0F1 00523AE3 E8 5C19EEFF CALL exeinfop.00405444 00523AE8 803D C1AEB505 02 CMP BYTE PTR DS:[5B5AEC1],2 ; 5B5AEC1 - 05B5AD3C = 185 00523AEF 74 0A JE SHORT exeinfop.00523AFB 00523AF1 B8 F2000000 MOV EAX,0F2 00523AF6 E8 4919EEFF CALL exeinfop.00405444 00523AFB 33C0 XOR EAX,EAX 00523AFD 5A POP EDX 00523AFE 59 POP ECX 00523AFF 59 POP ECX 00523B00 64:8910 MOV DWORD PTR FS:[EAX],EDX 00523B03 68 1D3B5200 PUSH exeinfop.00523B1D 00523B08 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10] 00523B0B BA 03000000 MOV EDX,3 00523B10 E8 8B19EEFF CALL exeinfop.004054A0 00523B15 C3 RETN
可以看出校验了三个东西:程序入口点、区段数和输入表大小。
a) 程序入口点
偏移128处(DWORD)为IMAGE_OPTIONAL_HEADER里的AddressOfEntryPoint;偏移158处(DWORD)为CheckSum,但并非真正的校验和,是EP的副本。
b) 区段数
偏移106处(WORD)为IMAGE_FILE_HEADER里NumberOfSections。
c) 输入表大小
偏移184处(DWORD)为IMAGE_DATA_DIRECTORY里IMAGE_DIRECTORY_ENTRY_IMPORT的Size。
当然,我们在这里再次看到了结束进程调用00405444的身影。
另外,偏移208处(DWORD),即第一个区段IMAGE_SECTION_HEADER里的SizeOfRawData,作者把这个字段清零了。较早的Exeinfo PE v0.0.2.9 598 sign 2011.01.27版本会校验它,但不知为什么这个版本去掉了校验该字段。
3. 去自校验处理
exeinfope.exe的PE Header:
exeinfope_dumped_.exe的PE Header:
a) 程序入口点
对比发现,原文件的Entry Point和CheckSum均为057CF7D0,而脱壳后的文件已改为OEP:0013FAD4,所以需要处理。这里只修改两个字节,将:
00523A79 73 03 JNB SHORT exeinfop.00523A7E
简单地改为:
00523A79 EB 0B JMP SHORT exeinfop.00523A86
b) 区段数
由于我们修复Dump时,没有新增区段,区段数为3,没有变化,不需处理。如果你的区段数有变化,可修改这里:
00523A86 B3 02 MOV BL,2
将2改为你的区段数减1。
c) 输入表大小
修复后,输入表的RVA由057D5114变为0575CFF0,Size由000002C8变为000000DC。需要处理,这里只修改2个字节,将:
00523AD5 803D C0AEB505 C8 CMP BYTE PTR DS:[5B5AEC0],0C8
改为:
00523AD5 803D C0AEB505 DC CMP BYTE PTR DS:[5B5AEC0],0DC
将:
00523AE8 803D C1AEB505 02 CMP BYTE PTR DS:[5B5AEC1],2
改为:
00523AE8 803D C1AEB505 00 CMP BYTE PTR DS:[5B5AEC1],0
就好了!
附件为最后的结果。
文件名:exeinfope_dumped_.7z,MD5:E3CD81C3CEDDE6244EA07C04B29BE610
解开后文件名:exeinfope_dumped_.exe,MD5:E9508BFFABC33D12E59118B04A7BF73E
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
他的文章
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
Sysnap
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
cpfive
aizjcn
WSBEIHOU
星河互动
vresn
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
Sysnap
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
cpfive
aizjcn
WSBEIHOU
星河互动
vresn
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
Sysnap
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
cpfive
aizjcn
WSBEIHOU
星河互动
vresn
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
Sysnap
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
cpfive
aizjcn
WSBEIHOU
星河互动
vresn
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
Sysnap
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
cpfive
aizjcn
WSBEIHOU
星河互动
vresn
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
Sysnap
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
cpfive
aizjcn
WSBEIHOU
星河互动
vresn
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
Sysnap
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
aizjcn
WSBEIHOU
星河互动
vresn
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
hack残心
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
Sysnap
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
cpfive
aizjcn
WSBEIHOU
星河互动
vresn
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
aizjcn
WSBEIHOU
星河互动
vresn
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
hack残心
forlovefor
RandomK
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
cpfive
aizjcn
WSBEIHOU
星河互动
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
hack残心
forlovefor
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
cpfive
aizjcn
WSBEIHOU
星河互动
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
hack残心
forlovefor
谁下载
kanxue
nig
ycloud
曾半仙
cwx
imatc
neo
qweiwei
似曾相识
拍拖
hy2001
mmqiang
moodykeke
LcRcS
o飘o
qffhq
abincn
chenfeng
bootdisk
五德转移
qwsk
wan
aswgl
yeduwuren
lovehaohui
dwbclz
bert
einsteinzl
ASL
ycdear
kunkun
zdhysd
JIN
hacknr
babysoon
陳明展
不问年少
aosemp
ouyangtian
jiangjing
yayayxkf
釜森
scud
theendone
stoy
bjgfs
avbcad
angya
rengood
huangkez
wakaoyun
XPoy
zylzylzyl
babalove
djzbxxz
aizjcn
WSBEIHOU
星河互动
cogito
elfchery
langyashan
残梦飘雪
BMZYNX
warfrog
evilor
wep
oha
haomafan
hehaohw
simplelxf
Beyond陈勇
passlong
深夜寂静
乱世者
buptkick
cxthl
lukarl
isstart
hulucc
Dearyz
cykefu
fanzzbbs
水晶蜗牛
oxlwj
RootSuLe
funexploit
loongzyd
anteng
myppplll
chinhad
wcofen
Kisesy
卧龙轩
qiqiwqiqiw
gyoku
nopnopnop
hack残心
forlovefor
RandomK
看原图