Исследую тут небольшой досовский драйвер при помощи IDA и вот наткнулся на такой кусок Код (Text): db '.À>-K',0 db 74h, 0Eh, 2 dup(90h), 0EAh IDA определяет как данные, но ссылки на эти данные нигде нет Если представить это как код, то получается Код (Text): cmp cs:byte_4BD9, 0 ; Compare Two Operands jz short loc_4CA ; Jump if Zero (ZF=1) nop ; No Operation nop ; No Operation ; --------------------------------------------------------------------------- db 0EAh тоже вроде как-то не вяжется, потому что перед этим стоит jmp, да и db 0EAh тоже тут никуда. Вот и не понятно что это вообще такое. Может кто подскажет что-нибудь?
m0rd По такому крошечному куску сказать что-либо конкретное очень сложно. Может где-то есть еще неопределенные куски кода или данных, где есть ссылки сюда. Вполне возможно, что "2 dup(90h)" - это выравнивание на границу. На какую, тоже не скажешь, не видя адресов... Не исключено также, что это, скажем, номер версии или какой-нибудь magic, который проверяется другой программой (или автором). spencer :о)
spencer ну картину в целом я понимаю, и даже после восстановления кода он компилится в .com файл нормально....ну не работает тока) Sergey_R понятно, ладно буду копать дальше Кстати о выравнивании: Сравнивал hex-редактором оригинал и откомплиненый файл, почему то после анализа появляется лишний nop после команды jz и, видимо, из-за этого align 2 и компилятор потом начинает ругаться на это все. Откуда может выравнивание появляться?
m0rd ИМХО ссылка где-то в коде "затерялась". Полагаться целиком на тот листинг, который IDA создала, не советую, тем более, что это Досовский драйвер
ConstZ Ну может это не прямо досовский драйвер, но этот файл загружается в память и там висит. Может я и не корректно назвал его драйвером, но по принципу работы это драйвер)
Если я правильно понял - это TSR. Резидентная в памяти программа, обрабатывающая какие-то события. Такая программа должна после своей загрузки в память перехватить нужные ей события, настроить переходы на свою резидентную часть и выгрузить из памяти нерезидентную часть. У такой программы может быть сколько угодно точек входа, может быть ты на них натыкаешься?
ConstZ Ну основная точка входа у нее одна, остальные вызываются по требованию от соответствующих событий, если ты про это. Обычно ведь TSR ставят цепочечные обработчики прерываний или что-нибудь такое (мб я не знаю какого-то другого их применения :P) и уходят в keep() (если на си) Если оно ставит обработчик прерывания и это часть обработчика, то все равно должны быть ссылки на это место. Автору рекомендую получше изучить в иде листинг, вероятно, гдето он код принял за данные и пропали нужные ему ссылки =)
Поищи где-нибудь в коде что-нибудь вроде JMP AX, возможно, переход в эту точку происходит по адресу в регистре. И вообще, показанный кусок очень напоминает что-то вроде очень типичного для вирусов и драйверов фрагмента типа: Код (Text): ... cmp Flag, 0 jnz Skip nop nop jmp XXXX:YYYY Skip: ... Я угадал?
Поищи где-нибудь в коде что-нибудь вроде JMP AX, возможно, переход в эту точку происходит по адресу в регистре. И вообще, показанный кусок очень напоминает что-то вроде очень типичного для вирусов и драйверов фрагмента типа: Код (Text): ... cmp Flag, 0 jnz Skip nop nop jmp XXXX:YYYY Skip: ... Я угадал?
Так как DOS может загрузить эту TSR по произвольному адресу, то сылку на "это место" необходимо вычислить в нерезидентной части программы, чтобы правильно сделать переход по прерыванию на резидентную часть. Поэтому, я полностью согласен:
drmad, ну да, там так и есть, если все в код перевести, то получается: Код (Text): seg000:04B4 cmp cs:byte_4BD9, 0 ; Compare Two Operands seg000:04BA jz short loc_4CA ; Jump if Zero (ZF=1) seg000:04BC nop ; No Operation seg000:04BD nop ; No Operation seg000:04BE seg000:04BE loc_4BE: ; DATA XREF: seg000:5F22w seg000:04BE ; seg000:5F26w seg000:04BE jmp far ptr 0:0 ; Jump вот тока смущает то что ссылки там стоят и потом в коде идет: Код (Text): seg000:5F22 mov word ptr loc_4BE+1, bx seg000:5F26 mov word ptr loc_4BE+3, es ConstZ, а есть какие-нибудь рекомендации по исследованию этих самых TSR, где что можно почитать?
m0rd Это то, о чем drmad говорил - так формируется адрес перехода jmp far ptr 0:0 (вместо адреса 0:0 будет стоять конкретный адрес). Смутно чувствую, что это вектор переназначаемого прерывания (ИМХО).
Почему смущает-то? В точке seg000:04BE дальний переход по адресу - смещение, сегмент. Вот в seg000:5F22 он как раз и формируется из bx и es (скорее всего, во время загрузки или процедуры настройки). А почитать поищи в гугле - "ДОС (или DOS) + TRS". Или настройка по адресу загрузки...