紫雨轩 .Net, DNGuard HVM , .Net VMProtect

DNGuard HVM - Advanced .NET Code Protection Technology

常用链接

统计

积分与排名

友情连接

最新评论

常见dotNet加密保护工具分析介绍

本文主要介绍一些dotNet加密保护工具的原理以及就其脱壳进行简单探讨。remotesoft protector、maxtocode、.Net Reactor、Cliprotector

、themida .Net、xenocode native compiler、DNGuard。


remotesoft protector

应该是一款比较老的。net加密保护工具了,看其官方网站似乎还是06年更新过。该软件没有提供试用版下载,相关资料比较少。去年接触过一

个该软件保护的.Net程序。加密后的程序发布时需要附带native 的 dll。
这款壳可以算是jit层的壳,是jit wrap 模式,通过hook getJit函数,拦截 jit 请求。在每次发生jit请求时其运行库会将加密的程序集完全

“原地” 解密还原。

特点:整体解密
脱壳:拦截地层jit请求,然后中断。这时程序集已经完全解密,直接pe dump就行了。

 


maxtocode
这个大家应该比较熟悉了,和 remotesoft protector 应该时前后脚起步的关系吧。其1.x,2.x,3.1x和3.2内核有很大差别。
特点:单方法体解密

maxtocode 1.x 版本没有用过,不过DST组的菩提曾经写过 maxtocode 1.x 的脱壳机。

maxtocdoe 2.x 其内核是EE层,单方法体“原地”解密。编译之后再擦除解密的代码。

脱壳:因为是“原地”解密,所以方法体代码逃不过profile的。可以在profile里面记录每个方法体,然后填充到文件中。
方法二:nop 调 其内核 的擦除代码。这个不用修改其内核文件,只要还原 mscorwks。dll 中其hook的第二处地方即可。这样方法体解密后就

在内存中了。所有方法invoke一面,直接pe dump即可。

maxtocode 3.1x,这个版本接触得比较多,我接触的第一个maxtocode版本就是3.10。这一版其内核相对2.x变动比较大。方法体已经不是原地

解密的了,也就是说profile已经不能监视到其il代码了,这算是一个巨大的进步吧。3.1x的内核基本上是一样的,只是后续的版本针对反射做

了一些小动作。

脱壳:直接反射、修复后反射。
方法二:直接调用其内核的解密函数进行脱壳,简单快速。

maxtocode 2007 企业版,Jit层内核 ,其在 ee 层和 jit层均安装了多处 hook。其内核在前面的文章里面有详细介绍。

脱壳:因其jit层内核的漏洞,可以用简单的方式还原方法体。Hook Jit 后可以简单的进行方法体还原完成单个方法的脱壳。
把每个方法都脱一面,填回文件即可。

.Net Reactor
一款很特别的。net加密壳。它有两种模式, application 和 library。
第一种模式 是把 。net程序整体加密,然后创建一个 native的loader。整体加密的脱壳很简单,dump 内存即可。

第二种模式 加密后的程序集也要带一个native的dll。和maxtocode一样,加了很多静态构造函数,一个startup函数。
但是在 startup函数调用后,即完成了程序集的全部“原地”解密。所以运行后直接dump内存就可以了。

脱壳:直接pe dump。

CliProtector
一款jit层的加密壳,大概是去年年底发现的。当时我在进行DNGuard2.0的开发,经分析后发现其内核模式和当时DNGuard 2.0的jit层内核很相似。分析后不久就发现了其jit层内核处理的一个漏洞,可以用简单的方式还原方法体。也就是最近在maxtocode 2007 企业版中发现的那个。在我的DNGuard 2.0 中对这个漏洞进行了预防处理。
个人感觉其模式兼容性比maxtocode 2007企业版要好。只是可惜,它除了有jit层漏洞,还偷了赖,IL代码没有加密,和我出的dnguard 1.0 demo一样,只是把 il搬了一下位置,没有加密。不过对于jit层脱壳来说加不加密倒无所谓了。但这样可能导致破解者从另一个角度去脱壳了。
特点:单方法体解密
脱壳:Jit hook,简单方法体还原, 同maxtocode2007企业版的脱壳方式。
方法二:分析其加密文件结构,直接还原(因其il代码没有加密,可以不用考虑解密算法的研究)。

themida .Net
themida 是win32的一个强壳,它支持 。Net的加密,其加密方式是整体加密,但是凭借其win32 anti的优势,相比其它整体加密的加密工具来说强度要高一点,不过也就仅仅那么一点。

脱壳:过anti,pe dump。

xenocode native compiler
xenocode 的专长是混淆保护,不过它也提供了一个所谓的生成本地代码的功能。其生成本地代码其实就是把 程序集打包,创建一个native loader。但是它的打包把framework都包进去了,也就是说打包后的程序可以在没有安装framework的机器上直接运行,代价是生成的文件体积非常大,因为它把十几兆的framework包进去了。

脱壳:直接pe dump。
方法二:分析其打包的文件格式直接解包(已有工具)。

DNGuard 1.0 内核模式同 maxtocode 3.1x。脱壳方式也雷同。

DNGuard 2.0 Jit层内核,同maxtocode 2007企业版和CLIProtector。相比少了一个漏洞,不能用简单方式还原方法体。
如果破解者对jit内核工作非常熟悉,也能从jit层的结构体中重构出方法体。

脱壳:Jit hook 结构体重构模式。

总结:
以上除了 maxtocode 3.x, DNGuard, CLiProtector 外,其它工具加密的程序都存在profile漏洞,可以通过profile获取代码。

综合兼容性和强度 CLiProtector 和 maxtocode 2007 企业版 要好一些。
DNGuard 2.0的强度好一些,兼容性比较差,就只支持 v2.0.50727.42 的framework。

DNGuard新版已经开始采用兼容全部framework的模式了。

上面的所有工具加密的程序集,都可以直接在jit层中截获 IL字节码。 IL字节码不是方法体,它是方法体的一部分。
只取得il字节码无法完成脱壳工作,但是已可反为MSIL汇编代码,进行算法分析了。

DNGuard HVM的目标就是不让jit层截获可分析的IL字节码。

 

 


 

posted on 2007-07-27 22:46 紫雨轩 .Net 阅读(3459) 评论(19)  编辑 收藏 网摘 所属分类: 破文

评论

#1楼 2007-07-27 23:09 culturenet

好文。学习!   回复  引用    

#2楼 2007-07-28 02:47 hal[未注册用户]

very helpful   回复  引用    

#3楼 2007-07-28 09:17 biglee

学习学习   回复  引用    

#4楼 2007-07-28 11:14 try      

@安贝
不应该攻击人身吧.
楼主只是进行技术上的分析.虽然不了解这么内核的东西,不过还是要顶一个.
  回复  引用  查看    

#5楼 2007-07-28 13:09 毁于随      

超强大....厉害.   回复  引用  查看    

#6楼 2007-07-28 13:35 ddr888      

mark   回复  引用  查看    

#7楼 2007-07-28 17:15 Jason.NET      

对 MaxtoCode 根本没研究清楚就站出来胡说八道,实是在看不下去了。Rick人品真是好啊,一直以来攻击 MaxtoCode 来推广自己的产品,玩文字游戏,实在是非常人所谓,早已超出技术研究范围,商业气氛浓厚,同时你不实的语言在你完全商业化后,就形成了带有商业目地的谤诽。劝你一心研究技术,好事为之,要想推广自己的产品用正常的方法,别把中国式的精华全吸在你一人身上,相信你这种小技俩大家都能看到眼里。

另外,文字游戏中别避中就轻,等你 HVM 出来,我也帮你写篇分析,让你知道什么叫文笔。

  回复  引用  查看    

#8楼 2007-07-28 20:36 Anders.Zhao      

不会要开始打墨水仗了吧??   回复  引用  查看    

#9楼[楼主] 2007-07-28 21:17 瑞克      

maxtocode的全部详细情况,我的确是没有都去研究。但是对于怎么脱壳被maxtocode加密的程序集,我文章中说的都是实事。可以如实的告诉你Jit层简单方式还原方法体的脱壳机,已经做出半成品了,只是没有兴趣再把它做成全自动的脱机。你如果有怀疑可以放一个sample上来。
另外你说我没有研究清楚不知是否“特指”对元数据的那个特别处理。

我对这些工具包括dnguard,都做了如实客观的介绍,对dnguard没有任何浮夸的部分。

律人者先律己,你自己看看maxtocode官方网站上的介绍有多少语言不是“不实的言论”。包括你之前指责别人是误导消费者的言论,也同样出现在了maxtocode的官方网页。别人用就是误导消费者,那它在maxtocode官方网页算什么呢?你自己翻翻你以前写的那些文章。

如果你想继续做好maxtocode的商业化,建议你把精力放在混淆保护上,绝大多少企业客户都只需要混淆保护,混淆对他们来说基本上足够了。对加密保护需求更多的是那些个人共享软件作者和一些小公司。
  回复  引用  查看    

#10楼 2007-07-28 22:55 超晨      

我是MAXTOCODE的用户,从3.x版本用过来的,我有发言权。
事物总有两面性,当初选择MAXTOCODE,没有办法,因为当时只有他做得最好。但3.1以后当时有几个版本,reflector居然可以反编译MAXTOCODE的代码,将我公司的代码算法彻底暴露在竞争对手面前,无论如何,这个对我们伤害很大。所以我提醒大家,不要过于相信这些加密公司,加密和解密是互博的游戏而已,真正能阻止悲剧上演的是MS大人,只要他把这方面的基础工作做了,还需要我们劳神什么呢??不信你试试用反编译工具看看.net下C++的代码,能看出什么吗?每当想起这些,心里总不免XX微软X次,真不厚道!

另外,MAXTOCODE在当时代码被反编译后,对用户连道歉的话都没有,直接抛出类似这是不可避免的话,让我心理暗想:你要不是NB哄哄的说保证安全,我还买你的产品干嘛啊?!
昨天又看了一下MAXTOCODE的新政策,更让人寒心,600买的用户只有5个月的升级时期,我就纳闷了,同样是软件公司,MS对于自己产品安全的问题是可以升级的,WINXP,VISTA各自升级自己的安全问题。而你的产品却把安全问题和功能升级放到了一起,你这不是硬逼着用户时时向你上供么?

时下的新销售政策,我感觉MAXTOCODE正在把潜在用户推向对手产品中去,而让正式用户有寒心的感觉。哪像以前很自豪啊,看,我的算法没人能看见!现在,代码被看了没人理你。

听我一句劝,不要太节约成本,把产品放到硬件加密狗上,这个可以真正保护你的产品。加密只是短期解决不被人看到算法的问题,如果你不是以算法为主的软件,没必要使用,毕竟要把反编译的代码COPY到工程里面将是十分浩大的工程,WEBFORM更是无从说起。

所以不是不能用,不要期望太高。唯一期望就是MS自己搞定就是烧高香了。

JASON不要说我攻击你的产品,其实我想匿名发言,只不过重新注册很麻烦,况且当时你们的产品问题给予的解释的确不负责,连升级程序的承诺这种托词都没有,确实伤了用户的心。

  回复  引用  查看    

#11楼 2007-07-28 22:59 超晨      

另外说句公道话,MAXTOCODE公司当时没有删除留言版上的内容,我觉得这点做得很对,如果哪天你们看不到这个留言版了,基本上肯定就是用户意见太多了,或者说公司就是不想认真解决用户问题了,呵呵。   回复  引用  查看    

#12楼 2007-07-29 08:12 fannee[未注册用户]

xenocode 混淆exe时有output compression,pe dump也取不到正确的内容,main函数都找不到,估计main函数由本地代码代替,目前我还没找到方法。   回复  引用    

#13楼 2007-07-29 08:40 fannee[未注册用户]

程序集类load一个字节数组执行一个程序集的方法不能采用pe dump方法,只有取到字节数组的内存地址才可dump,Nspack壳就是这一类。另外希望你能将你的jit hook 的工具共享出来,这个可能是目前网上唯一的类似功能工具,这个工具要比反射脱壳机实用得多。   回复  引用    

#14楼 2007-07-29 12:19 随风流月      

LINQ,特别是 XLinq 或者 Lambda 都是天然的混淆器。   回复  引用  查看    

#15楼[楼主] 2007-07-29 20:31 瑞克      

pe dump需要找对程序集的加载基址。 这个信息可以在profiler中获取到。
native的方法,可以通过一个方法句柄,得到clr的模块句柄,然后可以得到模块的基址。用反射load字节组的也一样。
你可以试试 用发射枚举一个appdomain中的所有程序集,如果load在不同domain的可能需要先枚举domain。
  回复  引用  查看    

#16楼 2007-07-30 10:04 fannee[未注册用户]

你的意思是字节数组加载的程序集可以枚举一个appdomain中的所有程序集,或不同domain的程序集取得?
  回复  引用    

#17楼 2007-07-30 10:19 fannee[未注册用户]

xenocode 混淆exe时的output compression功能是否比较特别,毕竟人家是有名的混淆器,我猜测解开的程序集还会调用他的壳内部方法,就是说程序集被混淆时代码也做了手脚,你帮我分析看看是不是这样,例子:http://61.153.12.150/oa/test.exe   回复  引用    

#18楼[楼主] 2007-08-04 19:54 瑞克      

这个是用反射加载的,主程序只是一个loader。类似reflector的第一层保护方式。   回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 834172




相关文章:

相关链接: