首页
社区
课程
招聘
[旧帖] [原创]一个菜鸟的VMP脱壳笔记 0.00雪花
发表于: 2011-12-15 19:07 4194

[旧帖] [原创]一个菜鸟的VMP脱壳笔记 0.00雪花

2011-12-15 19:07
4194
上次发贴求助的没人回复,这回把我手脱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期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
顺便再把找到的OD几种脱壳方法发一下,给有须要的人看看

方法一:单步跟踪法

1.用OD载入

2.单步向下跟踪按F8,实现向下的跳.不让程序往回跳.

3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)

4.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易运行.

5.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入.

6.一般遇到很大的跳转(跨段跳),比如 jmp XXXXXX 或 JE XXXXXX 或有
RETN的一般很快就会到程序的OEP。

方法二:ESP定律法

1.开始就点F8向下走,注意观察OD右上角的寄存器中ESP有没突现(变成红色)

2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者是hr XXXXXXXX),按回车!

3.选中下断的地址,断点--->硬件访--->WORD断点。

4.按一下F9运行程序,直接来到了跳转处,按下F8向下走,就到达程序OEP。

方法三:内存镜像法

1.用OD打开,设置选项——调试选项——异常,忽略所有异常(也就是把里面的忽

略全部√上),然后CTRL+F2重载下程序!

2.按ALT+M,打开内存镜象,找到程序的第一个.rsrc.按F2下断点,然后按

SHIFT+F9运行到断点.

3.接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE,按F2

下断点!然后按SHIFT+F9,直接到达程序OEP!

方法四:一步到OEP(部分壳适用)

1.开始按Ctrl+F,输入:popad,然后按下F2下断,按F9运行到此处.

2.很快来到大跳转,按F8向下走,来到OEP.

方法五:最后一次异常法:

第一步:用OD打开程序,点击选项——调试选项——异常,把里面的√全部去掉

!CTRL+F2重载下程序.

第二步:接着我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数n.

第三步:重载程序,再按SHIFT+F9,这次按的次数为上次让程序运行时的次数的

n-1次.

第四步:此时观察OD的右下角有一个"SE 句柄",这时我们按CTRL+G,输入SE 句

柄前的地址!来到这个地址.

第五步:在这里,按F2下断点!然后按SHIFT+F9来到断点处!

第六步:这时候我们已经跳过了所有异常,然后去掉断点,按F8慢慢向下跟踪很

快就到达OEP了
2011-12-15 19:09
0
雪    币: 180
活跃值: (1313)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
不好意思我不懂,菜鸟飘过。那些脱课方法原理不知道你弄懂没
2011-12-15 19:14
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
原理有些明白有些不明白,方法是有了,还要靠大量的练习来熟悉这些方法,我更菜鸟,我才刚学!
2011-12-15 19:54
0
雪    币: 261
活跃值: (1282)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2011-12-15 20:23
0
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错,都是高手
2011-12-16 10:16
0
雪    币: 334
活跃值: (70)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
楼主倒腾的是XX棋牌游戏大厅吗?
2011-12-16 19:39
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
是的,倒过的人就知道
2011-12-17 13:58
0
雪    币: 203
活跃值: (258)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
看看,学习下,谢谢分享
2011-12-17 14:17
0
游客
登录 | 注册 方可回帖
返回
//