由浅至深 谈谈.NET混淆原理 (三)-- 流程混淆(续)

流程混淆 ( 二 )

由于昨天发布 MaxtoCode ,所以没有时间写随笔。

本来是没有这一篇的,但想了想,觉得自己讲得太肤浅,怕有的朋友听不懂,所以决定在流程混淆里再讲一篇。这次我们拿 XenoCode 的混淆算法来进行一次详细的讲解。

XenoCode 可能是需要保护自己软件的朋友最常用的混淆工具,他的流程混淆算法是怎样的呢?(有的叫做 控制流程模糊,其实原理都一样)

首先,我再次申明,制造混淆最常用的方式是跳转指令。它就是把原有的代码结构错位,再用跳转指令把原有的执行逻辑连接起来。见上一篇文章的表。而跳转指令有强形跳转如: C# 中的 goto ,也有逻辑跳转,如 C# 中的 if (a==0){goto ?} 等,如果在混淆中充分利用这些技术,混淆的程序将相当复杂,反混淆器将更加困难。还好 XenoCode 使用的仅仅是 goto ,而没有包含逻辑跳转在其中。(当然,如果有逻辑跳转,也可以写出反混淆器,因为必须模式是一样的,总要有条件,比方说: a == 0 才跳,这一句就必须跳,所以 a 必须恒等于 0 ,那么在逻辑处理的前面肯定有 a 置 0 的语句,满足这两个条件,我们就可以判断这是一个破坏条件的条件,名进行恢复)

好,这次我们主要分析 XenoCode 是如何来进行流程混淆的,你也可以手工校仿,不过效率并不高。

我们还是来看上篇文章的代码:

.method private hidebysig instance string CreatePassword(char[] xb97f21c4af3d3653, int32 x37f140bfe992d2c4, int32 x6ad44599b278247e) cil managed { // Code Size: 56 byte(s) .maxstack 4 .locals ( int32 num1, [mscorlib]System.Random random1, string text1) L_0000: newobj instance void [mscorlib]System.Random::.ctor() L_0005: stloc.1 L_0006: ldstr "" L_000b: br.s L_0021 L_000d: mul L_000e: conv.i4 L_000f: ldelem.u2 L_0010: box char L_0015: call string string::Concat(object, object) L_001a: stloc.2 L_001b: ldloc.0 L_001c: ldc.i4.1 L_001d: add L_001e: stloc.0 L_001f: br.s L_0032 L_0021: stloc.2 L_0022: ldc.i4.0 L_0023: stloc.0 L_0024: br.s L_0032 L_0026: ldloc.2 L_0027: ldarg.1 L_0028: ldloc.1 L_0029: callvirt instance float64 [mscorlib]System.Random::NextDouble() L_002e: ldarg.2 L_002f: conv.r8 L_0030: br.s L_000d L_0032: ldloc.0 L_0033: ldarg.3 L_0034: ble.s L_0026 L_0036: ldloc.2 L_0037: ret }

 

分析一下其中的 br.s 指令,( br.s 指令是强跳指令)我们可以得出一个结论:

L_000b: br.s L_0021 L_001f: br.s L_0032 L_0030: br.s L_000d

这三个是重要跳转指令,其算法如下:

序号

源代码块

序号

新代码块

1

块 1

1

块 1

2

块 2

2

块 4

3

块 3

3

块 3

4

块 4

4

块 2

这是什么意思呢?

从方法的头尾开始分析,直至中间分析完毕。尾部的基本上就是头部的代码,头部的也有尾部的代码,互相交错,从而实现混淆,一般的反编译器只能对此 Say No 了。

如果你要手工混淆你的代码,你需要做以下几件事:

•  把源代码分成几块

•  把这么几块的顺序打乱

•  用 br.s 对这几块的顺序进行连接,并保护执行达到原来的逻辑

•  重新计算行号

这样,你就能拥有自己的流程混淆了。如果你加入真真假假的逻辑跳转来混淆,强度将会更大。

下一篇,我们讲讲反流程混淆的工作,其实,反流程混淆就是从混淆中找到共同点,并对其进行重新整理,而混淆都有共同点,即使存在特殊情况,也可以用手工来辅助处理。混淆安全吗?你马上就可以知道结果。

赶时间之作,如有错误,请见谅。欢迎各位朋友进行讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值