好友
阅读权限40
听众
最后登录1970-1-1
|
其实没什么技术含量,大家看了以后就觉得简单了。
分享给大家。
其实最开始对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了!
是不是很简单呢??
嘿嘿~~ |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|