上次发贴求助的没人回复,这回把我手脱VMP壳的记录发上来,咱新手讨论一下,希望对自己有点帮助。
第一步,当然是查壳了,用peid0.94查壳,yoda's Protector v1.02 (.dll,.ocx) -> Ashkbiz Danehkar (h) [Overlay] * 。。。。。没查出来什么壳,可能是比较新的壳,或者我工具旧了。
换下工具吧这回换Exeinfo0.18,显示结果Warning , section maybe protected with VMProtect ?。。。。。可能是vmp壳,那就百度一下相关资料吧!
即然不确定,那就手脱一下吧(反正是不会,就乱来吧!)
第二步,od载入文件,先运行一下看看=====结果直接蓝屏了,我那个郁闷了!说明一下,我的是win732位,经过百度之后发现跟系统有关系,
OK,咱换成XP2的系统(用虚拟机),再次尝试OD运行======这回不蓝屏了,直接重启电脑,我寒,好吧,这壳可能检测到我的OD了,
那怎么办呢,我就想换个OD看看吧!换了个其他版本的OD,这回不蓝屏也不重启了,可OD运行不起来,直接到了停止。--------------不知道你们碰到这情况会怎么办!
这回我不管了,直接单步跟一下吧!----------------小二上代码。。。。。。。。。来啦~~~!
\\F8单步跟一下
005DBFC6 > 50 push eax \\打开时停这
005DBFC7 C70424 418BF8CF mov dword ptr ss:[esp],CFF88B41
005DBFCE E8 4E790900 call 程序.00673921 \\这么近的call跟进去没错
005DBFD3 AC lods byte ptr ds:[esi]
005DBFD4 ^ 7F 96 jg short 程序.005DBF6C
005DBFD6 F0:27 lock daa ; 不允许锁定前缀
005DBFD8 C9 leave
005DBFD9 76 78 jbe short 程序.005DC053
005DBFDB 57 push edi
-----------------------------------------------------------------------------
\\F7单步跟进005DBFCE E8 4E790900 call 程序.00673921
00673921 C60424 8C mov byte ptr ss:[esp],8C
00673925 C70424 D6BA36E4 mov dword ptr ss:[esp],E436BAD6
0067392C 9C pushfd
0067392D 60 pushad
0067392E 60 pushad
0067392F 9C pushfd
00673930 8D6424 48 lea esp,dword ptr ss:[esp+48]
00673934 E9 CDD70100 jmp 程序.00691106
.............................
00691106 E8 50020000 call 程序.0069135B \\这个call飞了,所以第二次F7进去
---------------------------------------------
0069135B 60 pushad
0069135C 60 pushad
0069135D 894424 40 mov dword ptr ss:[esp+40],eax
00691361 9C pushfd
00691362 68 7E5A227E push 7E225A7E
00691367 877424 44 xchg dword ptr ss:[esp+44],esi
0069136B 5E pop esi
0069136C E8 45080000 call 程序.00691BB6 \\这个call飞了,F7进去
---------------------------------------------
00691BB6 ^\E9 83E0FFFF jmp 程序.0068FC3E \\这是向上跳的
00691BBB 8945 04 mov dword ptr ss:[ebp+4],eax \\选择这,F4
00691BBE 60 pushad
00691BBF 9C pushfd
00691BC0 8F4424 24 pop dword ptr ss:[esp+24]
00691BC4 8D6424 24 lea esp,dword ptr ss:[esp+24]
\\00691BB6 ^\E9 83E0FFFF jmp 程序.0068FC3E这一句是向上跳的,看资料都说脱壳时只向下,不让他向上,不管怎么样,反正我信了,选择下一行按F4
---------------------------------------------
\\运行一下居然直接跳到这里
00476075 90 db 90
00476076 90 db 90
00476077 90 db 90
00476078 90 db 90
00476079 F7 db F7
0047607A F3 db F3
0047607B 5B db 5B ; CHAR '['
0047607C 64 db 64 ; CHAR 'd'
0047607D 89 db 89
0047607E 18 db 18
0047607F 83 db 83
---------------------------------------------
\\看天草的视频曾经出现碰到些代码处右键分析一下,我做了,分析完就是如下代码
00476075 90 nop
00476076 90 nop
00476077 90 nop
00476078 90 nop
00476079 . F7F3 div ebx
0047607B . 5B pop ebx
0047607C . 64:8918 mov dword ptr fs:[eax],ebx
0047607F . 83C4 04 add esp,4
00476082 . 3C 00 cmp al,0
00476084 . 0F85 97000000 jnz 程序.00476121
0047608A . E9 8B000000 jmp 程序.0047611A
0047608F . 8B4C24 04 mov ecx,dword ptr ss:[esp+4]
00476093 . 8B5424 0C mov edx,dword ptr ss:[esp+C]
---------------------------------------------
\\到这我就不知道该怎么办了,右键查找所有参考文本,看到已经出现很多之前没有的文本了,那我就想着这里会不会是已经到程序代码部份了?怎么办才好呢!!
\\经过无数的折腾,我直接找到这软件下的未加壳的小软件看一下然后直接用这没壳的oep来试一下(这两个程序是同一款的,而且是同一个语言编写的,没人教我只好乱来了!)
\\未加壳的程序头如下
---------------------------------------------
0040E839 > $ 6A 74 PUSH 74
0040E83B . 68 100A4100 PUSH 程序1.00410A10
0040E840 . E8 F3010000 CALL 程序1.0040EA38
0040E845 . 33DB XOR EBX,EBX
0040E847 . 895D E0 MOV DWORD PTR SS:[EBP-20],EBX
0040E84A . 53 PUSH EBX ; /pModule => NULL
0040E84B . 8B3D 50014100 MOV EDI,DWORD PTR DS:[<&KERNEL32.GetModu>; |kernel32.GetModuleHandleA
0040E851 . FFD7 CALL EDI ; \GetModuleHandleA
---------------------------------------------
\\接着我直接在刚刚的代码处搜索所有序列,写入push 74(这代码特别,我看各大主要程序入口都不是这样的,怎么他的是这样,这是VC++7.0的程序,看人家写的不是push ebp的吗?不管了,就当是这个吧!)然后找出了很多个,我一个一个进去看了,发现有一个是最像的
---------------------------------------------
0048C1DA . 6A 74 push 74
0048C1DC . 68 68BE4A00 push 程序.004ABE68
0048C1E1 . E8 6EFEFFFF call 程序.0048C054
0048C1E6 . 33DB xor ebx,ebx
0048C1E8 . 895D E0 mov dword ptr ss:[ebp-20],ebx
0048C1EB . 53 push ebx ; /pModule => NULL
0048C1EC . 8B3D 98724900 mov edi,dword ptr ds:[497298] ; |kernel32.GetModuleHandleA
0048C1F2 . FFD7 call edi ; \GetModuleHandleA
---------------------------------------------
\\这时候我又纠结了,我是现在直接dump呢,还是在运行一次到这再dump呢,两个都弄吧,反正也不会,dump完一次,然后在push 74下硬件执行断点,再重新运行到这时再dump一次!
\\用的是LordPE,选择程序先修正镜像大小,再完整转存,
\\接着用import reconstructor V1.7修复一下,选择od中的程序进程,在oep处填入oep的相对地址也就是0048C1DA-00400000=0008C1DA 按自动查找IAT,OK有找到!然后再获取输入表,接着点无效函数提示有4个函数无效,尝试修复一下,修复不了,我就直接减了。接着便是转储到刚刚dump的文件。
---------------------------------------------
\\接着便是用peid再次查壳 显示Microsoft Visual C++ v7.1 EXE *
\\我那个开心呀,运行这么好?搞了两天终于乱搞出来了!
\\然后我双击试一次,我愁了,啥反应也没有,就鼠标忙了一下,接着就关闭了!这雷打得蛋疼
\\于是我再百度一下,根据百度资料显示,可能是程序有自校验,故无法运行起来!
---------------------------------------------
于是od转入刚刚脱完壳的文件
按照各个大师的教程、手记,来进行一次一次的操作!折腾了两三天,最后无果而终!
好吧,我认输了!先学习一下基础知识以后再看吧!
说了这么多,我这刚学的菜鸟肯定有很多地方说的是错的,希望能得到各位的指点,做个菜鸟不容易,做个没头没脑的菜鸟更不容易!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)