#11
09 мая 2009 в 12:11
Если интересно расскажу, откуда завелась манера завершать программы через RET. :)<br />Правильности нижеизложенного к EXE файлам не гарантирую, но для COM программ это будет верно:<br />DOS, запуская на выполнение программу, предварительно пишет в стек адрес, указывающий на команду INT 20h (только для COM). Эти два байта являлись частью программного префикса, первых 256 (0100h) байт в кодовом сегменте COM программы. Область называется, если склероз не подводит - PSP (Кстати, в этой области также находится командная строка, параметры, передаваемые программе, кажется адрес 80h). Некоторые старые вирусы могли подменять в стеке адрес на ссылку на свой код. Уже этот факт компрометирует сомнительную экономию в 1 байт :D на размере программы. Еще не стоит сбрасывать со счетов возможность порчи стека или подмены тех пары байт CD 20 (int 20h)...<br />
#12
09 мая 2009 в 12:19
Берсеркер<br />Мне это действительно интересно, я не привык работать по принципу "черного ящика" :) <br />Теперь малость проясняется. <br /><br />Отладчик как правило прыгает на INT 2?h после выполнения ret в главной процедуре, но как видно из вышесказанного - лучше подстраховаться, и включить эти инструкции непосредственно в код программы.
#13
09 мая 2009 в 12:28
::) <br />славное было время, интересное...<br />Даже как-то освоил метод получения "чистого" адреса INT 21h (адрес операционки DOS, а не первого попавшегося резидента - антивирусный монитор, либо сам вирус, либо драйвер какой или шпион). Способ подглядел в знаменитом когда-то вирусе Yankee Dodle Dandy ;)<br />Так же писал генератор полиморфного расшифровщика - основа полиморфного вируса, аппаратную защиту от отладчиков (на базе пошагового прерывания CPU - Int 1), код использования четвертой страницы видеопамяти в текстовом режиме под буфер, stealth-алгоритмы... Всё, молчу... а то научу как написать жуткий вирус ;D Честно говоря это интересно, но уже не актуально ::)
#14
09 мая 2009 в 12:30
;D<br /><br />Значит, если я включаю <br />
MOV AH, 4Ch<br />MOV AL, errorlevel code<br />INT 21h
<br />в программу то<br />ненужно делать в начале главной процедуры <br />PUSH DS<br />MOV AX, 0<br />PUSH AX
<br />?
#15
09 мая 2009 в 12:36
хм, т.е. хочешь сказать что эти команды были для того чтоб выполнить ret ?<br />Чистый ret юзает только адрес в пределах текущего кодового сегмента.<br />ret far - берет также и сегмент.<br />Значит у тебя была ошибка (несущественная ибо не вызывает крэш).<br />Адрес возврата в ось = DS:0000 ? Хм.... а разве не CS ? Ну тут я могу ошибваться...<br />Если так, то да, пару пушей в начале проги убей, замени на человеческий 4c00/int 21
#16
09 мая 2009 в 12:40
Берсеркер<br />Да, на лекции сказали что DS:0000 это адрес возврата управления операционной системе (ДОС?)<br /> :)
#17
09 мая 2009 в 12:42
считай командный процессор CMD в NT - эмулятором DOS :)<br />Вернее будет - сервис NTVDM
#18
09 мая 2009 в 12:43
Берсеркер<br />Я щас в Виста х64, тут всё даже сложнее ;D <br />ДОС-бокс (debugger version)
#19
09 мая 2009 в 12:45
ха! это уже интересно!<br />помнится что в XP64 невозможно выполнить 16-битный код.<br />В Висте64 уже можно??
#20
09 мая 2009 в 12:47
Берсеркер<br />Нет, юзаю эмулятор DOS box. Гемор. Он хреново эмулирует те же отладчики.