吉沃运营专员 发表于 2023-1-9 17:18:21

x64 混淆器 —— Alcatraz

工具源码:https://github.com/weak1337/Alcatraz
Alcatraz 是一个 x64 二进制混淆器,能够混淆各种不同的 PE 文件,包括:


[*].exe
[*].dll
[*].sys

要求
安装:https://vcpkg.io/en/getting-started.html


[*]asmjit: vcpkg.exe install asmjit:x64-windows
[*]Zydis: vcpkg.exe install zydis:x64-windows

使用



[*]单击左上角的文件加载二进制文件
[*]通过展开功能树添加功能 (可以通过在顶部的搜索栏中输入名称进行搜索)
[*]点击编译 (注意:混淆很多函数可能需要几秒钟)

特性
在下面的展示中,所有功能 (除了正在展示的功能) 都被禁用。

立即数移动混淆
如果将立即数移入寄存器,我们会通过应用多个按位运算来混淆它,来看看 _security_init_cookie 函数。

之前:



之后:



控制流扁平化
通过删除编译器生成的整齐的程序结构并将我们的代码放入新生成的块中增加程序的复杂性,让我们以这个简单的函数 main 为例 (禁用该程序的优化):



如果将其放入 IDA 7.6,反编译器将对其进行优化:



现在我们把它的控制流扁平化,让 IDA 再分析一遍:



即使只展示了生成代码的一小部分,复杂性也增加了很多。如果想知道 cfg 是什么样子:



ADD 变形
如果将寄存器 (例如 RAX) 添加到另一个寄存器 (例如 RCX),我们将改变指令,这意味着语法会改变但语义不会改变。指令 ADD RCX, RAX 可以变形为:

push rax
not rax
sub rcx, rax
pop rax
sub rcx, 1
如果想了解更多关于变形的信息,请查看 perses。

入口点混淆
如果 PE 文件是 .exe (将添加 .dll 支持),我们将创建一个自定义入口点,在启动时解密真实的入口点 (手动映射时不起作用)。



LEA 混淆
lea 混淆非常简单但有效,将一个不同的位置移到寄存器中,然后再解密。这样,逆向工程师就不能交叉引用某些数据/函数。假设找到以下指令:lea rcx, ,将其变形为:

pushf
lea rcx,
sub rcx, EFA7
popf

rcx -> 0xDEAD
反反汇编
如果找到一条以字节 0xFF 开头的指令,将在其前面放置一个 0xEB。这样做是因为 0xEB 0xFF 编码为 jmp rip + 1,最终跳转到实际的第一个 0xFF,这将抛弃以线性方式解码指令的工具。

之前:



之后:



有时可以插入:

jz 3
jne 1
0xE8
IDA 将尝试解码 0xE8 (调用) 但不会成功:



导入表混淆
目前没有 "适当的" IAT 混淆,0xFF 反反汇编技巧暂时解决了这个问题。此处计划正确实施:iat.cpp

最终结果
这是主要功能的一个片段,除了启用反反汇编之外的所有功能 (因此 IDA 可以创建一个功能):



页: [1]
查看完整版本: x64 混淆器 —— Alcatraz