.net core dll 套壳加密_[.Net]详解ConfuserEx的Anti Tamper与Anti Dump

本文详细介绍了ConfuserEx的Anti Tamper和Anti Dump保护机制。Anti Dump通过清除元数据和阻止搜索关键标志防止Dump,而Anti Tamper采用原地解密模式,修改RVA指向加密数据并在运行时解密。分析了这两个保护的实现原理,并提供了AntiTamper Killer的静态脱壳机下载链接。
摘要由CSDN通过智能技术生成

请把优秀的文章分享出去,让更多人学习。

关注本公众号,精彩多多!

(点击上面“飘云阁”即可关注)

详解ConfuserEx的Anti Tamper与Anti Dump

许多人都知道利用dnSpy单步调试+Dump+CodeCracker的一系列工具可以脱去ConfuserEx壳,这些在网上都有教程,但是并没有文章说明过背后的原理。本文讲尽可能详细解说ConfuserEx的Anti Tamper与Anti Dump(有耐心并且了解一点点的PE结构完全可以看懂)

1.1 ConfuserEx整个项目结构

在开始讲解之前,我们大概了解一下ConfuserEx项目的结构。
我们用Visual Studio打开ConfuserEx,项目大概是这样的:

4062b63fabf205457dbd1e03387ab9b1.png

Confuser.CLI的是命令行版本,类似de4dot的操作方式
Confuser.Core是核心,把所有部分Protection组合到一起
Confuser.DynCipher可以动态生成加密算法
Confuser.Protections里面包含了所有Protection,这是需要研究的部分
Confuser.Renamer可以对类名、方法名等重命名,包括多种重命名方式,比如可逆的重命名,这些没有在ConfuserEx的GUI里面显示就是了
Confuser.Runtime是运行时,比如Anti Dump的实现,其实就在这个项目里面。上面提到的Confuser.Protections会把Confuser.Runtime中的Anti Dump的实现注入到目标程序集。
ConfuserEx是GUI,没必要多说。整个项目几乎没什么注释,下面的中文注释均为我添加的。

1.2 Anti Dump

Anti Dump比起Anti Tamper简单不少,所以我们先来了解一下Anti Dump。
Anti Dump的实现只有一个方法,非常简洁。
我们找到Confuser.Protections项目的AntiDumpProtection.cs。

0b2c69da182d295fe2e8c52e0edf7450.png

protected override void Execute(ConfuserContext context, ProtectionParameters parameters) {
    
TypeDef rtType = context.Registry.GetService().GetRuntimeType("Confuser.Runtime.AntiDump");
// 获取Confuser.Runtime项目中的AntiDump类
var marker = context.Registry.GetService();
var name = context.Registry.GetService();
foreach (ModuleDef module in parameters.Targets.OfType()) {
IEnumerable members = InjectHelper.Inject(rtType, module.GlobalType, module);
// 将Confuser.Runtime.AntiDump类注入到目标程序集,返回目标程序集中的所有IDnlibDef
MethodDef cctor = module.GlobalType.FindStaticConstructor();
// 找到::.cctor
var init = (MethodDef)members.Single(method => method.Name == "Initialize");
cctor.Body.Instructions.Insert(0, Instruction.Create(OpCodes.Call, init));
// 插入call void Confuser.Runtime.AntiDump::Initialize()这条IL指令
foreach (IDnlibDef member in members)
name.MarkHelper(member, marker, (Protection)Parent);
// 将这些IDnlibDef标记为需要重命名的
}
}

AntiDumpProtection做的只是注入,所以我们转到Confuser.Runtime中的AntiDump.cs

8e2e30dce216e95ba782a631e1e0f6a6.png

static unsafe void Initialize() {
    
uint old;
Module module = typeof(AntiDump).Module;
var bas = (byte*)Marshal.GetHINSTANCE(module);
byte* ptr = bas + 0x3c;
// 存放NT头偏移的地址
byte* ptr2;
ptr = ptr2 = bas + *(uint*)ptr;
// ptr指向NT头
ptr += 0x6;
// ptr指向文件头的NumberOfSections
ushort sectNum = *(ushort*)ptr;
// 获取节的数量
ptr += 14;
// ptr指向文件头的SizeOfOptionalHeader
ushort optSize = *(ushort*)ptr;
// 获取可选头的大小
ptr = ptr2 = ptr + 0x4 + optSize;
// ptr指向第一个节头

byte* @new = stackalloc byte[11];
if (module.FullyQualifiedName[0] != ' {
// 这里判断是否为内存加载的模块(dnSpy里面显示InMemory的),比如Assembly.Load(byte[] rawAssembly)
// 如果是内存加载的模块,module.FullyQualifiedName[0]会返回""
//VirtualProtect(ptr - 16, 8, 0x40, out old);
//*(uint*)(ptr - 12) = 0;
byte* mdDir = bas + *(uint*)(ptr - 16);
// ptr指向IMAGE_COR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值