Вопрос по исследованию драйвера (dos)

Тема в разделе "WASM.RESEARCH", создана пользователем m0rd, 18 фев 2008.

  1. m0rd

    m0rd New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2007
    Сообщения:
    6
    Исследую тут небольшой досовский драйвер при помощи IDA и вот наткнулся на такой кусок
    Код (Text):
    1.     db '.À>-K',0
    2.     db 74h, 0Eh, 2 dup(90h), 0EAh
    IDA определяет как данные, но ссылки на эти данные нигде нет
    Если представить это как код, то получается
    Код (Text):
    1.                  cmp     cs:byte_4BD9, 0 ; Compare Two Operands
    2.                  jz      short loc_4CA   ; Jump if Zero (ZF=1)
    3.                  nop                     ; No Operation
    4.                  nop                     ; No Operation
    5.  ; ---------------------------------------------------------------------------
    6.                 db 0EAh
    тоже вроде как-то не вяжется, потому что перед этим стоит jmp, да и db 0EAh тоже тут никуда.
    Вот и не понятно что это вообще такое.
    Может кто подскажет что-нибудь?
     
  2. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    мне кажется что не понимание этого кусочка врядли отразится на понимании картины в целом )
     
  3. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    m0rd
    По такому крошечному куску сказать что-либо конкретное очень сложно. Может где-то есть еще неопределенные куски кода или данных, где есть ссылки сюда. Вполне возможно, что "2 dup(90h)" - это выравнивание на границу. На какую, тоже не скажешь, не видя адресов...
    Не исключено также, что это, скажем, номер версии или какой-нибудь magic, который проверяется другой программой (или автором).

    spencer
    :о)
     
  4. m0rd

    m0rd New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2007
    Сообщения:
    6
    spencer
    ну картину в целом я понимаю, и даже после восстановления кода он компилится в .com файл нормально....ну не работает тока)
    Sergey_R
    понятно, ладно буду копать дальше

    Кстати о выравнивании:
    Сравнивал hex-редактором оригинал и откомплиненый файл, почему то после анализа появляется лишний nop после команды jz и, видимо, из-за этого align 2 и компилятор потом начинает ругаться на это все. Откуда может выравнивание появляться?
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    m0rd
    ИМХО ссылка где-то в коде "затерялась". Полагаться целиком на тот листинг, который IDA создала, не советую, тем более, что это Досовский драйвер :)
     
  6. ConstZ

    ConstZ New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    42
    Досовский драйвер формально должен иметь два входа, и не может исполняться как .com
     
  7. m0rd

    m0rd New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2007
    Сообщения:
    6
    ConstZ
    Ну может это не прямо досовский драйвер, но этот файл загружается в память и там висит. Может я и не корректно назвал его драйвером, но по принципу работы это драйвер)
     
  8. ConstZ

    ConstZ New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    42
    Если я правильно понял - это TSR. Резидентная в памяти программа, обрабатывающая какие-то события.
    Такая программа должна после своей загрузки в память перехватить нужные ей события, настроить переходы на свою резидентную часть и выгрузить из памяти нерезидентную часть.
    У такой программы может быть сколько угодно точек входа, может быть ты на них натыкаешься?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ConstZ
    Ну основная точка входа у нее одна, остальные вызываются по требованию от соответствующих событий, если ты про это. Обычно ведь TSR ставят цепочечные обработчики прерываний или что-нибудь такое (мб я не знаю какого-то другого их применения :P) и уходят в keep() (если на си:))
    Если оно ставит обработчик прерывания и это часть обработчика, то все равно должны быть ссылки на это место.
    Автору рекомендую получше изучить в иде листинг, вероятно, гдето он код принял за данные и пропали нужные ему ссылки =)
     
  10. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Поищи где-нибудь в коде что-нибудь вроде JMP AX, возможно, переход в эту точку происходит по адресу в регистре.

    И вообще, показанный кусок очень напоминает что-то вроде очень типичного для вирусов и драйверов фрагмента типа:

    Код (Text):
    1.  ...
    2.  cmp Flag, 0
    3.  jnz Skip
    4.  nop
    5.  nop
    6.  jmp XXXX:YYYY
    7. Skip:
    8. ...
    Я угадал? :)
     
  11. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Поищи где-нибудь в коде что-нибудь вроде JMP AX, возможно, переход в эту точку происходит по адресу в регистре.

    И вообще, показанный кусок очень напоминает что-то вроде очень типичного для вирусов и драйверов фрагмента типа:

    Код (Text):
    1.  ...
    2.  cmp Flag, 0
    3.  jnz Skip
    4.  nop
    5.  nop
    6.  jmp XXXX:YYYY
    7. Skip:
    8. ...
    Я угадал? :)
     
  12. ConstZ

    ConstZ New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    42
    Так как DOS может загрузить эту TSR по произвольному адресу, то сылку на "это место" необходимо вычислить в нерезидентной части программы, чтобы правильно сделать переход по прерыванию на резидентную часть.

    Поэтому, я полностью согласен:
     
  13. m0rd

    m0rd New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2007
    Сообщения:
    6
    drmad,
    ну да, там так и есть, если все в код перевести, то получается:
    Код (Text):
    1. seg000:04B4                 cmp     cs:byte_4BD9, 0 ; Compare Two Operands
    2. seg000:04BA                 jz      short loc_4CA   ; Jump if Zero (ZF=1)
    3. seg000:04BC                 nop                     ; No Operation
    4. seg000:04BD                 nop                     ; No Operation
    5. seg000:04BE
    6. seg000:04BE loc_4BE:                                ; DATA XREF: seg000:5F22w
    7. seg000:04BE                                         ; seg000:5F26w
    8. seg000:04BE                 jmp     far ptr 0:0     ; Jump
    вот тока смущает то что ссылки там стоят и потом в коде идет:
    Код (Text):
    1. seg000:5F22                 mov     word ptr loc_4BE+1, bx
    2. seg000:5F26                 mov     word ptr loc_4BE+3, es
    ConstZ, а есть какие-нибудь рекомендации по исследованию этих самых TSR, где что можно почитать?
     
  14. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    m0rd
    Это то, о чем drmad говорил - так формируется адрес перехода jmp far ptr 0:0 (вместо адреса 0:0 будет стоять конкретный адрес). Смутно чувствую, что это вектор переназначаемого прерывания (ИМХО).
     
  15. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    Почему смущает-то? В точке seg000:04BE дальний переход по адресу - смещение, сегмент. Вот в seg000:5F22 он как раз и формируется из bx и es (скорее всего, во время загрузки или процедуры настройки).
    А почитать поищи в гугле - "ДОС (или DOS) + TRS".

    Или настройка по адресу загрузки...
     
  16. m0rd

    m0rd New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2007
    Сообщения:
    6
    Sergey_R, crypto, ага, я понял теперь) спасибо, буду дальше разбираться...