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

现在继续来讲混淆,我们讲到那了?? 哦,流程混淆~~

流程混淆感觉和移形换位、乾坤大挪移有点象……好象已经说过……

为什么这么说呢?因为,流程混淆就是移来移去,达到让你看不懂流程的原理来进行的。

在此,我还要介绍一些其它的知识。由于NET的特性,所以,动态调试NET的全部过程几乎是不可能的,所以,静态分析成为了NET的首选。那么,对付静态分析最好的办法是什么呢?在远古的C时代就已经有这种方法了(混淆其实一点也不新鲜,都是旧技术换个名称而以),那时,这种技术叫作花指令。当然流程混淆和花指令还是有区别的,不过我想,基础的原理也算是差不多了。

什么是花指令?

好,我用汇编构建一段代码如下:

00410070 >/$ 8BEC           MOV EBP,ESP

00410072  |. 6A 00          PUSH 0                                   ; /pModule = NULL

00410074  |. E8 310A0000    CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA

00410079  |. A3 B0004200    MOV DWORD PTR DS:[4200B0],EAX

0041007E  |. A3 24004200    MOV DWORD PTR DS:[420024],EAX

00410083  |. E8 160A0000    CALL <JMP.&KERNEL32.GetCommandLineA>     ; [GetCommandLineA

00410088     90             NOP          《- 注意这里

00410089     90             NOP

0041008A     90             NOP

0041008B     90             /NOP

0041008C     90             NOP

0041008D     90             |NOP

0041008E     90             |NOP

0041008F     90             NOP

00410090     90             |NOP

00410091     90             NOP          《- 还有这里

00410092  |. C705 20004200 >|MOV DWORD PTR DS:[420020],loaddll.00420>;  ASCII "Missing DLL name"

0041009C  |. E9 EB010000    |JMP loaddll.0041028C

004100A1  |> 3C 22          |CMP AL,22

004100A3  |.^75 E6          \JNZ SHORT loaddll.0041008B

004100A5  |> 8A06           /MOV AL,BYTE PTR DS:[ESI]

004100A7  |. 3C 20          |CMP AL,20

004100A9  |. 75 03          |JNZ SHORT loaddll.004100AE

004100AB  |. 46             |INC ESI

004100AC  |.^EB F7          \JMP SHORT loaddll.004100A5

修改了一下:

00410070 >/$ 8BEC           MOV EBP,ESP

00410072  |. 6A 00          PUSH 0                                   ; /pModule = NULL

00410074  |. E8 310A0000    CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA

00410079  |. A3 B0004200    MOV DWORD PTR DS:[4200B0],EAX

0041007E  |. A3 24004200    MOV DWORD PTR DS:[420024],EAX

00410083  |. E8 160A0000    CALL <JMP.&KERNEL32.GetCommandLineA>     ; [GetCommandLineA

00410088     EB 08          JMP SHORT loaddll.00410092                   《- 注意 已经没有00410092

0041008A     2910           SUB DWORD PTR DS:[EAX],EDX

0041008C     F8             CLC

0041008D     60             PUSHAD

0041008E     99             CDQ

0041008F     F8             CLC

00410090     E8 E8C70520    |CALL 2046C87D

00410095     0042 00        ADD BYTE PTR DS:[EDX],AL

00410098  |? 59             POP ECX

00410099  |? 0142 00        ADD DWORD PTR DS:[EDX],EAX

0041009C  |. E9 EB010000    |JMP loaddll.0041028C

004100A1  |> 3C 22          |CMP AL,22

004100A3  |.^75 E6          \JNZ SHORT loaddll.0041008B

004100A5  |> 8A06           /MOV AL,BYTE PTR DS:[ESI]

004100A7  |. 3C 20          |CMP AL,20

004100A9  |. 75 03          |JNZ SHORT loaddll.004100AE

004100AB  |. 46             |INC ESI

004100AC  |.^EB F7          \JMP SHORT loaddll.004100A5

这就叫做花指令,花指令就是利用跳转或其它的一些指令,并在这此指令中间制造一些无法看懂的代码,使反汇编出来的东西摸不着头脑,并且产生错误的句语(动态跟踪就不会受花指令的影响)从而达到混淆静态反汇编的功能。

那么流程混淆到底是什么呢?

原理基本上是一样,即把方法中的代码分为几段,并把每一段都错开,然后利用“跳转”语句连接原来的流程逻辑,并达到执行正确的目地。原理图如下表所示:

块编号

块代码

1

第一个功能

2

第二个功能

3

第三个功能

4

第四个功能

块编号

块代码

跳转

1

第一个功能

Jmp 2

4

第四个功能

3

第三个功能

Jmp 4

2

第二个功能

Jmp 3

基本流程混淆原理即是上表所示,总结就以下这么几个字:破坏原有程序结构,并利用Jmp语句接连原有流程。

基于上面原理所说,所以流程混淆是肯定会耗费资源的。而且,有些特殊的过程,可能在混淆后不能正常使用了,我以前就碰上一个,具体情况记不太清楚,不过第一次运行结果正确,第二次就不正确了,使用DBGCLR跟踪去看,发现第一次执行正常,而第二次则未执行。由于时间非常紧迫,所以未更深入的研究原因所在,当不混淆此方法后,一切正常。

流程混淆是目前各大厂商的混淆利器的最高境界,带有流程混淆的混淆器,基本售价都是上千美元,合人民币近万元。这么高的金额代价之下,它的强度是不是已经能够达到我们的需要了呢?呵呵。这个问题,我们在下一章里再来讨论吧。

附一段 IL 流程混淆前后的代码,明天拿它开刀。

C#源:

private string CreatePassword(char[] passwords,int arraylenghts,int lenghts)

{

int i;

Random RndNumber = new Random();

string return_value="";

for(i=0;i<=lenghts;i++)

{

return_value=return_value+passwords[(int)(RndNumber.NextDouble()*arraylenghts)];

}

return(return_value);

}

IL源:

.method private hidebysig instance string CreatePassword(char[] passwords, int32 arraylenghts, int32 lenghts) cil managed
{
      // Code Size: 50 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: stloc.2 
      L_000c: ldc.i4.0 
      L_000d: stloc.0 
      L_000e: br.s L_002c
      L_0010: ldloc.2 
      L_0011: ldarg.1 
      L_0012: ldloc.1 
      L_0013: callvirt instance float64 [mscorlib]System.Random::NextDouble()
      L_0018: ldarg.2 
      L_0019: conv.r8 
      L_001a: mul 
      L_001b: conv.i4 
      L_001c: ldelem.u2 
      L_001d: box char
      L_0022: call string string::Concat(object, object)
      L_0027: stloc.2 
      L_0028: ldloc.0 
      L_0029: ldc.i4.1 
      L_002a: add 
      L_002b: stloc.0 
      L_002c: ldloc.0 
      L_002d: ldarg.3 
      L_002e: ble.s L_0010
      L_0030: ldloc.2 
      L_0031: ret 
}

IL混:

.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 
}

明天来讲讲反流程混淆,其实人人都可以做到
同时,有说得不对之处,还请高手赐教

转载于:https://www.cnblogs.com/Aiasted/archive/2005/06/30/183769.html

由浅至深 谈谈.NET混淆原理(三)-- 流程混淆相关推荐

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

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

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

    1.        名称混淆 - 反混淆 名称混淆返混淆,基本上是不太可能的事,因为以前的名称已经换掉了,也没有第二个名称备份表,所以根本无法还换. 不过,可以把不可见字符转换为可见字符,长字符串换成 ...

  3. Why WebRTC|“浅入深出”的工作原理详解

    WebRTC可以被看作是一个不需要安装任何插件或者下载任何额外程序就能运行的浏览器原生实时通信手段.不同的客户端通过(相同或不同)浏览器跳转到同一个 URL 就能实现实时互通.看见彼此.但这只是&qu ...

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

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

  5. 处理中文乱码_浅入深出:一次提问引发的深思,从此再也不怕“乱码”问题

    这是恋习Python之浅入深出系列第3篇原创首发文章 作者|丁彦军 来源|恋习Python(ID:sldata2017) 转载请联系授权(微信ID:2394608316) 近日,有位粉丝向我请教,在爬 ...

  6. 从浅到深使用pm2来彻底掌握微服务运维精髓

    从浅到深使用pm2来彻底掌握微服务运维精髓 前面发了一篇多种姿势后台启动进程提到pm2,它就像一个大管家一样,高效管理协调多个微服务,神奇吧. 本文会从简单使用,切入到微服务管理. 所以下面,我们先试 ...

  7. 由浅到深了解工厂模式

    作者 点先生 日期 2018.9.26 唠个嗑 先给各位观众老爷道个歉,在上一篇文章的末尾本来说了这次要给大家分享代理模式,但是臣妾,做不到啊! 最近公司给我了一个新项目,于是比较忙一点,再加上代理模 ...

  8. 前端div里的内容下沉_自学Web前端的五个不同阶段,从浅入深

    1.学习HTML,这是最简单,最基本的是要掌握div,formtable.Ulli.P.跨度.字体这些标签,这些都是最常用的,尤其是DIV和表格,DIV,表也可以用于布局,但不灵活,和用于基本表处理数 ...

  9. 浅入深出之Java集合框架(上)

    Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到浅入深出之Java集合框架(下). ...

最新文章

  1. Android实现CoverFlow效果
  2. 关于省客服集中全业务系统IT项目管理的几点分析!
  3. 基于python opencv实现广角相机标定和图像畸变矫正
  4. [蓝桥杯2016初赛]四平方和-数论+枚举
  5. npcap loopback adapter是什么意思_抖音限流是什么意思? 抖音为什么突然限流?
  6. centos7下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named ‘_ctypes‘的解决办法
  7. 杨森翔的书法:立马【五绝】
  8. 自学前端开发:想要学习成为一名优秀的前端开发者,代码之外需要关注的问题
  9. linux思科认证,思科CCIE认证知识点之IPv6地址
  10. YOLO系列专题——Complex-YOLO
  11. shell 小米system锁adb_小米/红米系列手机解system分区锁方法详解
  12. 蚂蚁金服的生死时速!
  13. Simulink仿真---clark变换、反clark变换
  14. 机器学习实战一——朴素贝叶斯中文情感分类模型
  15. GitHub上12k Star的《Java工程师成神之路》终于开放阅读了!
  16. 推荐几个正经网站,让你的数据结构和算法学习事半功倍!
  17. 云服务器配置代理服务
  18. android键盘广告,android键盘钢琴Lite郑永修改版+去广告
  19. Linux man命令后数字含义
  20. TFT-LCD制程之CF制程

热门文章

  1. 数据算法之二叉树删除(BinaryTreeL Remove)的Java实现
  2. Maven学习总结(30)——Maven项目通用三级版本号说明
  3. Java基础学习总结(77)——Java枚举再总结
  4. Java基础学习总结(4)——对象转型
  5. mysql8无法修改端口_mysql8.0.18 修改端口报错 Can't start server: Bind on TCP/IP port: Permission denied...
  6. api 定位 微信小程序 精度_微信小程序城市定位(百度地图API)
  7. c语言字符串怎么转为正数,把字符串转换为与之等价的整型值
  8. mysql回表查询uuid_MySQL数据库回表与索引
  9. 20051129: NetBeans
  10. 阿里巴巴十周年庆(预告)