惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
P
Palo Alto Networks Blog
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Blog — PlanetScale
Blog — PlanetScale
S
Schneier on Security
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
雷峰网
雷峰网
T
Tenable Blog
人人都是产品经理
人人都是产品经理
T
Tor Project blog
C
Cyber Attacks, Cyber Crime and Cyber Security
AWS News Blog
AWS News Blog
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
Scott Helme
Scott Helme
SecWiki News
SecWiki News
C
CERT Recently Published Vulnerability Notes
Recorded Future
Recorded Future
I
InfoQ
Security Archives - TechRepublic
Security Archives - TechRepublic
Help Net Security
Help Net Security
Cloudbric
Cloudbric
C
Check Point Blog
Engineering at Meta
Engineering at Meta
TaoSecurity Blog
TaoSecurity Blog
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
N
News and Events Feed by Topic
云风的 BLOG
云风的 BLOG
MyScale Blog
MyScale Blog
腾讯CDC
量子位
Application and Cybersecurity Blog
Application and Cybersecurity Blog
K
Kaspersky official blog
Vercel News
Vercel News
F
Full Disclosure
T
Troy Hunt's Blog
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs

博客园 - Jason.NET

请不要为了自己的商业目地不择手段 DOTNET 32位下的程序在64位下真的可以运行吗? - Jason.NET - 博客园 加密狗保护的VFP软件破解 (朋友之作,代发) 使 Framework 2.0 的程序集不用安装 Framework 就可以运行的工具免费发布了 怎样给没有源代码的.net程序添加修改功能 谁不需要赚钱 -- 想,还要敢想 - Jason.NET 发布一个武汉的.net程序员招骋信息 中国软件业的混乱,观总价值2亿项目后的感叹 - Jason.NET - 博客园 刚刚收到来至 Reliasoft Corporation 的一封版权申明信 我想列出一个保护类软件的黑名单 排名和积分都大大降低了?怎么回事? Thinstall 包装 Dotnet 程序分析 一款非混淆软件 for .net 保护 各种Web脚本下,日历的实现方法 为什么浏览器有这么多标准??? 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法) QQ有漏洞??? 由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇) WEB程序员,界面美化是你心中永远的痛吗?
由浅至深 谈谈.NET混淆原理(三)-- 流程混淆(续)
Jason.NET · 2005-07-02 · via 博客园 - Jason.NET

 

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

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

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

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

好,这次我们主要分析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了。

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

1.        把源代码分成几块

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

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

4.        重新计算行号

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

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

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

posted on 2005-07-02 10:15  Jason.NET  阅读(4141)  评论()    收藏  举报