1.        名称混淆 - 反混淆

名称混淆返混淆,基本上是不太可能的事,因为以前的名称已经换掉了,也没有第二个名称备份表,所以根本无法还换。

不过,可以把不可见字符转换为可见字符,长字符串换成短字符串。

有两种方法可以做处理:

1.   在MetaData中有一个区域叫做 _STRING 它存放了所有名称字符串,只要修改这里的内容,即可,此方法需要对元数据结构特别熟悉

2.   如果你对元数据不了解,没关系,你可以用ILDasm把混淆后的程序集反编译,然后一个一个的对应改过来,再用ilAsm编译,一样可以达到反混淆的作用

其实,对名于名称来说,真的没有多大用处,不用反混淆也行,免得浪费自己的时间。

2.        流程混淆 - 反混淆

流程混淆,在上面已经给出例子。它才是有用的一种混淆方式。它改变流程的存放序顺,从而达到静态反编译的功能。(名称混淆还是可以反编译)

不过,不管怎样,他没有办法去阻止读取IL,这就是流程混淆的天生不足。我们来看看如何对流程反混淆吧。

还是以上面的例子进行操作。

首先特别说明一下: br.s 行号 br 行号 都是强行跳转指令,而流程混淆主要是得用这样的语句进行逻辑连接的。

所以,我们就需要对照着被混淆过的代码,跟着一句一句的逻辑关系,把语句拉出来重新组合。

组合出来后,代码如下:

 
      L_0000: newobj instance void [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.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_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_0032: ldloc.0 
      L_0033: ldarg.3 
      L_0034: ble.s L_0026
      L_0036: ldloc.2 
      L_0037: ret 

其实,反流程混淆也相当的容易,只要按照执行流程加入特定的条件即可以得到代码的序顺。

为此,我特别写了一个反流程混淆的工具(Deflow)。将上面的代码反混淆后,得到如下代码:

L_0000: newobj instance void [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.s L_0017

L_0007: ldloc.2

L_0008: ldarg.1

L_0009: ldloc.1

L_000A: callvirt instance float64 [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: box char

L_0011: call string string::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.s L_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的原理。有兴趣的朋友不要错过。

转载于:https://www.cnblogs.com/yuanlei347/archive/2011/01/13/1934238.html

由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇)相关推荐

  1. 支持向量机原理(四)SMO算法原理

    支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五) ...

  2. 木桶原理与反木桶原理及数学论证

    目录 一.木桶原理 二.反木桶原理 三.数学论证 1.简单论证 2.相对论证 3.思考 木桶原理与反木桶原理是我们生活中非常熟知的理论, 一.木桶原理 木桶原理:指一个由若干木板构成的木桶,其容量取决 ...

  3. 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)

    新一代NET代码保护工具 MaxtoCode 的原理简介 MaxtoCode作为新一代保护工具,他有绝对优于目前所有NET代码保护工具的强度,是目前最保护强度最高的解决方案.但它也有缺点,最大的缺点即 ...

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

    好,水喝完了,呵呵,可能时间有点久--<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office& ...

  5. Android混淆编译、反混淆、反编译

    混淆编译 为了保护APK代码和架构,不轻易被外部人员反编译和破解,对发布的APK,所以必须进行代码混淆编译. Java 是一种跨平台的.解释型语言,Java 源代码(.java文件)编译成中间&quo ...

  6. 电路原理仿真测试软件,测试工具篇-运放测试电路仿真《TINA-TI》

    ©版权声明:本文为[看我哒 www.kanwoda.com]原创文章,转载时请注明出处! 出门向左,感谢Jerry Gao的分享<测试基础篇-电容与电感对电流测试的影响>,文中介绍了用LT ...

  7. js反混淆还原工具_SATURN反混淆框架

    本文为看雪论坛精华文章 看雪论坛作者ID:梦野间 摘要:近几年,软件的混淆强度一直在不断提升.基于编译器的混淆已经成为业界事实上的标准,最近的一些论文也表明软件的保护方式使用的是编译器级别的混淆. 在 ...

  8. JavaScript 反混淆的一般套路和技巧[起][承][转][结]

    https://www.blackglory.me/javascript-deobfuscate-general-routines-and-tips-chapter-1/ 最近发现网上没有什么专门深入 ...

  9. JavaScript中函数作用域之精辟,函数原理的浅入深出,及程序执行预编译之通天编译???

    1.程序执行的前一刻会先将代码预编译一遍,如果有语法错误则直接终止程序运行 //预编译之通天编译 --> 在执行的前一刻,会把文件通天扫描一遍 /** //预编译 函数整体提升(即函数会放到程序 ...

最新文章

  1. 64位 ubuntu android studio gradle 权限不够 缺少文件和权限导致
  2. 脑电分析系列[MNE-Python-4]| MNE中数据结构Evoked及其对象创建
  3. CCNP实验+笔记(完整版)
  4. 数据库原理上机实验内容报告代码
  5. Oracle学习(1)——BLOCK
  6. P4550-收集邮票【期望dp】
  7. c位边上还有什么位_【一点资讯】那些有趣而搞笑的GIF动画:为让出c位,站边上拍照还是谦虚礼貌的 www.yidianzixun.com...
  8. linux搭建SonarQube代码质量平台_Oracle 最新详细版本
  9. Xcode 静态库调试策略
  10. 【ZOJ 1964】【尺取】Bound Found【暑期 No.3】
  11. iso硬盘安装 凤凰os_phoenix os安装全教程 凤凰系统进不去安装注意事项
  12. JOB DESCRIPTION
  13. 如何将“\”替换为任意字符
  14. 山东标梵网站制作项目启动流程详解
  15. 计算机网络—CSMA/CD协议
  16. Java - 谷歌邮箱发送邮件详解
  17. 多线程 4——线程通信、线程池、定时器
  18. “芯片”三国之ARM篇:乱世枭雄曹孟德
  19. 找个程序员做男朋友好难啊
  20. 2022高考数学第六题,代码实现(怀念以前的时光)

热门文章

  1. NeurIPS 2020 | 腾讯 AI Lab 解读机器学习及计算机视觉方向入选论文
  2. 仅用语音生成人体姿态,代码已开源
  3. CV 加持的工业检测,从算法选型到模型部署
  4. AAAI 2020 | 首个使用 NAS 设计的 GCN,达到动作识别SOTA,代码将开源
  5. 格灵深瞳发起 AI · 爱 算法 在线编程挑战赛
  6. 用Python把github上非常实用的数据全部抓取下来! 留给自己备用
  7. pytorch错误解决 | 错误‘Widget Javascript not detected. It may not be installed or enabled properly.‘
  8. 后缀的形容词_玩转英语词汇-词汇策略之形容词后缀
  9. 从数学基础到贝叶斯理论到实践——深度AI科普团队
  10. Bezier(贝塞尔)曲线的轨迹规划在自动驾驶中的应用(一)