关于dotNet加密工具
我一直用的是Xenocode Postbuild 2006 Profession(呵呵,比较老了,只是随便处理下,防不了高手),可是,最近Windows更新些不知什么内容,弄得我三台电脑上都无法正常运行这个软件了,没办法,只好上网重新找资料。找到些不错文章,转载一下,可能对初学者有用!
1、常见dotNet加密保护工具分析介绍 (转自:http://www.cnblogs.com/Athrun/archive/2008/04/23/1168368.html)
本文主要介绍一些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字节码。
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字节码。
2、.NET Reactor 通用脱法总结(转自:http://bbs.pediy.com/showthread.php?p=413886)
.NET Reactor 通用脱法总结
Writer by KuNgBiM/[CCG]
Email: kungbim@163.com
Date: February 05, 2008
Debuger Tools: OllyICE、CFF Explorer
Statement: 该篇文章也算是学习.NET Reactor脱壳的小小总结吧。
-----------------------------------------------------------------------------------------
【脱壳】
.NET Reactor 的Sign有点特殊性,PEiD查壳为:Borland Delphi 6.0 - 7.0 [Overlay]
OllyICE加载目标程序,并忽略所有异常选项,Shift+F9运行:
Alt+M 打开内存镜像,Ctrl+B 搜索UNICODE字符 --> “Kurapica UnpackME #1”
大概3次后找到:
038B535E 4B 00 75 00 72 00 61 00 70 00 69 00 63 00 61 00 K.u.r.a.p.i.c.a.
038B536E 20 00 55 00 6E 00 70 00 61 00 63 00 6B 00 4D 00 .U.n.p.a.c.k.M.
038B537E 45 00 20 00 23 00 31 00 00 41 31 00 36 00 32 00 E. .#.1..A1.6.2.
038B538E 30 00 34 00 31 00 31 00 32 00 2D 00 31 00 31 00 0.4.1.1.2.-.1.1.
038B539E 38 00 32 00 30 00 2D 00 39 00 36 00 32 00 32 00 8.2.0.-.9.6.2.2.
038B53AE 32 00 2D 00 32 00 36 00 35 00 32 00 31 00 2D 00 2.-.2.6.5.2.1.-.
038B53BE 38 00 37 00 30 00 32 00 34 00 01 41 57 00 65 00 8.7.0.2.4.AW.e.
038B53CE 6C 00 6C 00 20 00 64 00 6F 00 6E 00 65 00 20 00 l.l. .d.o.n.e. .
把拉动条直接拉到顶部找到:
038B0000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ?..
038B0010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ?@.
038B0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .
038B0030 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 €
038B0040 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ?.???L?Th
038B0050 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno
038B0060 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS
038B0070 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 mode.$.
038B0080 50 45 00 00 4C 01 04 00 87 5F 8B 47 00 00 00 00 PE..L.嘷婫.
038B0090 00 00 00 00 E0 00 0E 21 0B 01 08 00 00 50 00 00 .?!..P..
038B00A0 00 50 00 00 00 00 00 00 8E 6A 00 00 00 20 00 00 .P巎 ..
038B00B0 00 80 00 00 00 00 40 00 00 20 00 00 00 10 00 00 .€.@.. ..
在038B0000处右键“备份” ---> “保存数据到文件” ---> 保存为“_038B0000.exe”
【小提示】OllyICE默认保存数据格式为“*.mem”,所以我们这里直接保存为“*.exe”文件格式即可!
【修正元数据RVA及SIZE】
CFF Explorer打开我们dump出来的文件“_038B0000.exe”:
依次选择:
①Nt Headers ---> File Header ---> Characteristics ---> 反选“File is a DLL” ---> OK
②Address Converter ---> 搜索“BSJB”找到偏移为“000037AC” ---> 填入“File Offest”
我们得到“Meta Data RVA”:
RVA = 000047AC
③.NET Directory ---> Meta Data RVA ---> 填入得到的RVA“000047AC”
④Optional Header ---> Data Directories [x] ---> Import Directory RVA (Value) ---> 得到“00006A40”
计算出Meta Data SIZE:
Meta Data SIZE = Import Directory RVA - Meta Data RVA
0x6A40 - 0x47AC = 0x2294
Meta Data RVA = 000047AC
Meta Data SIZE = 00002294
以上修正完毕后保存运行即可!
.NET Reactor v3.6.0.0 的脱法也是一样的。
【脱壳方法总结】
OllyICE工作:
⑴加载待脱壳目标,运行后在内存中查找目标程序窗口句柄的标志的UNICODE字符串,并向上找到PE格式文件头标识信息;
⑵待找到PE格式文件头标识信息后,转储备份内存抓取的文件;
CFF Explorer工作:
⑴打开转储备份内存抓取后的文件,根据情况而修正文件的Characteristics;
⑵查找标识“BSJB”,计算并转换得出Meta Data RVA并修正;
⑶根据Import Directory RVA及Meta Data RVA,计算出Meta Data SIZE并修正;
⑷保存收工!
-----------------------------------------------------------------------------------------
特别感谢提供.NET相关文章的作者(排名不分先后):tankaiha、tracky、UFO-Pu55y、Rongchaua
-----------------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
上传的附件
文件类型: rar Unpacking_.NET_Reactor.rar (2008-02-05 10:24, 390.7 KB, 30 次下载)
Writer by KuNgBiM/[CCG]
Email: kungbim@163.com
Date: February 05, 2008
Debuger Tools: OllyICE、CFF Explorer
Statement: 该篇文章也算是学习.NET Reactor脱壳的小小总结吧。
-----------------------------------------------------------------------------------------
【脱壳】
.NET Reactor 的Sign有点特殊性,PEiD查壳为:Borland Delphi 6.0 - 7.0 [Overlay]
OllyICE加载目标程序,并忽略所有异常选项,Shift+F9运行:
Alt+M 打开内存镜像,Ctrl+B 搜索UNICODE字符 --> “Kurapica UnpackME #1”
大概3次后找到:
038B535E 4B 00 75 00 72 00 61 00 70 00 69 00 63 00 61 00 K.u.r.a.p.i.c.a.
038B536E 20 00 55 00 6E 00 70 00 61 00 63 00 6B 00 4D 00 .U.n.p.a.c.k.M.
038B537E 45 00 20 00 23 00 31 00 00 41 31 00 36 00 32 00 E. .#.1..A1.6.2.
038B538E 30 00 34 00 31 00 31 00 32 00 2D 00 31 00 31 00 0.4.1.1.2.-.1.1.
038B539E 38 00 32 00 30 00 2D 00 39 00 36 00 32 00 32 00 8.2.0.-.9.6.2.2.
038B53AE 32 00 2D 00 32 00 36 00 35 00 32 00 31 00 2D 00 2.-.2.6.5.2.1.-.
038B53BE 38 00 37 00 30 00 32 00 34 00 01 41 57 00 65 00 8.7.0.2.4.AW.e.
038B53CE 6C 00 6C 00 20 00 64 00 6F 00 6E 00 65 00 20 00 l.l. .d.o.n.e. .
把拉动条直接拉到顶部找到:
038B0000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ?..
038B0010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ?@.
038B0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .
038B0030 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 €
038B0040 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ?.???L?Th
038B0050 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno
038B0060 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS
038B0070 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 mode.$.
038B0080 50 45 00 00 4C 01 04 00 87 5F 8B 47 00 00 00 00 PE..L.嘷婫.
038B0090 00 00 00 00 E0 00 0E 21 0B 01 08 00 00 50 00 00 .?!..P..
038B00A0 00 50 00 00 00 00 00 00 8E 6A 00 00 00 20 00 00 .P巎 ..
038B00B0 00 80 00 00 00 00 40 00 00 20 00 00 00 10 00 00 .€.@.. ..
在038B0000处右键“备份” ---> “保存数据到文件” ---> 保存为“_038B0000.exe”
【小提示】OllyICE默认保存数据格式为“*.mem”,所以我们这里直接保存为“*.exe”文件格式即可!
【修正元数据RVA及SIZE】
CFF Explorer打开我们dump出来的文件“_038B0000.exe”:
依次选择:
①Nt Headers ---> File Header ---> Characteristics ---> 反选“File is a DLL” ---> OK
②Address Converter ---> 搜索“BSJB”找到偏移为“000037AC” ---> 填入“File Offest”
我们得到“Meta Data RVA”:
RVA = 000047AC
③.NET Directory ---> Meta Data RVA ---> 填入得到的RVA“000047AC”
④Optional Header ---> Data Directories [x] ---> Import Directory RVA (Value) ---> 得到“00006A40”
计算出Meta Data SIZE:
Meta Data SIZE = Import Directory RVA - Meta Data RVA
0x6A40 - 0x47AC = 0x2294
Meta Data RVA = 000047AC
Meta Data SIZE = 00002294
以上修正完毕后保存运行即可!
.NET Reactor v3.6.0.0 的脱法也是一样的。
【脱壳方法总结】
OllyICE工作:
⑴加载待脱壳目标,运行后在内存中查找目标程序窗口句柄的标志的UNICODE字符串,并向上找到PE格式文件头标识信息;
⑵待找到PE格式文件头标识信息后,转储备份内存抓取的文件;
CFF Explorer工作:
⑴打开转储备份内存抓取后的文件,根据情况而修正文件的Characteristics;
⑵查找标识“BSJB”,计算并转换得出Meta Data RVA并修正;
⑶根据Import Directory RVA及Meta Data RVA,计算出Meta Data SIZE并修正;
⑷保存收工!
-----------------------------------------------------------------------------------------
特别感谢提供.NET相关文章的作者(排名不分先后):tankaiha、tracky、UFO-Pu55y、Rongchaua
-----------------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
上传的附件
文件类型: rar Unpacking_.NET_Reactor.rar (2008-02-05 10:24, 390.7 KB, 30 次下载)