Сейчас на форуме: Rio, -Sanchez-, artyavmu (+7 невидимых)

 eXeL@B —› Софт, инструменты —› Как прокинуть в IDA информацию о функциях [имя:адрес]? С DBG проблема.
Посл.ответ Сообщение

Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 мая 2012 03:38 · Поправил: uinor
· Личное сообщение · #1

При попытке подгрузить DBG-файл в IDA 6.1 возникает exception, вида:


DBG файл читабелен (к примеру, PEview) -> CodeView (NB09). Интереса ради распарсил его ручками, адреса функций совпадают с жертвой. См. иллюстрацию в аттаче.
5f73_23.05.2012_EXELAB.rU.tgz - IDAvsDBG.png

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

Существует ли иной способ (не через DBG) прокинуть массово в IDA информацию о функциях [имя:адрес]?

UPD1
Попробовал парсить DBG и на лету генерировать IDC скрипт вида
Code:
  1. #include <idc.idc>
  2.  
  3. static main(void) {
  4.   LoadFunctionsTable();
  5. }
  6.  
  7. static LoadFunctionsTable(void) {
  8.   MakeFunction(0x0040111C, BADADDR);
  9.   MakeNameEx(0x0040111C, "__acrtused", SN_CHECK);
  10.   MakeFunction(0x00401175, BADADDR);
  11.   MakeNameEx(0x00401175, "__GetExceptDLLinfo", SN_CHECK);
  12.   MakeFunction(0x0040117A, BADADDR);
  13.   MakeNameEx(0x0040117A, "__isDLL", SN_CHECK);
  14.   ...
  15.   MakeFunction(0x00401182, BADADDR);
  16.   MakeNameEx(0x00401182, "__getHInstance", SN_CHECK);
  17.   MakeFunction(0x0040125C, BADADDR);
  18.   MakeNameEx(0x0040125C, "___System__GetTls", SN_CHECK);
  19.   MakeFunction(0x0040126C, BADADDR);
  20.   MakeNameEx(0x0040126C, "C2_0", SN_CHECK);
  21.   ...
  22. }

После его применения все ломается к чертовой матери, в процессе куча ошибок вида:
1) can't rename byte as 'some_func' because this byte can't have a name (it is a tail byte);
2) can't rename byte as 'some_func' because the name is already used in the program.

Явно должен быть какой-то отработанный годами способ, чтоб внедрить эту крайне полезную отладочную информацию просто и удобно.

UPD2
+ ЯВНО ЕДЕТ АДРЕСАЦИЯ, т.е. на первых 5-7 функциях все нормально, потом идет постепенное смещение. С чем может быть связано? Ощущение, что возникает проблема с выравниванием. Не представляю как решить. В итоге курсор в скрипте начинает опережать действительность.




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 23 мая 2012 08:52 · Поправил: =TS=
· Личное сообщение · #2

uinor пишет:
Существует ли иной способ (не через DBG) прокинуть массово в IDA информацию о функциях [имя:адрес]?

map-файл
Правда в нём идёт привязка к сегменту (если их несколько)

В простейшем случае вид:
Code:
  1.  000x:0000yyyy       sssssss
где x - номер сегмента (от 1 до n, 0 — заголовок), yyyy — смещение в сегменте (RVA), sssssss — имя символа

-----
DREAMS CALL US


| Сообщение посчитали полезным: uinor

Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 мая 2012 10:13
· Личное сообщение · #3

=TS= пишет:
map-файл

К сожалению, у IDA нет возможности подсосать MAP-файл, а по своей сути оно равно формированию скрипта из моего первого коммента (все советуют тупо конвертить MAP в IDC скрипт, ибо другого варианта нет). Меня бы и скрипт устроил, но явно какая-то проблема со сдвигом, причину которого не могу понять.

Хорошо видно на картинке (в npp как раз сгенеренный map-файл с rva в первом сегменте):





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 23 мая 2012 10:43 · Поправил: =TS=
· Личное сообщение · #4

Ну есть много плагинов для импорта map файла, вот один из них
Когда найду время доковырять деманглинг формата шаблонов в borland'овских именах, выложу свой под IDA и HIEW. Старая версия где-то валялась на форуме в теме по IDA.

-----
DREAMS CALL US




Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 мая 2012 11:14 · Поправил: uinor
· Личное сообщение · #5

=TS= пишет:
есть много плагинов для импорта map файла

Спасибо, не стал пересобирать его под 6.1, заюзал на 5.2 доступный собранный. Отработало так же как и скрипт - спустя 7 функций начинает сыпаться, без лишнего шума, правда, и окончательно показало проблему: RVA из DBG файла, с ними что-то не так.

Первые 7 функций, у которых нет в конце данных отрабатываются без проблем, потом (см. скриншот выше - FetchValue первая такая) начинается сдвиг курсора на габарит данных.

Еще раз смотрим на скриншот:
Code:
  1. "FetchValue" VA: 004012B4 / DBG-RVA: 2B4 - OK
  2. тут идут данные: 4b
  3. "IntfCast" VA: 004012CC / DBG-RVA: 2D0 - ALARM
  4. тут идут данные: 4b

и они, данные, не учтены в RVA [2D0 - 2CC = те самые 4 байта], который взят из DBG

У кого-нибудь есть идея?



Ранг: 18.2 (новичок), 8thx
Активность: 0.010
Статус: Участник

Создано: 23 мая 2012 11:57
· Личное сообщение · #6

Самое простое:

на адресе где долно быть начало функции вызываешь GetDisasm и смотришь что вернуло, если align XX то сплитишь по пробелу(или табу не помню) и смотришь размер выравнивания.

Так же можно вызывать на адрес Byte и проверять на 0xCC и 0x90 (ну или что еще там используется для выравнивания), двигаться вниз пока не попадешь на начало функции (тут можно поставить ограничение на дельту байт 10) и запоминать смешение относительно адреса в DBG, что бы знать приблизительное начало следующей функции.

ЗЫ
И еще вариант, проверить DBG и скрипт, может быть конвертация адреса все таки не правильная.




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 23 мая 2012 12:36
· Личное сообщение · #7

Тут можно посоветовать только выложить (если возможно) то, что ковыряется и dbg, так будет проще чем общаться в режиме телепата.

-----
DREAMS CALL US




Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 23 мая 2012 19:45
· Личное сообщение · #8

DBG - от одной версии (дебажной), а прога - другая версия, релизная, с другим выравниванием.



Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 мая 2012 20:48 · Поправил: uinor
· Личное сообщение · #9

Не могу выложить саму жертву (не ломаю, реверсю ряд алгоритмов), боюсь скомпрометировать свою лицензию [продукт узкоспециализированный]

Но смог раздобыть версию чуть постарше, скомпилированную другим компайлером (первая версия была собрана Delphi XE, постарше - Delphi 2007) и вы не поверите, но соответствующий ей DBG файл (конвертнутый в map по совету =TS=) ложится без проблем.

Не удивляйтесь, что речь идет о Delphi и DBG, на самом деле там JDBG (Jedi), который я конвертирую в DBG, который уже использую / парсю далее.

Может ли быть какой-то хитрый нюанс из-за опций компиляции, допустим? Не похоже на то, что в первой версии кривой DBG, ибо софтина им успешно пользуется восстанавливая читабельный callstack при возникновении исключения.

UPD1
yagello пишет:
DBG - от одной версии (дебажной), а прога - другая версия, релизная, с другим выравниванием.

Тоже так думал, но предыдущая версия софтины с ее DBG - вполне поддалась анализу (см. выше) + на искусственно вызванном exception'е она успешно подсасывает DBG для нейминга.
+

если это конечно к делу относится, тут не шарю



Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 24 мая 2012 21:22
· Личное сообщение · #10

uinor пишет:
если это конечно к делу относится, тут не шарю

Нет, не относится, поскольку сама среда Дельфи не использует .dbg файлы, а ты привел флаги из PE-заголовка. Дельфевый компилятор их выставляет чет-те как. JVCL, насколько помню, использует свой собственный формат отладочной информации, возможно, глюк возник при конвертации JVCL->DBG.
Может быть используемый инструмент не понял новой версии дебаг-инфы от JVCL или еще какая-нибудь гадость приключилась.

| Сообщение посчитали полезным: uinor

Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 мая 2012 23:08
· Личное сообщение · #11

yagello пишет:
глюк возник при конвертации JVCL->DBG.
Может быть используемый инструмент не понял новой версии дебаг-инфы от JVCL или еще какая-нибудь гадость приключилась

Интересный вариант был, проверил. Формат JDBG не менялся между двумя версиями софтины. Конвертацию писал сам, JDBG очень похож на DBG, просто компактнее (чуть больше информации, кроме адреса и связанного имени хранятся первые два word'а). Тем более, что сейчас DBG по сути не используется, я на этапе чтения из JDBG сразу распихиваю в IDC скрипт / MAP - там хотя бы verbosity выше при подсосе (в DBG IDA тупо матерится без пояснений).



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 24 мая 2012 23:55
· Личное сообщение · #12

Чего-то мне кажется что там в dbg не RVA, а тот один адрес совпал случайно

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 25 мая 2012 02:42 · Поправил: uinor
· Личное сообщение · #13

Hexxx пишет:
Чего-то мне кажется что там в dbg не RVA, а тот один адрес совпал случайно

В дельфовом JDBG, который идет вместе с жертвой хранится адрес (судя по всему RVA - см. п1), два первых word'а тела и имя.

1. На версии софта, который собран под D2007, полученная из JDBG (поставляемого именно с этой версией) информация абсолютно корректно ложится - порядка 3500 функций. Ни одного косяка.

2. На версии софта, который собран под DXE, информация ложится на первые 7 функций (там мелочь всякая) без проблем, а начиная с 8ой курсор начинает плавно колбасить (адреса из JDBG опережают реальную ситуацию).

Остается вариант, что для второй версии софтины некорректный JDBG, но при этом - он используется ей самой (заставлял ее падать и смотрел как она восстанавливает именно функций для отображения cs) + имена функций совпадают с отображением в IDA (то, что смог отресолвить флирт) и немного отличаются от первой версии. НО едут адреса



Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 28 мая 2012 09:19
· Личное сообщение · #14

uinor пишет:
В дельфовом JDBG, который идет вместе с жертвой хранится адрес (судя по всему RVA - см. п1), два первых word'а тела и имя.
НО едут адреса

Ну тогда придется парсер переделать. От предполагаемого начала функции ищешь те самые 2 ворда (или все же dword), запоминаешь дельту. Далее при поиске пляшешь уже от адреса из JDBG+дельта и т.д.
Трудно что-то подсказывать не видя файлов.


 eXeL@B —› Софт, инструменты —› Как прокинуть в IDA информацию о функциях [имя:адрес]? С DBG проблема.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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