首页 > 养蜂技术 > 软件开发 > 其他

养蜂技术正文

由浅至深 谈谈.NET混淆原理(三)

湖北天马养蜂场2010-03-16 11:04:14其他2082

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

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

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

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

.methodprivatehidebysiginstancestringCreatePassword(char[]xb97f21c4af3d3653,int32x37f140bfe992d2c4,int32x6ad44599b278247e)cilmanaged
{
     //CodeSize:56byte(s)
     .maxstack4
     .locals(
           int32num1,
           [mscorlib]System.Randomrandom1,
           stringtext1)
     L_0000:newobjinstancevoid[mscorlib]System.Random::.ctor()
     L_0005:stloc.1
      L_0006:ldstr""
     L_000b:br.sL_0021
     L_000d:mul
      L_000e:conv.i4
      L_000f:ldelem.u2
      L_0010:boxchar
     L_0015:callstringstring::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.sL_0032
     L_0021:stloc.2
      L_0022:ldc.i4.0
      L_0023:stloc.0
      L_0024:br.sL_0032
     L_0026:ldloc.2
      L_0027:ldarg.1
      L_0028:ldloc.1
      L_0029:callvirtinstancefloat64[mscorlib]System.Random::NextDouble()
     L_002e:ldarg.2
      L_002f:conv.r8
      L_0030:br.sL_000d
     L_0032:ldloc.0
      L_0033:ldarg.3
      L_0034:ble.sL_0026
    L_0036:ldloc.2
      L_0037:ret

}

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

     L_000b:br.sL_0021
     L_001f:br.sL_0032
     L_0030:br.sL_000d

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

序号

源代码块

序号

新代码块

1

1

1

1

2

2

2

4

3

3

3

3

4

4

4

2

这是什么意思呢?

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

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

1.       把源代码分成几块

2.       把这么几块的顺序打乱

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

4.       重新计算行号湖北天马养蜂场,加我们的微信一起学养蜂。

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

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