![]() |
eXeL@B —› Софт, инструменты —› Как прокинуть в IDA информацию о функциях [имя:адрес]? С DBG проблема. |
Посл.ответ | Сообщение |
|
Создано: 23 мая 2012 03:38 · Поправил: uinor · Личное сообщение · #1 При попытке подгрузить DBG-файл в IDA 6.1 возникает exception, вида: ![]() DBG файл читабелен (к примеру, PEview) -> CodeView (NB09). Интереса ради распарсил его ручками, адреса функций совпадают с жертвой. См. иллюстрацию в аттаче. ![]() Прошу прощения, подгрузить сам DBG не имею возможности сейчас. Поэтому прошу немного телепатических способностей. В чем может быть проблема? Существует ли иной способ (не через DBG) прокинуть массово в IDA информацию о функциях [имя:адрес]? UPD1 Попробовал парсить DBG и на лету генерировать IDC скрипт вида Code:
После его применения все ломается к чертовой матери, в процессе куча ошибок вида: 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 функциях все нормально, потом идет постепенное смещение. С чем может быть связано? Ощущение, что возникает проблема с выравниванием. Не представляю как решить. В итоге курсор в скрипте начинает опережать действительность. ![]() |
|
Создано: 23 мая 2012 08:52 · Поправил: =TS= · Личное сообщение · #2 uinor пишет: Существует ли иной способ (не через DBG) прокинуть массово в IDA информацию о функциях [имя:адрес]? map-файл Правда в нём идёт привязка к сегменту (если их несколько) В простейшем случае вид: Code:
----- DREAMS CALL US ![]() |
|
Создано: 23 мая 2012 10:13 · Личное сообщение · #3 =TS= пишет: map-файл К сожалению, у IDA нет возможности подсосать MAP-файл, а по своей сути оно равно формированию скрипта из моего первого коммента (все советуют тупо конвертить MAP в IDC скрипт, ибо другого варианта нет). Меня бы и скрипт устроил, но явно какая-то проблема со сдвигом, причину которого не могу понять. Хорошо видно на картинке (в npp как раз сгенеренный map-файл с rva в первом сегменте): ![]() ![]() |
|
Создано: 23 мая 2012 10:43 · Поправил: =TS= · Личное сообщение · #4 Ну есть много плагинов для импорта map файла, Когда найду время доковырять деманглинг формата шаблонов в borland'овских именах, выложу свой под IDA и HIEW. Старая версия где-то валялась на форуме в теме по IDA. ----- DREAMS CALL US ![]() |
|
Создано: 23 мая 2012 11:14 · Поправил: uinor · Личное сообщение · #5 =TS= пишет: есть много плагинов для импорта map файла Спасибо, не стал пересобирать его под 6.1, заюзал на 5.2 доступный собранный. Отработало так же как и скрипт - спустя 7 функций начинает сыпаться, без лишнего шума, правда, и окончательно показало проблему: RVA из DBG файла, с ними что-то не так. Первые 7 функций, у которых нет в конце данных отрабатываются без проблем, потом (см. скриншот выше - FetchValue первая такая) начинается сдвиг курсора на габарит данных. Еще раз смотрим на скриншот: Code:
и они, данные, не учтены в RVA [2D0 - 2CC = те самые 4 байта], который взят из DBG У кого-нибудь есть идея? ![]() |
|
Создано: 23 мая 2012 11:57 · Личное сообщение · #6 Самое простое: на адресе где долно быть начало функции вызываешь GetDisasm и смотришь что вернуло, если align XX то сплитишь по пробелу(или табу не помню) и смотришь размер выравнивания. Так же можно вызывать на адрес Byte и проверять на 0xCC и 0x90 (ну или что еще там используется для выравнивания), двигаться вниз пока не попадешь на начало функции (тут можно поставить ограничение на дельту байт 10) и запоминать смешение относительно адреса в DBG, что бы знать приблизительное начало следующей функции. ЗЫ И еще вариант, проверить DBG и скрипт, может быть конвертация адреса все таки не правильная. ![]() |
|
Создано: 23 мая 2012 12:36 · Личное сообщение · #7 |
|
Создано: 23 мая 2012 19:45 · Личное сообщение · #8 |
|
Создано: 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 для нейминга. + ![]() если это конечно к делу относится, тут не шарю ![]() |
|
Создано: 24 мая 2012 21:22 · Личное сообщение · #10 uinor пишет: если это конечно к делу относится, тут не шарю Нет, не относится, поскольку сама среда Дельфи не использует .dbg файлы, а ты привел флаги из PE-заголовка. Дельфевый компилятор их выставляет чет-те как. JVCL, насколько помню, использует свой собственный формат отладочной информации, возможно, глюк возник при конвертации JVCL->DBG. Может быть используемый инструмент не понял новой версии дебаг-инфы от JVCL или еще какая-нибудь гадость приключилась. ![]() |
|
Создано: 24 мая 2012 23:08 · Личное сообщение · #11 yagello пишет: глюк возник при конвертации JVCL->DBG. Может быть используемый инструмент не понял новой версии дебаг-инфы от JVCL или еще какая-нибудь гадость приключилась Интересный вариант был, проверил. Формат JDBG не менялся между двумя версиями софтины. Конвертацию писал сам, JDBG очень похож на DBG, просто компактнее (чуть больше информации, кроме адреса и связанного имени хранятся первые два word'а). Тем более, что сейчас DBG по сути не используется, я на этапе чтения из JDBG сразу распихиваю в IDC скрипт / MAP - там хотя бы verbosity выше при подсосе (в DBG IDA тупо матерится без пояснений). ![]() |
|
Создано: 24 мая 2012 23:55 · Личное сообщение · #12 |
|
Создано: 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 (то, что смог отресолвить флирт) и немного отличаются от первой версии. НО едут адреса ![]() ![]() |
|
Создано: 28 мая 2012 09:19 · Личное сообщение · #14 uinor пишет: В дельфовом JDBG, который идет вместе с жертвой хранится адрес (судя по всему RVA - см. п1), два первых word'а тела и имя. НО едут адреса Ну тогда придется парсер переделать. От предполагаемого начала функции ищешь те самые 2 ворда (или все же dword), запоминаешь дельту. Далее при поиске пляшешь уже от адреса из JDBG+дельта и т.д. Трудно что-то подсказывать не видя файлов. ![]() |
![]() |
eXeL@B —› Софт, инструменты —› Как прокинуть в IDA информацию о функциях [имя:адрес]? С DBG проблема. |