软件逆向工程原理与实践第7章代码混淆技术

合集下载

java混淆的原理

java混淆的原理

java混淆的原理Java混淆是一种保护Java程序代码的技术,通过重新组织、重命名和混淆代码,使其更难以理解和分析,从而增加攻击者逆向工程的难度。

其主要原理包括代码转换、控制流混淆、数据流混淆和字符串加密等。

代码转换是Java混淆的基本原理之一、它通过对程序中的标识符重命名来改变代码结构,使得源代码与编译后的代码之间的关系变得难以理解。

一般来说,标识符可以是变量、方法、类名等,混淆时可以对它们进行随机重命名,使用难以读取和理解的名称,增加代码的复杂性和混淆程度。

控制流混淆是Java混淆的另一个重要原理。

它通过改变程序的控制流程,使得程序的逻辑关系变得混乱和复杂,从而增加对程序的理解和分析难度。

控制流混淆可以通过插入大量的无用代码、条件语句的重排序或者添加虚假的条件分支来实现。

这些方法使得程序流程变得难以捉摸和分析,增加攻击者在逆向工程中的困难。

数据流混淆也是Java混淆的一种常用原理。

它通过修改变量的初始化和使用方式,使得程序的数据流程变得模糊和复杂,加大攻击者分析代码的难度。

数据流混淆可以通过将变量的初始化与调用分散到不同的位置、添加虚假的变量赋值和冗余计算等方式来实现。

这些方法使得程序的数据流向变得难以追踪和理解,增加了逆向工程的难度。

字符串加密是Java混淆的另一种主要原理。

在Java程序中,字符串通常用来存储一些敏感信息或者关键的代码片段,因此攻击者对字符串的分析和获取是进行逆向工程的重要步骤之一、为了防止这种情况,字符串可以进行加密,以使其在内存中保持加密状态,在使用之前进行解密。

加密可以使用对称加密算法,如AES或DES,或者使用非对称加密算法,如RSA。

无论使用哪种加密方式,都可以增加攻击者获取字符串信息的难度。

除了上述原理,Java混淆还可使用其他技术来增加混淆效果。

例如,指令替换可以替换原始代码中的一些关键指令,以增加理解和分析该代码的难度。

同时,也可以对Java字节码进行重组和重排,使其不再按顺序执行,增加对代码的逆向工程的困难。

VSCode代码混淆技巧

VSCode代码混淆技巧

VSCode代码混淆技巧代码混淆是一种保护软件源代码的技术,通过对源代码进行修改和重组,使得代码难以被阅读和理解。

这种技术常用于商业软件的保护,以防止他人对源代码进行逆向工程或盗取。

本文将介绍在VSCode中实现代码混淆的一些技巧。

一、安装混淆插件要在VSCode中实现代码混淆,首先需要安装相应的插件。

目前,市面上有一些流行的插件可以实现代码混淆,如Code Obfuscator、JS Obfuscator等。

这些插件通常提供了代码混淆的各种选项和功能,可以根据具体需求进行配置和调整。

二、配置混淆选项安装插件后,在VSCode的设置中找到插件的配置选项。

一般来说,插件会提供一些配置参数,用于控制混淆的程度和方式。

常见的配置选项包括变量重命名、函数名替换、代码压缩等。

根据项目的需求和安全性要求,选择合适的混淆选项进行配置。

三、混淆代码示例下面以JavaScript代码为例,演示如何使用插件实现代码混淆。

```javascript// 原始代码function add(a, b) {return a + b;}console.log(add(1, 2));// 混淆后的代码function g1(a1, a2) {return a1 + a2;}console.log(g1(1, 2));```通过插件的混淆功能,我们可以看到原始代码中的函数名和变量名被替换为了随机的字符,从而增加了代码的可读性和理解难度。

四、混淆操作的注意事项在进行代码混淆时,需要注意以下几点:1. 确保混淆后的代码仍然具有正确的功能。

混淆后的代码应该保持与原始代码相同的逻辑和执行结果,否则可能导致程序错误。

2. 需要对混淆后的代码进行测试和验证。

混淆后的代码可能存在一些隐藏的问题和错误,需要通过测试和验证来确保代码的正确性和稳定性。

3. 对混淆后的代码进行适当的注释和文档说明。

由于混淆后的代码可读性较低,应该添加适当的注释和文档说明,以方便他人理解和维护代码。

themida原理

themida原理

themida原理Themida是一款逆向工程工具,主要用于保护软件免受逆向工程和破解。

它使用一系列复杂的技术来隐藏和混淆程序代码,使其难以理解和分析。

以下是Themida的一些主要原理:1. 代码膨胀(Code Expansion):Themida会对软件代码进行膨胀,通过在程序中添加一些无用的、冗余的代码来增加程序的复杂性。

这使得逆向工程师需要更长的时间和精力来理解和分析程序。

2. 指令混淆(Instruction Obfuscation):Themida会对指令进行混淆和变换,使得代码的执行流程变得难以追踪和理解。

这种技术使得逆向工程师难以还原出原始的代码逻辑。

3. 运行时解密(Runtime Decryption):Themida使用加密算法对程序的关键部分进行加密,然后在运行时动态解密。

这使得程序在内存中的数据、代码和资源都是加密的,逆向工程师无法直接访问明文数据。

4. 虚拟机保护(Virtual Machine Protection):Themida使用一种虚拟机(Virtual Machine)来执行程序代码,而不是直接在CPU上执行。

虚拟机指令集与实际CPU指令集不同,每个指令都会经过转换和解释,使得逆向工程师无法直接分析和理解程序逻辑。

5. 反调试和反动态分析(Anti-Debugging and Anti-Dynamic Analysis):Themida还内置了一些反调试和反动态分析技术,可以检测并阻止调试器的使用,以及其他动态分析工具的运行。

这增加了逆向工程的难度,使得逆向工程师无法对程序进行有效的动态分析。

总的来说,Themida通过代码膨胀、指令混淆、运行时解密、虚拟机保护以及反调试和反动态分析等技术,有效地保护了软件免受逆向工程和破解。

C语言代码混淆与反调试技术

C语言代码混淆与反调试技术

C语言代码混淆与反调试技术在软件开发领域,保护源代码的机密性和安全性是非常重要的。

特别是对于C语言代码,为了防止反向工程和恶意利用,开发人员需要采取适当的措施来混淆代码,使其难以理解和逆向分析。

本文将介绍一些常见的C语言代码混淆和反调试技术,以帮助开发人员提高代码的安全性。

一、标识符和函数名混淆将C语言代码中的标识符和函数名进行混淆是一种常见的代码混淆技术。

通过修改变量和函数的命名,例如使用无意义的字母、数字或符号等代替原有的名称,可以使代码难以阅读和理解。

此外,还可以使用宏定义或函数指针来替代原有的函数调用,增加代码的复杂性。

这样一来,即使反向工程师获取了代码,也难以追踪和理解其中的逻辑。

二、代码逻辑的混淆除了名称的混淆,代码逻辑的混淆也是一种有效的代码保护手段。

通过增加无用代码、重复代码或者不符合常规逻辑的代码,可以迷惑调试工具和反向工程师,使其难以分析和理解程序的真正逻辑。

此外,还可以使用条件编译、宏定义等技术,根据不同的编译器或平台生成不同的代码逻辑,增加代码的复杂性和混淆度。

三、数据的加密和解密为了保护关键数据在内存中的安全性,开发人员可以采用加密和解密的方式来存储和使用数据。

可以使用对称加密算法或非对称加密算法对敏感数据进行加密,并在运行时进行解密。

通过这种方式,即使攻击者通过调试工具获取到内存中的数据,也无法直接获得明文数据,提高了代码的安全性。

四、调试的防护措施为了防止程序被调试和逆向工程,开发人员还可以采取一些反调试技术。

例如,通过检测调试器是否存在、检测调试器的运行状态等方式来发现调试器的存在,并采取相应的应对措施。

另外,还可以使用反调试的函数来检测调试器的运行状态,并在发现调试器存在时执行恶意逻辑或退出程序,从而使反向工程师难以分析和逆向程序。

总结:C语言代码混淆和反调试技术在保护软件安全性方面起着重要作用。

通过混淆标识符和函数名,混淆代码逻辑,加密关键数据以及防护调试等手段,可以有效提高代码的安全性和抵抗逆向工程的能力。

代码混淆方法

代码混淆方法

代码混淆方法
代码混淆(Code Obfuscation)是一种使代码更难以理解和修改的技术。

以下是一些常见的代码混淆方法:
1. 变量和函数重命名:将变量和函数名替换为无意义或难以理解的名称,这样可以增加阅读和理解代码的难度。

2. 控制流混淆:改变代码的执行流程,例如使用复杂的条件语句和循环,或者将代码的顺序打乱。

3. 数据混淆:改变数据的表现形式,例如使用加密或混淆算法处理数据,或者将数据嵌入到其他数据中。

4. 代码插入:在代码中插入无用的语句或代码片段,以增加代码的体积和复杂性。

5. 代码删除:删除一些无用的代码,使剩下的代码更难以理解。

6. 使用编译器或解释器的特性:利用编译器或解释器的特性,例如将代码编译为字节码或使用特殊的语言特性,可以使代码更难以理解。

7. 反编译防护:使用反编译防护技术,例如将代码转换为字节码或使用特殊的编译器选项,以防止代码被反编译。

需要注意的是,虽然代码混淆可以提高代码的安全性和保密性,但它并不能完全防止代码被破解或逆向工程。

因此,在使用代码混淆时,应该根据具体情况选择合适的方法,并配合其他安全措施来提高代码的安全性。

代码混淆技术研究综述

代码混淆技术研究综述

代码混淆技术研究综述引言随着信息技术的快速发展和普及,软件的开发和使用已经成为现代社会的一个重要组成部分。

随之而来的问题是软件安全性的挑战。

恶意攻击者往往试图通过逆向工程和分析软件源代码来发现其漏洞和弱点,从而实施攻击。

为了应对这一挑战,代码混淆技术应运而生。

代码混淆技术旨在通过改变软件源代码的结构和逻辑,使其难以理解和分析,从而加强软件的安全性。

本文将对代码混淆技术进行综述,并探讨其研究现状和发展趋势。

一、代码混淆技术概述代码混淆技术是一种通过对软件源代码进行转换和重组来隐藏其真实意图和逻辑的手段。

通过代码混淆,可以使软件的逻辑结构变得复杂和难以理解,从而降低攻击者对软件源代码的分析效率,增加攻击者攻击软件的成本和难度。

代码混淆技术通常包括以下几种常见手段:1. 控制流混淆:通过改变软件的控制流程,使得程序的执行路径变得复杂和混乱,增加攻击者理解和分析程序的难度。

代码混淆技术的目标是增加软件系统的复杂性,使得攻击者难以理解和分析软件的内部逻辑和结构,从而提高软件的安全性。

二、代码混淆技术研究现状代码混淆技术是软件安全领域的一个重要研究方向,当前已经取得了一些研究成果。

代码混淆技术的研究现状主要包括以下几个方面:1. 控制流混淆技术研究控制流混淆是代码混淆技术中的一个重要手段,当前已经有许多研究针对控制流混淆进行了深入的探讨。

现有的控制流混淆技术主要包括基础块替换、指令混淆、虚假指令插入等方法。

通过这些技术,可以有效地改变程序的控制流程,使得程序的执行路径变得复杂和难以理解。

2. 数据混淆技术研究数据混淆技术是代码混淆技术的另一重要方面。

目前已经有许多研究着眼于数据混淆技术的研究。

常见的数据混淆技术包括变量重命名、数据加密、数据重排等方法。

通过这些技术,可以有效地隐藏程序中的数据访问关系,增加程序的复杂度。

3. 代码混淆工具研究当前已经有一些代码混淆工具得到了研究和开发,并广泛应用于实际的软件开发中。

软件工程中的防篡改技术

软件工程中的防篡改技术

软件工程中的防篡改技术随着信息技术的不断发展和应用,软件系统已经成为现代社会中不可或缺的一部分。

无论是企业管理还是个人生活,都离不开各类软件系统的支持。

随着软件系统的普及和应用,其安全问题也逐渐凸显出来,其中最为突出的问题之一就是软件的篡改问题。

软件的篡改不仅可能导致系统崩溃和数据丢失等严重后果,还可能对系统的安全性和稳定性造成威胁。

为了应对软件的篡改问题,软件工程领域也涌现出了各种防篡改技术,其目的就是保障软件系统的完整性和安全性。

本文将针对软件工程领域中的防篡改技术展开讨论,从技术原理到应用案例,全面解析软件工程中的防篡改技术。

一、防篡改技术的技术原理1.数字签名技术数字签名是使用公钥加密技术确保信息的完整性和不可否认性。

数字签名技术的基本原理是使用发送者的私钥进行加密,接收者使用发送者的公钥进行解密,从而验证信息的来源和完整性。

在软件工程中,数字签名技术可以用于验证软件的完整性,通过在软件中嵌入数字签名,在软件发布和更新时进行数字签名验证,可以有效防范软件的篡改行为。

2.哈希函数技术哈希函数是一种将任意长度的输入数据映射为固定长度输出数据的函数,其特点是不可逆和不可还原。

在软件工程中,哈希函数技术可以用于验证软件的完整性,通过计算软件文件的哈希值,并与预先计算好的哈希值进行比对,可以及时发现软件文件被篡改的情况。

数字水印是一种将隐藏的信息嵌入到被保护对象中的技术,其特点是不可察觉和不可移除。

在软件工程领域,数字水印技术可以应用于软件文件的保护,通过在软件文件中嵌入数字水印,可以及时发现软件文件的篡改和盗版行为。

4.代码混淆技术代码混淆是一种通过修改程序代码的结构和逻辑,使其在逻辑功能上不变的情况下,使得代码难以理解和分析的技术。

在软件工程领域,代码混淆技术可以应用于保护软件的知识产权和抵御恶意逆向工程,有效防范软件的篡改和盗版行为。

以上所述的防篡改技术只是软件工程领域中的部分技术手段,随着技术的不断发展和应用,还会涌现出更多的防篡改技术。

软件逆向工程原理与实践第7章代码混淆技术

软件逆向工程原理与实践第7章代码混淆技术

软件逆向工程原理与实践第7章代码混淆技术代码混淆技术是一种保护软件代码安全性的手段,通过对代码进行变换、剪裁、重构等操作,使得源代码变得难以阅读和理解,从而增加逆向工程的难度。

本章将介绍一些常见的代码混淆技术,包括控制流变换、数据流变换、符号变换等。

1.控制流变换控制流变换是通过改变程序的执行顺序和流程来使代码更加难以理解。

常见的控制流变换技术包括条件跳转操作的变换、循环结构的变换、函数调用的变换等。

例如,可以将条件跳转操作改为无条件跳转操作,或者将多个条件分支合并为一个条件判断等。

这种变换可以使得程序的控制流变得混乱、不可预测,增加了逆向工程的难度。

2.数据流变换数据流变换是通过改变程序中的数据流程来使代码更加难以理解。

常见的数据流变换技术包括数据加密、数据替换、数据重组等。

例如,可以对关键数据进行加密存储,或者将数据的使用顺序进行打乱等。

这种变换可以使得程序中的数据关系变得复杂、混乱,增加了逆向工程的难度。

3.符号变换符号变换是通过改变程序中的名称、标识符等符号信息来使代码更加难以理解。

常见的符号变换技术包括标识符重命名、代码抽取等。

例如,可以对变量、函数、类等符号进行重命名,或者将代码片段进行提取、组装等。

这种变换可以使得程序中的符号信息变得模糊、混乱,增加了逆向工程的难度。

代码混淆技术的实践需要考虑以下几个方面:1.混淆技术的选择:根据软件的特点和需求,选择合适的代码混淆技术进行实践。

不同的混淆技术有不同的适用场景和效果,需要根据具体情况进行选择。

2.混淆效果评估:对混淆后的代码进行评估,验证混淆技术对逆向工程的影响。

可以使用逆向工程工具和技术进行静态分析、动态调试等,评估混淆后的代码的可读性和理解难度。

3.混淆技术的组合:在实践中可以将多种混淆技术进行组合,以达到更好的混淆效果。

例如,可以将控制流变换、数据流变换和符号变换等技术结合起来使用,增加逆向工程的难度。

4.混淆技术的优化:根据评估结果和反馈信息,对混淆技术进行优化和调整。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第7章 代码混淆技术
表7-1中给出了一些汇编指令的替换模式。以模式3为例, 可将一个MOV操作替换为由PUSH-POP-算数运算组成的指 令序列。对于模式4,可将一个MOV操作替换为由CALL-算 数运算组成的指令序列,CALL $+5指调用距当前指令地址 偏移量为5处的指令序列,由于CALL指令本身会将地址 00401033H压栈,因此POP指令执行后,EDX包含的内容即 00401033H,再做XOR运算,得到EDX保存0F1D71B16H。
第7章 代码混淆技术
第7章 代码混淆技术
指令变换可以迭代,当我们有一系列固定的指令替换模 式时,可以在每一步随机地选择一个特定的被替换指令(指 令序列)并随机地应用所有可用的替换模式,实施指令替换。 以下是一个例子。
对于指令PUSH ECX,应用表7-1中替换模式1的第3种 替换,得到
SUB ESP, 4 MOV DWORD PTR [ESP], ECX
第7章 代码混淆技术
代码混淆与代码加密的主要区别在于,混淆程序P' 必须 从执行上与P等价。因此,混淆变换可以看作是一种“语义 保持”(semantic-preserving)的程序加密。
第7章 代码混淆技术 7.2 数 据 混 淆
数据混淆修改程序的数据元素,包括常量、变量、数组 和其他数据结构。
第7章 代码混淆技术
第7章 代码混淆技术
CALL <目标地址>从语义上会将返回地址(地址x+5)压 入栈顶,而在目标地址处,指令“ADD ESP, 4”实际上是 将这一刚刚被压入栈中的返回地址弹出,从而实现一个不保 留返回地址的JMP跳转。这个例子的思想是“不保留”返回 地址。下面一个例子是“保留但更改”返回地址:
第7章 代码混淆技术
7.2.1 常量展开 假定在输入程序的某处使用了一个常量值,混淆器可将
这个常量替换为某个计算过程,这一替换称为常量展开 (constant unfolding)。这个计算过程的结果即是这个常量。 例如:
PUSH 0F9CBE47AH ADD DWORD PTR [ESP], 6341B86H 等价于 PUSH 0H
第7章 代码混淆技术
(1) 功能性(functionality)。对于每个程序P,字符串O(P) 是一个功能与P相同的程序。
(2) 多项式减速(polynomial slowdown)。程序O(P)的大小 和执行时间相比P而言最差情况下呈多项式级放大。
(3) 虚拟黑盒(virtual black-box)属性。任何拥有对O(P)文 本的访问权限的概率多项式时间算法(攻击者),都无法比一 个对P拥有oracle访问权限的概率多项式时间算法推断出更多 的东西。所谓算法(攻击者)对程序拥有oracle访问权限,指 算法(攻击者)可以将程序当作黑盒来使用。
编码函数y=f(x),在混淆时,将代码中的数据x0混淆为f(x0); 而在解混淆时,将代码中的f(x0)恢复为x0。对编码函数 y=f(x)的选择,要求从任意y0=f(x0)难以推断出x0,或从任 意的(x0, y0)难以推断出编码函数f。
例如,可以假定编码函数为f(x)=x-6341B86H,相应的 解码函数为f-1(x)=x+6341B86H。代码中对x编码为f(x),运 行时处理到f(x)时,将x动态解码出来。
第7章 代码混淆技术
完全混淆(Total obfuscation)是一种混淆变换,在该变换 下,攻击者无法知道P' 做的是什么,当然也无法从P' 的文本 获得P的功能。这样,能够保证程序P的设计免受任何形式 的逆向分析攻击。弱混淆(Weak obfuscation)是一种混淆变换, 在该变换下,任何人即使知道了P' 的功能,也无法知道P' 是 如何进行具体操作的。这样,攻击者就无法从P' 的文本或P' 的输入/输出行为中提取出任何P使用的有意义的数据结构、 算法、常量等。
第7章 代码混淆技术
不透明谓词的实现方式可以依赖于计算复杂度很高的数 学问题,也可以使用值为常量且在编译/混淆时其值可知的 环境变量。基于假名分析和数据依赖分析的复杂性可以构造 出抵抗解混淆工具的不透明谓词。不透明谓词的引入会破坏 一些逆向分析时常见的假设,如条件分支的两侧均可能被执 行,两个分支上均为代码而不可能为数据等,从而可能大大 增加逆向分析的难度。
第7章 代码混淆技术
如果将不透明谓词作为分支条件,可以向程序中加入额 外的伪分支,即给控制流图加入新的边,该分支可用于插入 垃圾代码或特殊属性,从而实现用条件跳转表示无条件跳转 的语义。图7-3(a)为混淆前的原程序,图7-3(b)和图7-3(c)即 为加入伪分支后的程序,其中可能执行的路径为实线,不可 能执行的路径为虚线。
第7章 代码混淆技术
7.3.4 基于处理器的控制流间接化 正常的汇编程序,CALL指令代表对函数的调用,
CALL的目标地址是函数的入口点,而对函数的调用在正常 情况下会以RET或RETN指令返回调用者。基于处理器的控 制间接化,实际上是通过指令替换,破坏这些正常的假定。 首先,PUSH指令和RET指令配合,能够实现JMP指令的效 果。即
第7章 代码混淆技术
为了插入死代码,混淆器需要知道在特定的程序执行点 上,哪些寄存器是“活的”,哪些寄存器(或变量)是“死 的”。修改“死”寄存器(变量)的语句不会影响最终的程序 运行结果。例如在一个高级语言函数中,局部变量a先后被 两次赋以不同值,而在这两次赋值之间,a并没有被任何语 句使用,这时前一次对a的赋值就可以看作死代码。与插入 死代码相对应的编译优化技术是死代码消除(dead code elimination)。从编译优化的角度,删除死代码并不会影响程 序的语义;而从代码混淆的角度,任意插入死代码也能够达 到混淆的效果
第7章 代码混淆技术
再对其中的第一条指令应用表7-1中替换模式2,得到 PUSH EBX MOV EBX, ESP XCHG [ESP], EBX POP ESP MOV DWORD PTR [ESP], ECX
第7章 代码混淆技术
此时,还可继续对其中的第一条PUSH指令应用表7-1中 的替换模式1。在实际替换中,不是所有的替换模式都能保 证语义的等价性。所谓等价性,指CPU在执行完替换后的指 令序列时,所处的状态与CPU执行替换前的指令(序列)所处 的结果状态完全一样。如果替换模式不能完全保证语义等价, 那么需要保证替换代码执行所影响到的EFLAGS标识位在再 次被修改之前不会被使用。
第7章 代码混淆技术
图7-1 内联与外联的基本原理
第7章 代码混淆技术
7.3.2 通过跳转破坏局部性 我们知道基本块中的程序指令不包含跳转,这种局部性
和内聚性代表着易于分析和相对优化的程序结构。通过向基 本块中的语句引入一系列无条件跳转,可以破坏这种局部性, 达到增加逆向分析难度的目的。以图7-2为例,引入无条件 跳转前后的程序结构分别如图7-2(a)和图7-2(b)所示。
第7章 代码混淆技术
将PUSH 0H替换为上面的语句序列的过程即为常量展 开。
与常量展开相对应的编译优化技术是常量折叠,对于编 译器能够推导出的一些运算的结果,直接用结果替代运算过 程。例如:对于x=2×3,可以直接替换为x=6。
第7章 代码混淆技术
7.2.2 数据编码 利用数据编码的方式进行代码混淆,实际上是设定一个
第7章 代码混淆技术
取值既可能为true也可能为false的不透明谓词可记为P?, 当该不透明谓词作为条件分支时,运行时两分支均可能执行。 为了得到与加入不透明谓词之前的程序语义相同的分支程序, 必须保证两个分支上的程序的语义是等价的如图7-3(d)所示。
第7章 代码混淆技术
图7-3 不透明谓词的基本原理
第7章 代码混淆技术
7.3.5 插入无效代码 插入无效代码技术的基本思想是,在两段有效代码之间
插入一些无效代码。这些无效代码有可能是对数据、寄存器 进行了不影响程序执行结果的无用操作,也可能是被插入到 不会被执行到的程序分支中。前一种情况侧重于数据混淆, 又称为死代码(dead code)插入;后一种情况侧重于控制流混 淆,又称为垃圾代码(junk code)插入。
PUSH EAX XOR EAX, EAX JZ <目标地址> <垃圾代码> 目标地址: POP EAX
第7章 代码混淆技术
这个例子看上去像是引入了不透明谓词,虽然指令 “XOR EAX, EAX”看上去并不能使得状态寄存器的标识位 那么“不透明”,但是精心构造的不透明谓词可能能够实现 这一点。
再看一个例子: JZ <目标地址1> JMP <目标地址2> … 目标地址1: NOP 目标地址2: XOR EDX, 131087D0H
第7章 代码混淆技术
7.2.3 基于模式的混淆 基于模式的混淆的基本思想在于,构造一系列指令变换,
将一条或多条相邻指令映射为具有相同语义的更复杂的指令 序列。将一种运算用另一种(更复杂的)运算替代,这在高级 语言中很容易理解。例如,根据补码运算定义,有-x等价于 ~x+1,由此我们还可以衍生出~(-x)等价于x-1,而-(~x)等价 于x+1。在汇编语言层面,语义等价的替换更为困难,因为 我们不仅需要考虑指令操作的通用寄存器的变化是否等价, 还需要考虑对标识寄存器EFLAGS的副作用也是等价的,或 者对EFLAGS的副作用不会影响后续计算。
第7章 代码混淆技术
图7-2 破坏局部性的基本原理
第7章 代码混淆技术
7.3.3 不透明谓词 不透明谓词(Opaque Predicate)是一种特殊的条件表达式,
该条件表达式对于加混淆者来说容易判断其值,而对于攻击 者来说难以推导其值。条件表达式的取值总为true或false(记 作PT和PF),其值仅在编译时或混淆时已知,对于攻击者来 说未知,且其取值从计算上难以证明。
相关文档
最新文档