自动 x86 指令混淆

2023-11-24

我正在开发一个 x86 asm 混淆器,它将 Intel 语法代码作为字符串并输出一组等效的混淆操作码。

这是一个例子:

mov eax, 0x5523
or eax, [ebx]
push eax
call someAPI

变成类似这样的东西:

mov eax, 0xFFFFFFFF ; mov eax, 0x5523
and eax, 0x5523     ;
push [ebx]          ; xor eax, [ebx]
or [esp], eax       ;
pop eax             ;
push 12345h         ; push eax
mov [esp], eax      ;
call getEIP         ; call someAPI
getEIP:             ;
add [esp], 9        ;
jmp someAPI         ;

这只是一个例子,我没有检查这是否会搞砸标志(可能会搞砸)。

现在我有一个 XML 文档,其中列出了说明模板(例如push e*x)以及可以使用的替换指令列表。

我正在寻找一种自动生成操作码序列的方法,该序列产生与输入相同的结果。我不介意进行受过教育的暴力,但我不确定我会如何处理这个问题。


您需要的是操作码功能的代数描述,以及一组允许您确定等效操作的代数定律。

然后,对于每条指令,您查找其代数描述(作为示例, 一个

 XOR  eax,mem[ecx]

其代数等价为

 eax exclusive_or mem[ecx]

使用这些代数等价物枚举代数等价物,例如:

 a exclusive_or b ==> (a and not b) or (b and not a)

为您的 XOR 指令生成等效的代数语句

 eax exclusive_or mem[ecx] ==> (eax and not mem[ecx]) or (mem[ecx] and not eax)

您可以对此应用更多代数定律,例如德摩根定理:

 a or b ==> not (not a and not b)

to get

(not (not (eax and not mem[ecx])) and (not (mem[ecx] and not eax)))

此时,您已经有了代数计算的规范,可以执行 和原来的一样。这就是你的蛮力。

现在你必须通过匹配哪些指令来将其“编译”为机器指令 就按这个说的做。与任何编译器一样,您可能希望优化 生成的代码(两次获取 mem[ecx] 没有意义)。 (所有这些都很难......它是一个代码生成器!) 生成的代码序列类似于:

mov ebx, mem[ecx]
mov edx, ebx
not edx
and edx, eax
not eax
and eax, ebx
not eax
or eax, edx

这是需要手动建造的大量机械。

另一种方法是利用程序转换系统,该系统允许您将源到源的转换应用于代码。然后,您可以将“等效项”编码为直接在代码上重写。

这些工具之一是我们的DMS 软件再造工具包.

DMS 采用语言定义(本质上是 EBNF),自动实现解析器、AST 构建器和 Prettyprinter(反解析器,将 AST 转回有效的源文本)。 [DMS 目前没有 ASM86 的 EBNF,但有数十个针对各种 已为 DMS 构建了复杂的语言,其中包括多种用于各种非 x86 汇编器的语言 因此,您必须将 ASM86 EBNF 定义为 DMS。这非常简单;数据管理系统 有一个非常强大的解析器生成器]。

使用它,DMS 将允许您直接在代码上编写源转换。您可以编写以下转换来直接实现 XOR 等价和德摩根定律:

  domain ASM86;

  rule obfuscate_XOR(r: register, m: memory_access):instruction:instruction
  =  " XOR \r, \m " 
      rewrites to
     " MOV \free_register\(\),\m
       NOT \free_register\(\)
       AND \free_register\(\),\r 
       NOT \r
       AND \r,\m
       OR \r,\free_register\(\)";

 rule obfuscate_OR(r1: register, r2: register):instruction:instruction
 = " OR \r1, \r2"
     rewrites to
    " MOV \free_register\(\),\r1
      NOT \free_register\(\)
      AND \free_register\(\),\r2
      NOT \r2
      AND \r1,\r2
      NOT \r1";

在名为“free_register”的元过程中添加一些额外的魔法来确定寄存器 在代码中的那个点(AST 匹配)是空闲的。 (如果您不想这样做,请使用堆栈顶部 就像您在示例中所做的那样,到处都是临时的)。

您需要进行大量重写来覆盖您想要混淆的所有情况,以及寄存器和内存操作数的组合。

然后,可以要求转换引擎在代码中的每个点随机应用这些转换一次或多次以对其进行扰乱。

你可以看到一个DMS 应用一些代数变换的完整示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动 x86 指令混淆 的相关文章

  • Core i3/5/7 CPU 是否提供测量 IPC 的机制?

    至少 过去十年中的所有英特尔 CPU 都包含一组对各种事件进行计数的性能监视器 最新的 Intel CPU Core i3 i5 和 i7 又名 Nehalem 是否提供了计算每时钟指令 IPC 的机制 如果有 它们是如何使用的 如果可能的
  • 调用可以是 cdecl 或 stdcall 的函数

    我需要编写调用外部函数的代码 该函数可以是 32 位 Windows 应用程序中的 stdcall 调用或 cdecl 我的代码 调用者 无法提前知道其中的哪一个 现在 如果我尝试从定义为 stdcall 的调用站点调用 cdecl 函数
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • long double(GCC 特定)和 __float128

    我正在寻找有关的详细信息long double and float128在 GCC x86 中 更多是出于好奇而不是因为实际问题 可能很少有人需要这些 我只是有史以来第一次 truly需要一个double 但我想知道你的工具箱里有什么以及它
  • 难以理解汇编命令“加载有效地址”[重复]

    这个问题在这里已经有答案了 可能的重复 LEA 指令的目的是什么 https stackoverflow com questions 1658294 whats the purpose of the lea instruction LEA指
  • PowerShell脚本将标签值从一个文件替换到另一个文件(标签值)

    我需要使用 powershell 脚本将标签值从另一个文件替换到一个文件中 Example File A
  • 如何计算汇编中的内存位移?

    我一直在研究 yasm 汇编语言 并生成了一个包含以下内容的列表文件 我需要帮助理解第一列中的内存位移是如何计算的 提前致谢 1 line 1 1 memory asm 2 section data 3 00000000 04000000
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • 为什么 mov %ax, %ds 汇编+反汇编为 mov %eax,%ds,与原来不一致?

    test S text global start start xor ax ax mov ax ds mov ax ss mov ax es mov ax fs mov ax gs 我通过这样做得到了反汇编代码文件 x86 64 elf g
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 在 qemu 中将扇区加载到 RAM

    我编写了一个简单的程序 将扇区 扇区编号 2 加载到 RAM 但什么也没打印 首先 我尝试了以下引导扇区代码 org 0x7c00 mov ax 0x1000 ES BX 1000 0000 mov es ax mov bx 0x00 Lo
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C
  • 使用 PowerShell 修改 Visual Studio 解决方案和项目文件

    我们目前正在重新组织源代码 将内容移动到新目录中 结构 这会影响我们的 Visual Studio 解决方案和项目文件 其中诸如程序集引用 可能的输出目录 构建前和构建后事件等 必须更新以反映我们的更改 由于我们有许多解决方案和项目 我希望
  • NASM:如何正确访问SSD驱动器?

    我需要使用 NASM 16 位代码访问 SSD 驱动器 访问普通硬盘时 需要设置寄存器AX DX CX来选择柱面 磁道 扇区 扇区数 AH 选择读扇区功能 DL 选择驱动器号 CH 选择气缸 DH 选择磁盘上的一侧 CL 选择步入正轨的部门
  • 如何在 AVX/AVX2 中递增向量

    我想使用内在函数来增加 SIMD 向量的元素 最简单的方法似乎是为每个元素加 1 如下所示 note vec inc之前已设置为1 vec mm256 add epi16 vec vec inc 但是是否有任何特殊指令来增加向量 类似于in
  • 如何使 gcc 为 -fpatchable-function-entry 发出多字节 NOP?

    gcc确实有能力使用多字节用于对齐循环和函数的 NOP 然而当我尝试 fpatchable function entry option https gcc gnu org onlinedocs gcc Instrumentation Opt
  • 32位进程在64位操作系统上可以访问多少内存?

    在 Windows 上 正常情况下 32 位进程只能访问 2GB RAM 或通过 boot ini 文件中的特殊开关访问 3GB 在 64 位操作系统上运行 32 位进程时 有多少可用内存 是否有任何特殊的开关或设置可以改变这种情况 默认
  • x86:寄存器操作为内存内容和内存地址?

    寄存器 gt 内存地址 gt 内存内容 内存地址 gt 内存内容 上面的模型正确吗 而且 如果是的话 你能建议我是否认为正确吗 movl eax ebx gt 它将 eax 的内存地址移动到 ebx 这也会导致内容移动 movl eax e
  • 将代码保存在 L1 缓存中

    我一直在阅读维基百科关于 K 编程语言的文章 http en wikipedia org wiki K programming language Performance characteristics这就是我所看到的 解释器的小尺寸和语言的

随机推荐

  • 找不到 -lboost_system 的库

    我使用 macports 安装了 boost 这些文件似乎位于 opt local include boost 中 我的 makefile 不再工作并且出现以下错误 Undefined symbols boost system generi
  • 在 C# 中以编程方式设置 dllimport

    我在用DllImport在我的解决方案中 我的问题是我有同一个 DLL 的两个版本 一个是为 32 位构建的 另一个是为 64 位构建的 它们都公开具有相同名称和相同签名的相同函数 我的问题是我必须使用两个静态方法来公开这些方法 然后在运行
  • 如何使用 ember-rails 启用 query-params-new 功能

    我在使用 query params new 功能时遇到问题 我的 ember 版本是 1 4 0 beta 2 Ember js 通过 ember rails 和 ember source gems 加载到我的 Rails 应用程序中 在初
  • 从模板(视图)中动态加载 AngularJS 模块

    背景 为了便于讨论 我们假设您有 100 000 次观看 部分观看 我们还假设您有附带的视图范围控制器 以及潜在的视图范围服务和过滤器 尝试设想一个托管 100 000 个不同小型应用程序的聚合应用程序 Issue 当您有需要附带控制器的
  • ASP.NET MVC 忽略所有 url 末尾的“.html”

    我是 ASP NET MVC 新手 现在正在努力解决 url 路由问题 我正在使用 asp net mvc 3 RC2 如何创建一个 url 路由IGNORESurl 中最末尾的扩展名 扩展名可以是 html aspx php anythi
  • 如何实现类似于 jQuery UI 自动完成的 Dojo 自动完成?

    美好的一天 我使用 JSP 和 jQuery UI 成功实现了文本输入的自动完成功能 自动完成数据从数据库中检索并通过服务器端的 q 参数进行过滤 它返回包含查询字符串的所有项目 SELECT name FROM organization
  • NHibernate 代理的 JSON.Net 序列化 (NH 3.3.2.4000)

    I m still让 Json Net 和 NHibernate 很好地协同工作一直存在困难 即 让 Json NET 序列化代理的 NHibernate 对象 我已遵循建议here 无论是已接受的答案还是修正案 但没有骰子 上述解决方案的
  • 具有多个构造函数的 MEF 构造函数参数

    我开始使用 MEF 并且我有一个具有多个构造函数的类 如下所示 Export typeof ifoo class foo ifoo void foo ImportingConstructor void foo object par1 我在用
  • 如何连接 WAMP 服务器上的 MySQL?

    这对你来说可能非常简单 但我已经为此奋斗了一个小时 这是我尝试运行的代码 您可以看到我使用 8080 作为端口号 当然 我也有 HTML 代码 但是 每当我尝试打开 PHP 文件时 它都会显示以下错误消息 Warning mysql con
  • 按比例缩放 HTML 以完全适合 PDF A4 尺寸

    我正在使用 PHP Mysql jQuery 我有一个网页需要转换为高分辨率 A4 尺寸的 PDF http optisolbusiness com funeral site sample index id 255 我已使用以下方法将 HT
  • WindowsError:[错误 5] 尝试终止子进程时访问被拒绝 (python)

    所以我有一个 python 脚本 它运行一个循环 在该循环中它通过 subprocess Popen 调用程序 A 等待其输出 然后保存输出 然后再次调用它 依此类推 在我设置为输入的多次运行中 这种情况不断发生 问题是我有一个计时器 这样
  • 使用 WSDL (SOAP) 将 PayPal 集成到 C#/.NET 解决方案中

    环境 Visual Studio 2010 专业版 NET框架4 C 使用以下 WSDL 添加了服务参考 https www paypalobjects com wsdl PayPalSvc wsdl 问题1 像这样简单编译时 从 Refe
  • Scikit-Learn 决策树:预测为 a 或 b 的概率?

    我有一个带有 Scikit Learn 的基本决策树分类器 Used to determine men from women based on height and shoe size from sklearn import tree he
  • 强制 GVim 在关闭前提示

    我最近一直在过渡到 GVim 因为我发现它比终端中的 vim 更美观 而且速度更快一些 我有一个非常坏的习惯 我正在努力改掉 当我从命令行使用 vim 时 我的工作流程是这样的 vim filename txt make some edit
  • 如何在 R 中绘制 3D 堆叠直方图?

    我想在 R 中绘制堆积直方图 即在三维中堆叠各个直方图 感谢大家的建议 尤其是 Shane 的建议 hadley 我同意你的观点 但是 我的情况有所不同 我试图通过绘制四个堆叠直方图来传达的要点是尾部变化很大 将被遮挡的部分没有任何后果在我
  • 如何指示 MSVC 编译器使用 64 位/32 位除法而不是较慢的 128 位/64 位除法?

    如何告诉 MSVC 编译器使用 64 位 32 位除法运算来计算 x86 64 目标的以下函数的结果 include
  • 如何在 Python Flask 中的 celery 任务中保留请求上下文?

    有没有办法将请求复制到 Flask 中的 celery 任务 以便该任务在启动该任务的请求上下文中执行 我需要在 celery 任务中访问 Flask 安全性当前用户 但由于该任务位于请求上下文之外 所以我不能这样做 我需要请求中的其他信息
  • Flask db init 导致“KeyError: 'migrate'

    我已经创建了一个数据库并添加了 2 个表 场地 艺术家 这是我的 app py 中的一个聚会 import json import dateutil parser import babel from flask import Flask r
  • Xcode4.2中的无线调试

    当我在 Xcod e4 2 中使用无线调试时 它告诉我 不知道怎么跑 尝试 帮助目标 请参见 xcode 中的无线调试 了解更多信息 Xcode 4 2 中的无线调试仍然不稳定 我只能启动并运行一两次 然后需要重新启动 Xcode 禁用和重
  • 自动 x86 指令混淆

    我正在开发一个 x86 asm 混淆器 它将 Intel 语法代码作为字符串并输出一组等效的混淆操作码 这是一个例子 mov eax 0x5523 or eax ebx push eax call someAPI 变成类似这样的东西 mov