首页
社区
课程
招聘
[分享]破解DNGuard HVM的一些感悟,和大家分享!!
发表于: 2010-6-23 11:16 51128

[分享]破解DNGuard HVM的一些感悟,和大家分享!!

2010-6-23 11:16
51128

HVM版本 v3.2.5.0  这个版本应该没加DNGuard吹嘘的虚拟机的保护 (不过也无非是些IL替换之类的东东  

<1>首先用CFF打开, 发现元数据比较乱, 函数名也是些乱码。 感觉不太对 , 然后用Asmex.exe这个工具打开看看(个人认为Asmex.exe比CFF 要好),发现#~变成了#- , MethodPtr也存在!!!  原来CFF存在这个BUG ,无法解析非压缩的元数据!!
<2>看看Method->RVA这个元数据项,发现很多地址都指向一个地方。 但有一些函数 RunHvm ,Startup函数肯定是真实的RVA。 不用跟踪,也知道这个几个函数是加载运行时的。 故先不去管它 (无非是在.cctor里加入指令之类的弱智伎俩)。
<3>用Windbg加载调试一下, 这个出问题了。 HVM加了反调试! 真是够火大的。。。。  退出,先启动程序,然后用Windbg Attach。。 呵呵!在几个点下断点  mscorwks!_CorExeMain ,mscorjit!jitNativeCode  , 这里有个技巧, 因为HVM替换了mscorjit!CILJit::compileMethod 这个编译函数,所以,我们在更深层的地方也就是mscorjit!jitNativeCode下断。 根据mscorjit!jitNativeCode的定义 我们发现该函数里有一个参数是这样的,
typedef struct _tagCORINFO_METHOD_INFO
{
        MethodDesc*                ftn;
        VOID *                        scope;
        BYTE *                      ILCode;
        unsigned                    ILCodeSize;
        unsigned short            maxStack;
        unsigned short            EHcount;
        CorInfoOptions            options;
        CORINFO_SIG_INFO      args;
        CORINFO_SIG_INFO      locals;
}CORINFO_METHOD_INFO;
这个不用我再说了吧, ILCode和ILCodeSize已经够我们用了。 如果,还想获取更多的信息, 可以用ftn这个东东。。。。这里要注意的是 ILCode这个东东,并不是函数的RVA, 要还原函数的RVA, 需要根据ILCode这个偏移,向前推。 分析函数的Tiny , FAT的函数头, 找出函数的真正的RVA。 这里还有个技巧, 用分析出的这个RVA,在程序里用UE查找。 可以发现一个表。 用来存放函数的真实的RVA的表。 剩下的不用我说了吧。。。
<4>最让我气愤的是HVM居然FAT的函数头中的LocalVarSigTok也替换成了一个0xFF002061类似之类的东东。 我们知道LocalVarSigTok是用来描述函数的局部变量的一个TOKEN ,它指向StandAloneSig ,StandAloneSig 然后又指向#Blob流。 在上一步中,我们获取了一个CORINFO_METHOD_INFO得参数,可以看到里面有个locals的项,在jitNativeCode里,它应该是指向一个正确的#Blob的Sig数据。关于CORINFO_METHOD_INFO的定义如下:
typedef struct _tagCORINFO_SIG_INFO
{
        CorInfoCallConv         callConv;
        VOID *                                                                        retTypeClass;   // if the return type is a value class, this is its handle (enums are normalized)
        VOID *                                                                        retTypeSigClass;// returns the value class as it is in the sig (enums are not converted to primitives)
        CorInfoType             retType : 8;
        unsigned                flags   : 8;    // used by IL stubs code
        unsigned                numArgs : 16;
        CORINFO_SIG_INST                                sigInst;  // information about how type variables are being instantiated in generic code
        VOID *                                                                        args;
        VOID *                                                                        sig;
        VOID *                                                                        scope;          // passed to getArgClass
        DWORD                                                                                token;
}CORINFO_SIG_INFO;
CORINFO_SIG_INFO 里面的sig就是指向#Blob的真实的LocalVarSigTok的值。 剩下的就是列举StandAloneSig ,对比每一个TOKEN的值是否和sig一样,然后算出TOKEN的值,最后将LocalVarSigTok替换成0x11000001之类的StandAloneSig TOKEN值。
<5>最后就是要去除HVM的元数据混淆。 这个也有个技巧,先用PEVerify这个工具,验证一下HVM加过密的恶心东东, 会发现一堆元数据错误。  基本是些越界之类的,或者是函数名为空。 把出错的元数据表项去除就OK了。  不过让我更惊喜的是,我这个程序居然加了dotfuscator的混淆,难道。。。。  哎!!!!
<6>可以用ILDASM打开了。  剩下的,就是你改IL代码了。 呵呵。。。。

最后要严重鄙视一下Rick, 你写的壳垃圾就垃圾吧,干嘛还加人家VMP的壳。  就你的那些元数据重排,加.cctor, 替换jit->mscorjit!CILJit::compileMethod函数,加密LocalVarToken ,等等唬人的伎俩,大家心知肚明。 何必自欺欺人呢???? 你的混淆做的不过关就算了, 干嘛还用dotfuscator?

欢迎Rick你出来批评指正!! 我接受你如何形式的质问!!!

最后要表达一下我对VMP的敬佩,本人跟踪VMP的一个解密函数2天,楞是没还原出程序执行流程。 哎。 惭愧啊。
关于第四步中的还原,我补充一下。 本人写了一个DLL , 用来在程序启动的时候HOOK jitNativeCode  这个内核函数。 然后枚举LocalVarToken 。 因为实在无法分析出VMP的解密代码。。。。。。。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (20)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
2010-6-23 11:23
0
雪    币: 504
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
这篇文章好,我也在研究这鬼东东
2010-6-23 17:33
0
雪    币: 337
活跃值: (74)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
关注!分析的很棒.留个脚印.
2010-6-23 21:50
0
雪    币: 83
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
低声问一下,第五点,怎样把出错的元数据表项去除,用什么工具?希望得到大师指点,谢谢!
2010-6-24 07:31
0
雪    币: 21
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
元数据的去除,现在外面基本没有工具,至少我是没发现。  基本就是改一个元数据头里的64bit的标志位,然后在表项里删除就好了。 我现在用代码,呵呵。
2010-6-24 09:23
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习了!感谢楼主
2010-6-24 09:50
0
雪    币: 83
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
大师,能否给个带有图片的说明怎样去除,谢谢。
2010-6-24 11:16
0
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
9
看你的分析好像是试用版加密的程序。
以前试用版的数据实际上是明文存储的,没有真正加密。3.5的试用版才开始对数据进行简单加密。
2010-6-24 12:29
0
雪    币: 21
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
呵呵,Rick的意思是正式版没有VMP了? 另外

<1>对于元数据那块,我不知道你还能搞成什么样?

<2>至于HVM 所谓的虚拟机保护功能, clix已经一目了然了。 我不想再说什么?

最后,呼吁Rick发一个HVM所谓的企业版保护的.NET程序, 让大家看看到底是什么东东 ?
2010-6-24 13:17
0
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
11
.net 保护无非就是元数据处理,IL代码变换。再整一些加密什么的。

对混淆相信现在研究的人很多,反混淆也就是处理元数据和IL。对于.Net程序来说,元数据和IL就是它的全部。

我怎么看楼主的语气似乎对我有意见啊,印象中好像没有和楼主打过交道,不知什么地方得罪了。
2010-6-24 13:24
0
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
12
不知楼主是VMP驻中国区销售,很抱歉。

没有盗版的问题。
2010-6-24 14:23
0
雪    币: 21
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
呵呵!!!

可以便宜,让你保护你的DNGuard HVM .NET保护工具!!
2010-6-24 14:42
0
雪    币: 505
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持原创,进来学习
2010-6-26 17:24
0
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
交流交流,学习了!
2010-7-14 08:52
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
支持一下,学习~
2010-7-14 08:56
0
雪    币: 172
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习。。期待LZ新的DNGuard文。
2010-8-17 00:41
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
VMP有加壳水印,直接把它VMP加壳样本发给VMP作者就能确定HVM作者是不是正版
2010-8-18 14:30
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
怎么我现在才看到这个,顶一下。
2011-2-20 22:52
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
另外,我刚看到论坛有一个VMPDebuger的帖子
http://bbs.pediy.com/showthread.php?t=126892
好久都不来看雪了, 好多新东西。。。。
2011-2-20 22:56
0
雪    币: 126
活跃值: (44)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习了。DNG也很厉害。
2018-3-9 08:45
0
游客
登录 | 注册 方可回帖
返回
//