摘要:.Net 框架提供的基础类库中并没有枚举AppDomains的功能,只提供了获取当前执行代码所在的AppDomain功能。
...
基础类库中并没有枚举AppDomains的功能,那是否可以在C#中实现呢?...
阅读全文
摘要:.Net 2.0开始提供了两个混淆相关的属性,ObfuscationAttribute 和 ObfuscateAssemblyAttribute 。
为开发者提供一种批注二进制文件的方法,以便混淆处理工具能够使用最少的外部配置正确处理这些二进制文件。
混淆处理工具就处理每个对象时就需要判断这个对象是否有这样的属性,如果有还需要把属性的参数值读取出来。然后进行相应处理。
阅读全文
摘要:在 net 2.0 中 ngen 能生成 native code 的 image,但是它同时会保留原始程序集的 MetaData 和ILCode 。
这就是还原的关键。同样的,知道了还原方法后加强保护也很容易实现。
阅读全文
摘要:本文将在 .Net 反射脱壳机核心源代码 的基础上介绍,实现 Jit层脱壳机 的一些思路 以及加密壳在这方面可能采取的加强方式。
阅读全文
摘要:本文主要介绍一些dotNet加密保护工具的原理以及就其脱壳进行简单探讨。remotesoft protector、maxtocode、.Net Reactor、Cliprotector
、themida .Net、xenocode native compiler、DNGuard。
阅读全文
摘要:提到 .Net 的保护,首推就是混淆保护了,而名称混淆基本上是所有混淆保护工具都具有的功能。
可以说不支持名称混淆的工具称不上混淆保护工具。
对于混淆保护,大家有一个认识,就是 混淆是一个不可逆的过程。而加密保护是一个可逆的过程。
名称混淆真的完全不可逆吗?答案是否定的。
名称混淆有一部分是可以精确还原的。
.Net的名称混淆在 剖析DotNet的名称混淆保护技术 中有详细介绍。今回注意介绍名称混淆中可逆的部分,以及还原的方法。
阅读全文
摘要:程序采用的 VS2003 c++/mfc 编写。使用了frame work 2.0 的api。这个是从DNGuard HVM的手动名称混淆功能中剥离出来的副产品。可以用来协助手动 进行名称 混淆/反混淆 。名称混淆不是完全不可逆的,就目前的混淆工具来说,还有部分是可逆的。界面:screen.width*0.6) {this.width=screen.width*0.6;this.alt='此图已经...
阅读全文
摘要:之前发了一个实验品
http://bbs.pediy.com/showthread.php?t=45184
功能还不完善,这个是完整的版本。
能脱压缩壳,整体加密壳,有反射漏洞的加密壳。
阅读全文
摘要:在前面介绍mscorwks的时提到了,.net的程序是以函数为单位编译。而在 mscorjit中提供了一个函数
compileMethod 。mscorwks就是通过调用这个函数来编译.Net方法的。
对于EE层,或者虚拟机预处理层的加密壳,只需要hook这个函数就可以dump出方法体的代码了。
需要注意一点,这个函数是 thiscall 调用约定的。
.Net方法体进入 compileMethod 之后是怎么样的处理流程呢?
阅读全文
摘要:本文主要对 《.Net 反射脱壳机核心源代码 》一文代码的原理和使用进行详细介绍。
首先介绍一下代码主要流程:
入口函数
void DumpAssembly(Assembly ass,string path)
枚举所有type,调用
void DumpType(Type tp, BinaryWriter sw)
枚举所有方法,调用
void DumpMethod(MethodBase mb, BinaryWriter sw)
{
MethodBody mbd = mb.GetMethodBody();
if (mbd == null)
return;
SetOffset(sw, mb.MetadataToken);
WriteHeader(sw, mbd);
WriteILCode(sw, mbd);
WriteSEH(sw, mbd);
}
阅读全文
摘要:入口函数
void DumpAssembly(Assembly ass,string path)
枚举所有type,调用
void DumpType(Type tp, BinaryWriter sw)
枚举所有方法,调用
void DumpMethod(MethodBase mb, BinaryWriter sw)
{
MethodBody mbd = mb.GetMethodBody();
if (mbd == null)
return;
SetOffset(sw, mb.MetadataToken);
WriteHeader(sw, mbd);
WriteILCode(sw, mbd);
WriteSEH(sw, mbd);
}
阅读全文
摘要:今天一个朋友拿一个OA系统程序让我看是什么加密壳。
这个壳还是第一次遇到,anti ildasm,anti 反射。
reflector 和9ray的工具都不灵。
很有特色的名称混淆"o10l1o0l"。
但是从库的导出表来看似曾相识。
阅读全文
摘要:mscorwks.dll是dotNet的核心文件,尤其是在net2.0中,以前分散的功能都集中到了这个dll中。
net1.1中,还有一个文件mscorsvr.dll 和 mscorwks.dll 是同等地位的。
它们分别对应于 windows service程序以及 desktop 程序。
在net2.0中,它们都统一到了 mscorwks。dll中。
同时在net2.0中mscorsn.dll 的功能也合并到了 mscorwks.dll中。
EE层的加密壳,其工作的核心也是和 mscorwks.dll 密切相关的。
阅读全文
摘要:学习过了名称混淆,最近又看了一些字符串加密方面的东西。
在混淆保护和加密壳中都有字符串加密保护功能。
总体上字符串加密可以分为两类,
第一类是混淆保护中的字符串加密技术。主要特征是修改代码执行路径。
大部分混淆保护工具的字符串加密都是这一类。
第二类就是加密壳中的字符串加密技术。这种不用修改IL代码,直接对元数据中的字符串加密。
阅读全文
摘要:混淆在目前的DotNet保护中占主流地位。名称混淆是最基础的混淆保护技术。
DotNet加密保护工具MaxToCode也在最近的更新中加入了部分混淆保护功能---名称混淆。
我们先谈谈名称混淆技术,名称混淆从本质上可以分为两类。
阅读全文
摘要:这段时间在测试.Net Jit的容错性,为了方便,就直接将代码插入到Jit中进行测试了。
这个种方式就是我前面介绍DNGuard时提到的第一种增加内核强度防反射脱壳的方法。
这种技术即可用在dotnet代码的保护上,也可以用在dotnet加密壳的解密上。
DNGuard 2.0的内核使用的就是Jit层,容错性测试差不多了。
DNGuard目前的内核基调就不会再调整了。
接下来就要着手DNGuard H-VM的试验和测试了。这个也是纯Jit层的。(H = half)
DNGRuntime在运行时动态还原程序集,进行程序集方法的拆分(即一个方法被拆分为两个或多个),
拆分后的方法差不多是一半走jit,一半走DNG H-VM。
遵循如下约定:
如果方法A走Jit,则被方法A所调用的方法都走 DNG H-VM。
阅读全文
摘要:自从.Net 2.0的新特性被公开用来获取IL代码后,加密壳就成了鸡肋。
就如tankaiha所说“.net下逆向暂时没啥新东西可搞,某软件的版本升级是一次不如一次强”,由于先天不足,这成了加密壳强度的一个瓶颈。
但是还有相当一部分人认为1.1的程序集加密后是安全的。
阅读全文
摘要:在 .Net程序加密的原理及解密探讨三(实例解密) 一文中我们介绍了反射,
主要提到三个函数
DumpAssembly,DumpType, DumpMethod。
这里我们将就 DumpMethod 这个函数讨论。
前一篇我们已经提到的dump的整体流程。
先把PE整体dump出来,然后在文件后面增加一个段。
接下来就是这次要讲的反射和方法体重建。
阅读全文
摘要:正如前面提到的DotNet 程序的脱壳和普通PE文件的脱壳是有密切关系的。
传统PE文件dump大部分都是进程外dump,这里我们介绍的DotNet程序集的脱壳
使用进程内dump。
所以第一步就是注入问题,如何让我们的程序在目标进程内运行?
传统的win32 注入dll,相信大家都熟悉了吧,
得益于C++/CLI的特性,我们能依靠传统的方式注入我们的程序到目标进程中。
阅读全文
摘要:本次脱壳的测试对象是CodeLib 2 V14.9.2468.42911 更新日期是2006-10-5 目前的最新版本。
运行脱机程序到如下界面:
选中列表中的第二项,codelib.exe,选择一个保存路径,点击dump按钮,即可完成脱壳。
脱壳完的程序保存到codedump.exe。
注意这个文件是直接dump脱壳的结果,不能直接运行。
使用ildasm 反编译,然后打开il文件
查找 IL_0000: call void InFaceMaxtoCode::Startup()
替换为 //IL_0000: call void InFaceMaxtoCode::Startup()
即取消对 maxtocode 运行库的引用。
然后运行 ilasm 编译成exe文件。
放在codelib的安装目录中即可正常运行了
阅读全文