[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 4, Dec 1997 file 003
ЛИКБЕЗ ПО TURBO DEBUGER
by RedArc
Иногда бывает очень нужно внести какие-либо изменения в исполняемую
программу. Разумеется, что для этого чаще всего используют Hiew. Ну а если Вам
необходимо расшифровать какой-либо участок программы или наоборот,
покриптовать, то очень даже может оказаться, что возможностей Hiew'а будет
недостаточно. Тогда придется писать соответствующую программу самим.
Для разборки зашифрованного тела вируса, особенно если в нем отсутствуют
препятствия трассировке, вполне можно заюзать старенький Turbo Debuger фирмы
Borland. Я от различных людей слышал фразу, что "этот отладчик не позволяет
сохранять измененный код в файл". Это не правда, просто эта возможность
глубоко упрятана под слоем окошек и менюшек.
Разумеется, что для получения полнофункциональной EXE-программы после
отладчика нужно будет выполнить дополнительные шаги по созданию EXE Header. Ну
а если такой файл был сегментированным, то дополнительных шагов нужно будет
сделать гораздо больше.
Мы рассмотрим более простую задачу - сохранение COM-программы из Turbo
Debuger. Для этого оказывается необходимо сделать всего то 8 шагов! Я надеюсь,
что приведенная ниже информация во многом облегчит жизнь начинающим
вирмейкерам, да и другим также будет полезной... ;)
Для лучшего усвоения материала привожу экранные копии работы в Turbo
Debuger по каждому шагу.
1) Запоминаем длину "исследуемого объекта" в шестнадцатиричном формате,
например, используя калькулятор в DOS Navigator
=== Cut ===
┌────────────── C:\TEST ───────────────┐┌──── D:\...R\ONLY_FOR.YOU\VIR 167,024 ┐
│ Имя │ Размер │ Дата │Время││ Имя │ Размер │ Дата │Время│
│.. │ Каталог│ 6-03-97│21:28││VIRUS_A │ Каталог│15-05-97│11:54│
│5000 com│ 6,740│ 1-07-97│20:51││VIRUS_B │ Каталог│15-05-97│11:54│
│5000 exe│╔═[■]══════════════ Калькулятор ═══════════════════╗5-05-97│11:54│
│5000com lst│║ ║5-05-97│11:54│
│howcatch 2 │║┌ Выражение ─────────────────────────────────┬───┐║5-05-97│11:54│
│ │║│ 6740 │▐▌│║5-05-97│11:54│
│ │║└────────────────────────────────────────────┴───┘║5-05-97│11:54│
│ │║ Форма: ┌──────────────────────────────────────┐║5-05-97│11:54│
│ │║ () DEC │ 6740 │║5-05-97│11:54│
│ │║ ( ) HEX │ 1A54 │║5-05-97│11:54│
│ │║ ( ) BIN │ 1101001010100 │║5-05-97│11:54│
│ │║ ( ) OCT │ 15124 │║5-05-97│11:54│
│ │║ ( ) EXP │ 6.74000000000000E+0003 │║5-05-97│11:54│
│ │║ └──────────────────────────────────────┘║5-05-97│11:54│
│ │║ Вычислить▄ Скопировать ▄ Закрыть ▄ Помощь ▄ ║5-05-97│11:54│
│ │║ ▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ║5-05-97│11:54│
│────────────┴╚══════════════════════════════════════════════════╝───────┴─────│
│5000.com 6,740 1-07-97 20:51││VIRUS_D Каталог 15-05-97 11:54│
│ Файлы не отмечены ││ Файлы не отмечены │
│320,815,104 байт свободно на диске C: ││381,485,056 байт свободно на диске D: │
└[ A B C D E F G * ]───────────────────┘└[ A B C D E F G * ]───────────────────┘
=== Cut ===
2) Загружаем "исследуемый" объект в TD, производим какие то действия,
делаем активным левое нижнее окно (Shift + ), где обычно распологается дамп
сегмента DS.
=== Cut ===
Ё File Edit View Run Breakpoints Data Options Window Help READY
╔═[■]═CPU 80486═══════════════════════════════════════════════╤═══════1════[]═╗
║ cs:1488E80000 call 148B │ ax 0000 │c=0║
║ cs:148B 5E pop si │ bx 0000 │z=0║
║ cs:148C 83EE03 sub si,0003 │ cx 00FF │s=0║
║ cs:148F 2E8984C706 mov cs:[si+06C7],ax │ dx 5F33 │o=0║
║ cs:1494 06 push es │ si 0100 │p=0║
║ cs:1495 56 push si │ di FFFE │a=0║
║ cs:1496 33D2 xor dx,dx │ bp 0000 │i=1║
║ cs:1498 B483 mov ah,83 │ sp FFFE │d=0║
║ cs:149A CD21 int 21 │ ds 5F33 │ ║
║ cs:149C 5E pop si │ es 5F33 │ ║
║ cs:149D 56 push si │ ss 5F33 │ ║
║ cs:149E 81FA9019 cmp dx,1990 │ cs 5F33 │ ║
║ cs:14A2 746C je 1510 │ ip 1488 │ ║
║ cs:14A4 06 push es │ │ ║
║ cs:14A5 0E push cs │ │ ║
╟─────────────────────────────────────────────────────────────┼────────────┴───╢
║ ds:0000 CD 20 FF 9F 00 9A F0 FE ═ Я ЪЁ■ ss:0006 FEF0 ║
║ ds:0008 1D F0 E4 01 29 26 AE 01 Ёф)&о ■ ss:0004 9A00 ║
║ ds:0010 29 26 80 02 84 20 F2 11 )&АД Є ▒ ss:0002 9FFF ║
║ ds:0018 01 01 01 00 02 FF FF FF ▒ ss:0000 20CD ║
║ ds:0020 FF FF FF FF FF FF FF FF ss:FFFE0000 ║
╚■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╧═══════════════─┘
F1-Help F2-Bkpt F3-Mod F4-Here F5-Zoom F6-Next F7-Trace F8-Step F9-Run F10-Menu
=== Cut ===
3) Жмем комбинацию клавиш Ctrl+G и вводим сегмент и смещение начала
блока, который собираемся скидывать в файл. В качестве сегмента лучше указать
адрес сегмента кода вируса, а смещение блока - смещение кода вируса в этом
сегменте, например так:
=== Cut ===
Ё File Edit View Run Breakpoints Data Options Window Help PROMPT
╔═[■]═CPU 80486═══════════════════════════════════════════════╤═══════1════[]═╗
║ cs:1488E80000 call 148B │ ax 0000 │c=0║
║ cs:148B 5E pop si │ bx 0000 │z=0║
║ cs:148C 83EE03 sub si,0003 │ cx 00FF │s=0║
║ cs:148F 2E8984C706 mov cs:[si+06C7],ax │ dx 5F33 │o=0║
║ cs:1494 06 push es │ si 0100 │p=0║
║ cs:1495 56 push si │ di FFFE │a=0║
║ cs:1496 33D2 xor dx,dx │ bp 0000 │i=1║
║ cs:1498 B483 mov ah,83 │ sp FFFE │d=0║
║ cs:149A CD21 int 21 │ ds 5F33 │ ║
║ cs:149C 5E pop si │ es 5F33 │ ║
║ cs:149D 56 push si │ ss 5F33 │ ║
║ cs:149E 81FA9019 cmp dx,1990 │ cs 5F33 │ ║
║ cs:14A2 746C je 1510 │ ip 1488 │ ║
║ cs:14A4 06 push es │ │ ║
║ cs:14A5 0╔═[■]═Enter address to position to══════╗ │ │ ║
╟───────────║ ║─────────┼────────────┴───╢
║ ds:0000 C║ cs:100h ║ ss:0006 FEF0 ║
║ ds:0008 1║ ║ ■ ss:0004 9A00 ║
║ ds:0010 2║ OK ▄ Clip... ▄ Cancel ▄ Help ▄ ║ ▒ ss:0002 9FFF ║
║ ds:0018 0║ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀ ║ ▒ ss:0000 20CD ║
║ ds:0020 F╚═══════════════════════════════════════╝ ss:FFFE0000 ║
╚■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╧═══════════════─┘
Enter item prompted for in dialog title
=== Cut ===
4) Жмем комбинацию клавиш Alt+F10 для активизации PopUpMenu
=== Cut ===
Ё File Edit View Run Breakpoints Data Options Window Help MENU
╔═[■]═CPU 80486═══════════════════════════════════════════════╤═══════1════[]═╗
║ cs:1488E80000 call 148B │ ax 0000 │c=0║
║ cs:148B 5E pop si │ bx 0000 │z=0║
║ cs:148C 83EE03 sub si,0003 │ cx 00FF │s=0║
║ cs:148F 2E8984C706 mov cs:[si+06C7],ax │ dx 5F33 │o=0║
║ cs:1494 06 push es │ si 0100 │p=0║
║ cs:1495 56 push si │ di FFFE │a=0║
║ cs:1496 33D2 xor dx,dx │ bp 0000 │i=1║
║ cs:1498 B483 mov ah,83 │ sp FFFE │d=0║
║ cs:149A CD21 int 21 │ ds 5F33 │ ║
║ cs:149C 5E pop si │ es 5F33 │ ║
║ cs:149D ┌─────────────┐push si │ ss 5F33 │ ║
║ cs:149E │ Goto... │cmp dx,1990 │ cs 5F33 │ ║
║ cs:14A2 │ Search... │je 1510 │ ip 1488 │ ║
║ cs:14A4 │ Next │push es │ │ ║
║ cs:14A5 │ Change... │push cs │ │ ║
╟──────────│ Follow │────────────────────────────────────┼────────────┴───╢
║ ds:0000 │ Previous │9A F0 FE ═ Я ЪЁ■ ss:0006 FEF0 ║
║ ds:0008 ├─────────────┤26 AE 01 Ёф)&о ■ ss:0004 9A00 ║
║ ds:0010 │ Display as │20 F2 11 )&АД Є ▒ ss:0002 9FFF ║
║ ds:0018 │ Block │FF FF FF ▒ ss:0000 20CD ║
║ ds:0020 └─────────────┘FF FF FF ss:FFFE0000 ║
╚■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╧═══════════════─┘
Manipulate a block of data
=== Cut ===
5) Выбираем альтернативу Block
=== Cut ===
Ё File Edit View Run Breakpoints Data Options Window Help MENU
╔═[■]═CPU 80486═══════════════════════════════════════════════╤═══════1════[]═╗
║ cs:1488E80000 call 148B │ ax 0000 │c=0║
║ cs:148B 5E pop si │ bx 0000 │z=0║
║ cs:148C 83EE03 sub si,0003 │ cx 00FF │s=0║
║ cs:148F 2E8984C706 mov cs:[si+06C7],ax │ dx 5F33 │o=0║
║ cs:1494 06 push es │ si 0100 │p=0║
║ cs:1495 56 push si │ di FFFE │a=0║
║ cs:1496 33D2 xor dx,dx │ bp 0000 │i=1║
║ cs:1498 B483 mov ah,83 │ sp FFFE │d=0║
║ cs:149A CD21 int 21 │ ds 5F33 │ ║
║ cs:149C 5E pop si │ es 5F33 │ ║
║ cs:149D ┌─────────────┐push si │ ss 5F33 │ ║
║ cs:149E │ Goto... │cmp dx,1990 │ cs 5F33 │ ║
║ cs:14A2 │ Search... │je 1510 │ ip 1488 │ ║
║ cs:14A4 │ Next │push es │ │ ║
║ cs:14A5 │┌──────────┐ │push cs │ │ ║
╟──────────││ Clear... ││────────────────────────────────────┼────────────┴───╢
║ ds:0000 ││ Move... │ │9A F0 FE ═ Я ЪЁ■ ss:0006 FEF0 ║
║ ds:0008 ├│ Set... │─┤26 AE 01 Ёф)&о ■ ss:0004 9A00 ║
║ ds:0010 ││ Read... ││20 F2 11 )&АД Є ▒ ss:0002 9FFF ║
║ ds:0018 ││ Write... ││FF FF FF ▒ ss:0000 20CD ║
║ ds:0020 └└──────────┘─┘FF FF FF ss:FFFE0000 ║
╚■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╧═══════════════─┘
Write from a memory block to a disk file
=== Cut ===
6) В открывшемся меню выбираем альтернативу Write и вводим имя файла, в
который будем скидывать дамп.
=== Cut ===
Ё File Edit View Run Breakpoints Data Options Window Help PROMPT
╔═[■]═CPU 8048╔═[■]═══════════Enter write file name════════════════╗══1════[]═╗
║ cs:1488E80║ ║0000 │c=0║
║ cs:148B 5E ║ File name ║0000 │z=0║
║ cs:148C 83E║ damp.com OK ▄ ║00FF │s=0║
║ cs:148F 2E8║ ▀▀▀▀▀▀▀▀ ║5F33 │o=0║
║ cs:1494 06 ║ Files Directories ║0100 │p=0║
║ cs:1495 56 ║ .. Cancel ▄ ║FFFE │a=0║
║ cs:1496 33D║ ▀▀▀▀▀▀▀▀ ║0000 │i=1║
║ cs:1498 B48║ ║FFFE │d=0║
║ cs:149A CD2║ Help ▄ ║5F33 │ ║
║ cs:149C 5E ║ ▀▀▀▀▀▀▀▀ ║5F33 │ ║
║ cs:149D 56 ║ ║5F33 │ ║
║ cs:149E 81F║ ║5F33 │ ║
║ cs:14A2 746║ ║1488 │ ║
║ cs:14A4 06 ║ ║ │ ║
║ cs:14A5 0E ║ ║ │ ║
╟─────────────║ ║───────┴───╢
║ ds:0000 CD ║ ║0006 FEF0 ║
║ ds:0008 1D ║ ║0004 9A00 ║
║ ds:0010 29 ║C:\TEST\ ║0002 9FFF ║
║ ds:0018 01 ║ ║0000 20CD ║
║ ds:0020 FF ╚════════════════════════════════════════════════════╝FFFE0000 ║
╚■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╧═══════════════─┘
Enter a file name
=== Cut ===
7) Вводим смещение начала блока дампа и длину блока. Лучше за начало
смещения дампа взять 100h, а за длину дампа размер файла в шестнадцатиричном
виде (который мы запомнили в пункте 1).
=== Cut ===
Ё File Edit View Run Breakpoints Data Options Window Help PROMPT
╔═[■]═CPU 80486═══════════════════════════════════════════════╤═══════1════[]═╗
║ cs:1488E80000 call 148B │ ax 0000 │c=0║
║ cs:148B 5E pop si │ bx 0000 │z=0║
║ cs:148C 83EE03 sub si,0003 │ cx 00FF │s=0║
║ cs:148F 2E8984C706 mov cs:[si+06C7],ax │ dx 5F33 │o=0║
║ cs:1494 06 push es │ si 0100 │p=0║
║ cs:1495 56 push si │ di FFFE │a=0║
║ cs:1496 33D2 xor dx,dx │ bp 0000 │i=1║
║ cs:1498 B483 mov ah,83 │ sp FFFE │d=0║
║ cs:149A CD21 int 21 │ ds 5F33 │ ║
║ cs:149C 5E pop si │ es 5F33 │ ║
║ cs:149D 56 push si │ ss 5F33 │ ║
║ cs:149E 81FA9019 cmp dx,1990 │ cs 5F33 │ ║
║ cs:14A2 746C je 1510 │ ip 1488 │ ║
║ cs:14A4 06 push es │ │ ║
║ cs:14A5 0E ╔═[■]══Enter memory address, count══════╗ │ │ ║
╟─────────────║ ║───────┼────────────┴───╢
║ ds:0000 CD ║ 100h,1a54h ║ ss:0006 FEF0 ║
║ ds:0008 1D ║ ║ ■ ss:0004 9A00 ║
║ ds:0010 29 ║ OK ▄ Clip... ▄ Cancel ▄ Help ▄ ║ ▒ ss:0002 9FFF ║
║ ds:0018 01 ║ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀ ║ ▒ ss:0000 20CD ║
║ ds:0020 FF ╚═══════════════════════════════════════╝ ss:FFFE0000 ║
╚■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╧═══════════════─┘
Enter item prompted for in dialog title
=== Cut ===
8) Выходим из отладчика и... усе готово шеф! ;)