hyperchem 发表于 2009-5-14 00:40

VMProtect 1.8 Nonag 笔记~

其实没什么技术含量,大家看了以后就觉得简单了。
分享给大家。

其实最开始对Nonag没抱什么希望,今天无意间听ZeNiX说了一句:“那个可能能Nonag”。
我就拿来看了下。果然发现了一些端倪。
简单验证一下,就能看出Nanag对话框的代码是在dll的壳代码里面,这样去nag就有两种思
路:
1,patch 壳代码,nop掉相应代码。
2,脱壳。

对于第一种方法,nop位点比较好找,但是要解决壳的自校验就很麻烦了。估计要patch
CRC或checksum的。如果你研究过的话,就弄下吧~ 反正我不会!

我们走第二个思路。

dll文件加的NP的最新的壳,理论上将脱壳会很困难。

但是,这个dll被Nooby留了一个后门,就是对dll的输入表没有进行任何处理。加壳后的程
序使用就是原来的输入表。这点让我很欣慰。
既然输入表没有处理,那么剩下的一大块就是获取解密的代码了。这个其实很容易的。

1,解密代码和数据
我们直接把dll用OD载入,然后F9运行,等程序运行了,把第一个区段数据弄出来,这个就
是解密后的代码和数据了。
值得一提的是,NP是把整个文件融合成了一个区段,所以dll的code段包含了加壳前的所有
数据。这才是我们需要的,其他的都是壳代码,可以抛弃。
下一步更简单,把得到的数据贴到原文件的第一个区段去。
这里有个地方需要强调一下:
虽然加壳程序使用的是原来的输入表,但是从EP到OEP这段过程中壳 hook几乎所有的IAT。
所以这里需要注意一下,就把代码贴好以后,要把原始IAT表还原。 否则会导致输入表损
坏。
这样呢,我们的工作就完成一大半了。


2,剩下还有两处要修复,OEP和重定位表。
OEP怎么找呢?
有两种方法:
1,是根据语言特点来找。
简单的判断我们就能看出这个dll是用delphi写的。Delphi程序的OEP特点就是在代码段最
下面。OEP上面是初始化函数表。
根据这个特点,可以很轻松找到这里
OEP==1455C
0088455C    3F            aas
0088455D    8BEC            mov ebp,esp
0088455F    83C4 C4         add esp,-3C
00884562    B8 C4448800   mov eax,nooby.008844C4
00884567    E8 C016FFFF   call nooby.00875C2C
0088456C    E8 9FFCFFFF   call nooby._nooby
00884571    E8 9AF8FEFF   call nooby.00873E10
这就是OEP了,只不过被抽走了一个字节。大家都知道这个字节是push ebp。我们直接修复
这里就OK了!
不过这里顺便说一下找这个字节的方法。 OD载入,单步走,走过pushad,然后hr esp,中
断下来以后,走两步就到了Stolen OEP。很容易吧~~ 嘿嘿~~

2,利用对话框找。
用OD载入Dll直接运行,会一次出现两个对话框,一个是nag,一个是提示未找到的对话框

出现第二个对话框以后,F12暂停程序。在堆栈中找被Hook的MessageBoxA这个函数地址。
然后在retn指令上下断点。运行,点击确定。中断下来以后,一层一层的返回,最后我们
就会返回到这里:
0088456C    E8 9FFCFFFF   call nooby._nooby
00884571    E8 9AF8FEFF   call nooby.00873E10----返回到这里。
向上看,就是OEP了!

3,修复重定位表
OK!OEP找到了。剩下就是修复重定位表了。这个东西不知道让壳藏到哪里去了。真不好找
。不管了,重建一份。
Relox这个工具可以通过对比两个基址下的dll文件来重建重定位表。这样我们就需要dump
两个基址下的dll文件。
我们之前获取解密代码是用OD获取的,我们把这个dll dump一份。

第二个怎么弄呢?因为在OD中载入dll的话,基址是始终都不变的。我们之前的方法失效了
。不过还是有变通的。

直接运行VMProtect的主程序,然后程序加载这个dll。这样就一定可以重定位到其他的基
址上去。运行以后,选取VMProtect的进程,找到nooby.dll这个文件,dump下来。
接着就用relox对比文件,然后重建一份重定位表就可以了!

4,修复基址
最后,其实还有一处没有修复。加壳后文件的基址是00400000,但是我们获取的代码是在
OD载入dll以后获取的,所以要把处理过的文件基址修正成为OD载入dll后的基址!
这样就全部修复完成了。替换掉原始文件就Ok了!

是不是很简单呢??
嘿嘿~~

frozenrain 发表于 2009-5-14 00:46

不简单 只能膜拜:PNP原来这么好搞:lol

estelle 发表于 2009-5-14 00:55

不错 不错

zzage 发表于 2009-5-14 01:00

~我是来膜拜的...好强大...好可怕!

小生我怕怕 发表于 2009-5-14 02:00

膜拜下,很强大的文章~~

小生我怕怕 发表于 2009-5-14 02:00

膜拜下,很强大的文章~~

小糊涂虫 发表于 2009-5-14 08:55

高手写出来的文章就是不一样。。。。
我看了半天才看懂一点。。。。。。。

ZeNiX 发表于 2009-5-14 09:15

虽然加壳程序使用的是原来的输入表,但是从EP到OEP这段过程中壳 hook几乎所有的IAT。
所以这里需要注意一下,就把代码贴好以后,要把原始IAT表还原。 否则会导致输入表损
坏。


把原始 IAT 表還原的步驟, 可以再詳細說明一下嗎?

A-new 发表于 2009-5-14 10:10

膜拜一下大牛:$

wellen 发表于 2009-5-14 21:12



把原始 IAT 表還原的步驟, 可以再詳細說明一下嗎?
zenix 发表于 2009-5-14 09:15 http://www.52pojie.cn/images/common/back.gif
我也这样想
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: VMProtect 1.8 Nonag 笔记~