Сейчас на форуме: asfa, _MBK_ (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Реверс-инжиниринг. Помогите советом.
Посл.ответ Сообщение

Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 января 2010 15:21
· Личное сообщение · #1

Есть внешний винчестер Transcend с кнопкой быстрого резервного копирования. Кнопку опрашивает утилитка под виндой через DeviceIoControl.

Хочу узнать протокол, что бы написать драйвер под Linux для получения состояния этой кнопки. Для этого пытаюсь набрать различных вариантов вызовов функции DeviceIoControl.

Беру OllyDbg(1.10), ставлю брякпоинт с логированием, и получаю половину того, чего хочу - параметры функции. Но ещё хочу залогировать и содержимое буфера, на который указывает один из параметров.

Нарыл вроде то что надо - плагин CLBPlus, но он почему-то не работает. Вписываю в логируемый брейкпоинт на импорт MessageBoxA такую строку:
CLBP DUMP [ESP+4] 30
(тестирую на каком-то crackme)

В логах появляется:
7E4507EA COND: [esp+4] = 00E10D4C
7E4507EA CALL to MessageBoxA from CRACKME.00401378
hOwner = 00E10D4C ('CrackMe v1.0',class='No need to disasm the code!')
Text = "No luck there, mate!"
Title = "No luck!"
Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
7E4507EA Breakpoint at USER32.MessageBoxA

Буфера нет.

Что посоветуете? Чем ещё можно наделать дампов параметров, чтоб потом в спокойной обстановке проанализировать их?

Ну или может я вообще не верно взялся за задачу? Может надо как-то по другому?



Ранг: 159.1 (ветеран), 7thx
Активность: 0.130
Статус: Участник

Создано: 25 января 2010 15:30
· Личное сообщение · #2

Утилитка через DeviceIoControl опрашивает виндовый драйвер кнопки. Через эту функцию нельзя узнать, как опрашивает сам драйвер кнопку.



Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 января 2010 15:34
· Личное сообщение · #3

tempread пишет:
Через эту функцию нельзя узнать, как опрашивает сам драйвер кнопку.

Там передаётся запрос IOCTL_SCSI_PASS_THROUGH_DIRECT, что как я понимаю означает передачу запроса напрямую к устройству.



Ранг: 159.1 (ветеран), 7thx
Активность: 0.130
Статус: Участник

Создано: 25 января 2010 15:40
· Личное сообщение · #4

tempread пишет:
означает передачу запроса напрямую к устройству.


Программы не могут напрямую общаться с железом, только через драйвера.



Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 января 2010 15:51
· Личное сообщение · #5

tempread пишет:
Программы не могут напрямую общаться с железом, только через драйвера.

Это понятно. Просто IOCTL_SCSI_PASS_THROUGH_DIRECT означает, что драйвер с данными ничего не делает, просто передаёт их устройству.
Поэтому драйвер меня не интересует, то же самое я смогу сделать в линуксе, вызвав
ioctl(fd,SCSI_IOCTL_SEND_COMMAND, &scsi_cmd)
Нужно только правильно заполнить scsi_cmd.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 25 января 2010 16:51 · Поправил: Coderess
· Личное сообщение · #6

0

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 25 января 2010 16:54 · Поправил: Coderess
· Личное сообщение · #7

Поэтому драйвер меня не интересует, то же самое я смогу сделать в линуксе, вызвав
ioctl(fd,SCSI_IOCTL_SEND_COMMAND, &scsi_cmd)
Нужно только правильно заполнить scsi_cmd.


Только сейчас дошло, тогда непойму в чем проблема?

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 января 2010 17:19
· Личное сообщение · #8

Проблема в том, что эта scsi команда vendor specific. Т.е. документации на неё нет, и я хотел собрать побольше данных, что передаётся девайсу и что возвращается. Ну а потом проанализировать эти данные и написать свою реализацию.

Непосредственно сама проблема в том, что не хочется на на каждый вызов DeviceIoControl лазить по дампу памяти и собирать информацию о буферах команды, sense буфере, выходном буфере. OllyDbg почти решает эту проблему, логируя параметры, но нужно ещё залогировать и буфера.

В общем-то я уже почти решил плюнуть на много запросов, и проанализировать всего один... А потом может ещё взять IDA и попробовать разобраться по коду, что оно там передаёт и с какими вариациями.



Ранг: 159.1 (ветеран), 7thx
Активность: 0.130
Статус: Участник

Создано: 25 января 2010 18:35 · Поправил: tempread
· Личное сообщение · #9

Если задача сводится к логгированию обмена между драйвером и программой и учитывая

azarkevich пишет:
Но ещё хочу залогировать и содержимое буфера, на который указывает один из параметров.


то нужно использовать скрипт(плагин ODbgScript)



Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 января 2010 18:59
· Личное сообщение · #10

Спасибо, кажется то что надо. Буду изучать.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 26 января 2010 19:20
· Личное сообщение · #11

я бы в данном случае использовал не столько отладчик, сколько дизассемблер IDA - наверняка всё обращение с драйвером вынесено в отдельную функцию (или несколько) - там же можно найти константы и прочее

-----
EnJoy!




Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 января 2010 10:40
· Личное сообщение · #12

IDA я тоже помучал, но не очень успешно. Там всё достаточно запутанно(для меня), функция обращения к драйверу вызывается ещё из примерно 30 функций, код оптимизирован, данные берутся из каких-то таблиц, которые инициализируются в рантайме.

Короче, SCSI команды не лежат "на поверхности".


 eXeL@B —› Вопросы новичков —› Реверс-инжиниринг. Помогите советом.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати