由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇)
2008-07-19 18:01
267 查看
这几天,工作特别忙,没空抽出时间来写文章,粗糙之作,还请见谅。
1.名称混淆-反混淆
名称混淆返混淆,基本上是不太可能的事,因为以前的名称已经换掉了,也没有
第二个名称备份表,
所以根本无法还换。
不过,可以把不可见字符转换为可见字符,长字符串换成短字符串。
有两种方法可以做处理:
1.在MetaData中有一个区域叫做_STRING它存放了所有名称字符串,只要修
改这里的内容,即可
,此方法需要对元数据结构特别熟悉
2.如果你对元数据不了解,没关系,你可以用ILDasm把混淆后的程序集反编译
,然后一个一个的对
应改过来,再用ilAsm编译,一样可以达到反混淆的作用
其实,对名于名称来说,真的没有多大用处,不用反混淆也行,免得浪费自己的时间。
2.流程混淆-反混淆
流程混淆,在上面已经给出例子。它才是有用的一种混淆方式。它改变流程的存放序
顺,从而达到静态反编译的功能。(名称混淆还是可以反编译)
不过,不管怎样,他没有办法去阻止读取IL,这就是流程混淆的天生不足。我们来看
看如何对流程反混淆吧。
还是以上面的例子进行操作。
首先特别说明一下:br.s行号br行号都是强行跳转指令,而流程混淆主要是得用
这样的语句进行逻辑连接的。
所以,我们就需要对照着被混淆过的代码,跟着一句一句的逻辑关系,把语句拉出来
重新组合。
组合出来后,代码如下:
其实,反流程混淆也相当的容易,只要按照执行流程加入特定的条件即可以得到代码
的序顺。
为此,我特别写了一个反流程混淆的工具(Deflow)。将上面的代码反混淆后,得到
如下代码:
L_0000:newobjinstancevoid[mscorlib]System.Random::.ctor()
L_0001:stloc.1
L_0002:ldstr""
L_0003:stloc.2
L_0004:ldc.i4.0
L_0005:stloc.0
L_0006:br.sL_0017
L_0007:ldloc.2
L_0008:ldarg.1
L_0009:ldloc.1
L_000A:callvirtinstancefloat64[mscorlib]System.Random::NextDouble()
L_000B:ldarg.2
L_000C:conv.r8
L_000D:mul
L_000E:conv.i4
L_000F:ldelem.u2
L_0010:boxchar
L_0011:callstringstring::Concat(object,object)
L_0012:stloc.2
L_0013:ldloc.0
L_0014:ldc.i4.1
L_0015:add
L_0016:stloc.0
L_0017:ldloc.0
L_0018:ldarg.3
L_0019:ble.sL_0007
L_001A:ldloc.2
L_001B:ret
反流程混淆,并不难,说句实话,它只是一个特征的积累,你不断的分析被混淆后
的特征,然后进行分析,写出反混淆的算法,即可开发出反混淆工具。上面的程序并不长
,你可以手工的进行反混淆,但如果很长,那么反混淆就是一件痛苦的事了,但我只用
Deflow,请请点一下按钮,就可以得到我感兴趣的代码。而且,只要是编程的人,不要
你全面撑握NET什么的知识,只要你对字符串操作特别熟悉,再加上一些些聪明和经验,
反流程混淆不是一件难事。
下面,我给大家介绍我反混淆的步骤:
1.拿到混淆过后的程序集(当然,是流程混淆过的)
2.使用我修改过的Ildasm进行反编译
3.得到一个IL文件(明文格式的文本文件)
4.打开文件,找到自己感兴趣的代码,把那一段方法取出
5.使用Deflow反混淆
6.把反混淆后的代码Copy回去
7.使用ilasm重新编译il文件
8.使用Reflector查看,ok,已经可以显示C#或VB的代码了。
由于,反编译出来的il是明文,所以,只要你对字符串操作比较熟,你就可以做一个
非常完善的针对工程的反混淆工具。反混淆原理就是如此,不管反混淆强度如何改
变,它也无法脱理这个原理,所以即使是流程混淆,也无法保证程序代码的安全性。
这里特别说明一下:Deflow纯属研究性质,所以功能非常有限,我也不会发布和公
开,在研究的过程中发现有些混淆器相当狡猾,它把程序正的跳转和混淆跳转再次
混淆,这种情况,我们有时候必须要手动干涉,不过,这种情况并不会带来多少工
作量。至少我现在还没有手工改过。
总之,反流程混淆的工具,是每个程序员都可以自己行开发的,因为起点太低,任
何人了解原理后都可以对其进行研究,并开发出反混淆的工具。所以,流程混淆并
不理想!
更重要的是,即使流程混淆了,也可以进行反编译,从而,关键代码还是会被修改
并再次发布,危险性依然存在。我就不明白为什么MS要提供ilDasm和ilAsm。这不
是制造木马的好工具吗?把别个的程序反编译,在里面某个铵钮中加入自己的代码。
再编译,打包,当正版发布,神不知,鬼不觉的让你中马,结果机器的主人还要找
软件作者去算账……呵呵,怕怕啊。
下面,我们将介绍一下最新的MaxtoCode的原理。有兴趣的朋友不要错过。
1.名称混淆-反混淆
名称混淆返混淆,基本上是不太可能的事,因为以前的名称已经换掉了,也没有
第二个名称备份表,
所以根本无法还换。
不过,可以把不可见字符转换为可见字符,长字符串换成短字符串。
有两种方法可以做处理:
1.在MetaData中有一个区域叫做_STRING它存放了所有名称字符串,只要修
改这里的内容,即可
,此方法需要对元数据结构特别熟悉
2.如果你对元数据不了解,没关系,你可以用ILDasm把混淆后的程序集反编译
,然后一个一个的对
应改过来,再用ilAsm编译,一样可以达到反混淆的作用
其实,对名于名称来说,真的没有多大用处,不用反混淆也行,免得浪费自己的时间。
2.流程混淆-反混淆
流程混淆,在上面已经给出例子。它才是有用的一种混淆方式。它改变流程的存放序
顺,从而达到静态反编译的功能。(名称混淆还是可以反编译)
不过,不管怎样,他没有办法去阻止读取IL,这就是流程混淆的天生不足。我们来看
看如何对流程反混淆吧。
还是以上面的例子进行操作。
首先特别说明一下:br.s行号br行号都是强行跳转指令,而流程混淆主要是得用
这样的语句进行逻辑连接的。
所以,我们就需要对照着被混淆过的代码,跟着一句一句的逻辑关系,把语句拉出来
重新组合。
组合出来后,代码如下:
L_0000:newobjinstancevoid[ mscorlib] System.Random
::.ctor()
L_0005:stloc.1
L_0006:ldstr""
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_000d:mul
L_000e:conv.i4
L_000f:ldelem.u2
L_0010:boxchar
L_0015:callstring 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_0032:ldloc.0
L_0033:ldarg.3
L_0034:ble.sL_0026
L_0036:ldloc.2
L_0037:ret
其实,反流程混淆也相当的容易,只要按照执行流程加入特定的条件即可以得到代码
的序顺。
为此,我特别写了一个反流程混淆的工具(Deflow)。将上面的代码反混淆后,得到
如下代码:
L_0000:newobjinstancevoid[mscorlib]System.Random::.ctor()
L_0001:stloc.1
L_0002:ldstr""
L_0003:stloc.2
L_0004:ldc.i4.0
L_0005:stloc.0
L_0006:br.sL_0017
L_0007:ldloc.2
L_0008:ldarg.1
L_0009:ldloc.1
L_000A:callvirtinstancefloat64[mscorlib]System.Random::NextDouble()
L_000B:ldarg.2
L_000C:conv.r8
L_000D:mul
L_000E:conv.i4
L_000F:ldelem.u2
L_0010:boxchar
L_0011:callstringstring::Concat(object,object)
L_0012:stloc.2
L_0013:ldloc.0
L_0014:ldc.i4.1
L_0015:add
L_0016:stloc.0
L_0017:ldloc.0
L_0018:ldarg.3
L_0019:ble.sL_0007
L_001A:ldloc.2
L_001B:ret
反流程混淆,并不难,说句实话,它只是一个特征的积累,你不断的分析被混淆后
的特征,然后进行分析,写出反混淆的算法,即可开发出反混淆工具。上面的程序并不长
,你可以手工的进行反混淆,但如果很长,那么反混淆就是一件痛苦的事了,但我只用
Deflow,请请点一下按钮,就可以得到我感兴趣的代码。而且,只要是编程的人,不要
你全面撑握NET什么的知识,只要你对字符串操作特别熟悉,再加上一些些聪明和经验,
反流程混淆不是一件难事。
下面,我给大家介绍我反混淆的步骤:
1.拿到混淆过后的程序集(当然,是流程混淆过的)
2.使用我修改过的Ildasm进行反编译
3.得到一个IL文件(明文格式的文本文件)
4.打开文件,找到自己感兴趣的代码,把那一段方法取出
5.使用Deflow反混淆
6.把反混淆后的代码Copy回去
7.使用ilasm重新编译il文件
8.使用Reflector查看,ok,已经可以显示C#或VB的代码了。
由于,反编译出来的il是明文,所以,只要你对字符串操作比较熟,你就可以做一个
非常完善的针对工程的反混淆工具。反混淆原理就是如此,不管反混淆强度如何改
变,它也无法脱理这个原理,所以即使是流程混淆,也无法保证程序代码的安全性。
这里特别说明一下:Deflow纯属研究性质,所以功能非常有限,我也不会发布和公
开,在研究的过程中发现有些混淆器相当狡猾,它把程序正的跳转和混淆跳转再次
混淆,这种情况,我们有时候必须要手动干涉,不过,这种情况并不会带来多少工
作量。至少我现在还没有手工改过。
总之,反流程混淆的工具,是每个程序员都可以自己行开发的,因为起点太低,任
何人了解原理后都可以对其进行研究,并开发出反混淆的工具。所以,流程混淆并
不理想!
更重要的是,即使流程混淆了,也可以进行反编译,从而,关键代码还是会被修改
并再次发布,危险性依然存在。我就不明白为什么MS要提供ilDasm和ilAsm。这不
是制造木马的好工具吗?把别个的程序反编译,在里面某个铵钮中加入自己的代码。
再编译,打包,当正版发布,神不知,鬼不觉的让你中马,结果机器的主人还要找
软件作者去算账……呵呵,怕怕啊。
下面,我们将介绍一下最新的MaxtoCode的原理。有兴趣的朋友不要错过。
相关文章推荐
- 由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇)
- 由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇)
- 由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇)
- 由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇)
- 由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇)
- 由浅至深 谈谈.NET混淆原理(三)-- 流程混淆
- 由浅至深 谈谈.NET混淆原理 (三)-- 流程混淆(续)
- 由浅至深,谈谈.NET混淆原理 (一)
- 由浅至深 谈谈.NET混淆原理 (三)-- 流程混淆
- 由浅至深 谈谈.NET混淆原理 (三)-- 流程混淆(续)
- 由浅至深 谈谈.NET混淆原理(三)-- 流程混淆(续)
- 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)
- 由浅至深,谈谈.NET混淆原理 (二) 最简单的混淆
- 由浅至深,谈谈.NET混淆原理 (二) 最简单的混淆
- 由浅至深,谈谈.NET混淆原理 [转]
- 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)
- 由浅至深,谈谈.NET混淆原理 (一) [转]
- 由浅至深,谈谈.NET混淆原理 (一)
- 由浅至深 谈谈.NET混淆原理(三)-- 流程混淆
- 由浅至深,谈谈.NET混淆原理 (一)