汇编代码混淆器是一款功能强大且用途广泛的工具,旨在增强你的 x86-64 汇编代码的安全性。它通过采用多种混淆技术和反分析措施,保护你的项目免受逆向工程和分析的侵扰。
指令注入:在每条汇编指令之前注入自定义字节序列,以迷惑反汇编器。
随机化:在代码结构中引入随机性,使其更难预测。
调试器检测:在代码执行期间检测调试器的存在,并采取反调试措施。
反分析技术:通过条件分支和时序检查来迷惑动态分析工具。
动态解密:在运行时加密并动态解密代码段,从而增加复杂性。
动态解压缩:压缩代码段并在运行时动态解压,隐藏代码的真实本质。
常量混淆:使用 XOR 运算、位操作等技术对常量和数据值进行混淆。
变量重命名:重命名变量和寄存器,使代码更难被人类阅读。
垃圾代码插入:插入垃圾代码段,进一步混淆代码库。
混淆过程的核心是在代码文件中的每条汇编指令之前注入自定义字节序列。这些经过策略性设计的字节序列旨在同时迷惑反汇编器与分析人员。让我们详细审视这一过程:
4005d2: 55 push rbp
内存中(十六进制):
0x55
400665: eb 01 jmp 400668 <main+0x3>
400667: b0 55 mov al,0x55
400669: eb 01 jmp 40066c <main+0x7>
内存中(十六进制):
0xEB, 0x01, 0xB0, 0x55
以下是该转换的详细解析:
原始指令 PUSH RBP 汇编后为 0x55。混淆器在其之前插入字节 0xEB, 0x01, 0xB0。
结果是一组指令序列,反汇编后可能与原始代码截然不同。这使得逆向工程(RE)人员难以理解代码的真实用途。
它在代码中引入随机化元素,涉及指令置换、操作数交换和操作码替换等技术。
集成了在代码执行期间检测调试器是否存在的机制。通过运行时检查识别与调试器相关的痕迹,并触发反分析措施。
集成了多种反分析措施,例如条件分支和时序检查。例如,它可能会插入条件跳转和延迟循环,以拖慢分析过程。
它采用动态解密技术,使用密钥加密特定代码段并在运行时对其解密。此解密过程在代码执行期间动态进行。
它会压缩特定代码段,并在执行时即时解压。
使用 XOR 运算、位操作和算术运算等技术来混淆常量,确保常量值不易被直接识别。
该工具会重命名变量和寄存器,使代码的可读性降低。该过程包括用随机生成的字符串或数字标识符替换变量名。
为了进一步混淆代码,混淆器会在关键位置插入垃圾代码段。这些垃圾代码由不影响程序逻辑的无关指令组成,但会使代码库变得杂乱。
; Original Code
mov eax, 1
; After Junk Code Insertion
mov ebx, 2
sub ecx, ecx
add edx, edx
内存中(十六进制):
0x89, 0xD8, 0x31, 0xC9, 0x01, 0xD2
插入的垃圾代码旨在转移注意力,使代码看起来更加复杂难懂。
它还集成了检测伪造 UPX 头部的功能。它会扫描代码中是否存在篡改 UPX 头部的迹象,以确保可执行文件的完整性。
转换之前(原始代码):
section .text
global _start
_start:
; Calculate the sum of the first 10 natural numbers
mov ecx, 10 ; Initialize loop counter
mov eax, 0 ; Initialize sum to 0
loop_start:
add eax, ecx ; Add current value of ECX to EAX (sum)
loop loop_start ; Decrement ECX and loop if not zero
; Exit program
mov eax, 1 ; SYS_exit
int 0x80 ; Invoke syscall
十六进制表示(原始代码):
31 C9 xor ecx,ecx
B8 00 00 00 00 mov eax,0x0
EB 0E jmp 0x1c
01 C8 add eax,ecx
E2 FB loop 0x11
B8 01 00 00 00 mov eax,0x1
CD 80 int 0x80
转换之后(混淆后的代码):
section .text
global _start
_start:
; Calculate the sum of the first 10 natural numbers
mov eax, 0x1
add eax, 0x2
add eax, 0x3
add eax, 0x4
add eax, 0x5
add eax, 0x6
add eax, 0x7
add eax, 0x8
add eax, 0x9
add eax, 0xa
; Exit program
mov eax, 0x1
int 0x80
十六进制表示(混淆后的代码):
B8 01 00 00 00 mov eax,0x1
83 C0 02 add eax,0x2
83 C0 03 add eax,0x3
83 C0 04 add eax,0x4
83 C0 05 add eax,0x5
83 C0 06 add eax,0x6
83 C0 07 add eax,0x7
83 C0 08 add eax,0x8
83 C0 09 add eax,0x9
83 C0 0A add eax,0xa
B8 01 00 00 00 mov eax,0x1
CD 80 int 0x80
在混淆后的代码中,我们通过添加冗余的 ADD 指令并使用十六进制值作为立即数,使原始程序逻辑不再那么明显。
本项目采用 MIT 许可证。详情请参阅 LICENSE 文件。
欢迎贡献!
如有问题、功能请求或一般咨询,请创建 issue。
本工具仅供教育和道德目的使用。