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

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

2010-6-23 11:16
49929
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的解密代码。。。。。。。

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

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

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

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

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

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

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

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

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