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