吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 27126|回复: 86
收起左侧

[原创] VMProtect 1.8 Nonag 笔记~

  [复制链接]
hyperchem 发表于 2009-5-14 00:40
其实没什么技术含量,大家看了以后就觉得简单了。
分享给大家。

其实最开始对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了!

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

免费评分

参与人数 1威望 +1 收起 理由
zzage + 1 欢迎讨论交流,[吾爱破解]有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

frozenrain 发表于 2009-5-14 00:46
不简单 只能膜拜:PNP原来这么好搞
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

我也这样想
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 10:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表