欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

【Anti Virus专题】1.3 - 如何编写病毒代码

【Anti Virus专题】1.3 - 如何编写病毒代码

1.3.如何编写病毒代码
  上个星期由于演讲,导致没有时间拟写文章,今日将此篇文章赶出来,大家接着看吧, 这个专题我肯定是持续更新的,请大家放心,只不过部分时候可能会有紧急事情导致没有办法随时更新。
  首先我想你如果学习了前面课程的话,回答这节课程标题的提问肯定是没有问题的。如何编写病毒代码?
首先我把最重要的两个方面列举出来。
  1. 处理病毒各个绝对地址的重定位。
  2. 所有需调用的api函数地址,均通过动态搜索来获得。
  做到以上2点,我们的病毒代码就可以移植到任意的程序中。没错,就和我们写shellcode一样。那么首先前面两部分我们在之前的“1.2编写病毒所需掌握的知识中”已经给大家深入的讲解了。
今天呢,我就给大家再继续讲解讲解“编写病毒代码需要注意到的地方”,并把前面讲解过的内容做一个串联,我们来实践一下。
  首先编写病毒代码最重要的地方无过于优化了。或许现在大部分人不注重,但是作为一个vxer,我觉得还是要多多注重,因为这体现我们对cpu指令集以及opcode掌握的程度等,早在一年前看到
29adrocon的代码,代码很漂亮,当时看看自己的代码........... ,随即就对优化产生了兴趣,紧接着最重要的是把优化运用到自己的编译器中。 

1. 如何有效的优化代码。
    作为一个vxer我们要时常自己去发现一些字节优化等技巧,来展现在我们的代码中。举个很简单的例子,ZeroMemory。
;eax - pointer to buffer , ecx - length of buffer
_ZeroMemory:
@@:
    mov     byte [eax+ecx-1], 0  ;5 byte 
    loop    @B      ;2 byte
    retn

    另外我们的Virus代码要尽量避免使用局部变量来存储相关API函数的返回值,我们应通过pushad popad来尽量使用寄存器来存储变量。这样我们可以更有效控制字节大小,OK。举了上面的两个例子,我们来进入今天的主题如何有效的优化代码。
    早在之前我们国外的DDT杂1期就有一篇文章《32 bit optimization》网上大部分的32位代码优化文章也是来自修改此篇文章,  我们来看下这篇文章的介绍。

(1)测试寄存器是否为0
    
    cmp     eax,00000000h                   ; 6 bytes
    jz      bribriblibli                    ; 2 bytes (if jz is short)
    
 
 optimization:
    
    or      eax,eax                         ; 2 bytes
    jz      bribriblibli                       ; 2 bytes (if jz is short)

    xchg    eax,ecx                         ; 1 byte
    jecxz   bribriblibli                   ; 2 bytes (if it is short)

(2)测试寄存器是否为-1
    cmp     eax,0FFFFFFFFh                  ; 6 bytes
    jz      insumision                    ; 2 bytes (if short)
optimization:
    inc     eax                                   ; 1 byte
    xchg    eax,ecx                            ; 1 byte
    jecxz   insumision                         ; 2 bytes (if short)
    dec     ecx                                 ; 1 byte 

    inc     eax                                  ; 1 byte
    jz      insumision                        ; 2 bytes
    dec     eax                                ; 1 byte

(3)寄存器清0并传送低位字数值
    xor     eax,eax                         ; 2 bytes
    mov     ax,word ptr [esi+6]             ; 4 bytes
optimization:
    movzx   eax,word ptr [esi+6]            ; 4 bytes
(4) 关于push的优化
    mov   eax, 50h                   ; 5 bytes
optimization:
    push  50h                        ; 2 bytes 
    pop      eax                        ; 1 bytes
    

    push   0                         ; 2 bytes 
    push   0                         ; 2 bytes 
    push   0                         ; 2 bytes 
    push   0                         ; 2 bytes 
    push   0                         ; 2 bytes 
    push   0                         ; 2 bytes 
    push   0                         ; 2 bytes 
optimization:
    xor   eax, eax                           ; 2 bytes 
    push   eax                     ; 1 byte 
    push   eax                     ; 1 byte 
    push   eax                     ; 1 byte 
    push   eax                     ; 1 byte 
    push   eax                     ; 1 byte 
    push   eax                     ; 1 byte 
    push   eax                     ; 1 byte 

    push   7                         ; 2 bytes 
    pop   ecx                     ; 1 byte 
_loop: 
    push   0                         ; 2 bytes 
    loop   _loop                    ; 2 bytes 
(5) 操作FS寄存器相关优化
    push    dword ptr fs:[00000000h]        ; 6 bytes
    mov     fs:[0],esp                      ; 6 bytes
    [...]
    pop     dword ptr fs:[00000000h]        ; 6 bytes
    
optimization:
    xor     eax,eax                         ; 2 bytes
    push    dword ptr fs:[eax]              ; 3 bytes
    mov     fs:[eax],esp                    ; 3 bytes
    [...]
    pop     dword ptr fs:[eax]              ; 3 bytes
(6) 字符串操作
    mov al/ax/eax, [esi]                ; 2/3/2 bytes 
    inc esi                          ; 1 byte 
optimization:
    lodsb/w/d                          ; 1 or 2 byte 
 到达字符串尾部。
    lea     edi,[ebp+ASCIIz_variable]       ; 6 bytes
 @@1:   
    cmp     byte ptr [edi],00h              ; 3 bytes
    inc     edi                             ; 1 byte
    jz      @@2                             ; 2 bytes
    jmp     @@1                             ; 2 bytes
 @@2:   
    inc     edi                             ; 1 byte
optimization:
    lea     edi,[ebp+ASCIIz_variable]       ; 6 bytes
    xor     al,al                           ; 2 bytes
 @@1:   
    scasb                                   ; 1 byte
    jnz     @@1                             ; 2 bytes

(7)乘法 
    mov     ecx,28h                         ; 5 bytes
    mul     ecx                             ; 2 bytes

optimization:
    imul    eax,eax,28h                     ; 3 bytes

(8)置edx寄存器为0.
    xor  edx, edx                      ; 2 bytes
optimization:
    cdq                              ; 1 bytes

(9)交换寄存器4字节的顺序
    mov eax, 00200000h                   ; 5 bytes 
    bswap eax                         ; 2 bytes 
    ;eax = 00002000h now 

(10)乘2、除2
    shl   eax, 1                     ; 2 bytes
    ;*2
    
    shr  eax, 1                        ; 2 bytes
    ;/2      
(11)分配堆栈空间
    push    ebp                             ; 1 byte
    mov     ebp,esp                         ; 2 bytes
    sub     esp,20h                         ; 3 bytes
optimization:
    enter   20h,00h                         ; 4 bytes

(12)压入字符串指针时尽量使用
    call  @f
    db  'string', 0
    @@:
OK。以上的优化我认为是一个asm coder起码要注重的。更好的优化意味着也是一个更好的病毒。好了,不理解的人,可能认为我是发疯,但是有谁知道沉浸中的乐趣呢?

2. 实例以病毒代码的思路开始Write:

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功