Сейчас на форуме: morgot, sashalogout (+3 невидимых) |
eXeL@B —› Софт, инструменты —› IdbUpdater |
Посл.ответ | Сообщение |
|
Создано: 31 июля 2017 19:28 · Поправил: Vamit · Личное сообщение · #1 Каждый, кто хоть раз разбирал функции в Идашной базе, знает какой адский труд с выходом очередной версии программы нужно сделать чтобы перенести в новую базу свои наработки и выявить различия в функциях. Данный плагин к ИДА 6.8 моя первая попытка автоматизировать эту работу. Он производит сравнение функций в двух базах одной программы разных версий и выдает результат в 3 окна: идентичные функции, частично совпадающие и несовпадающие. Из апдейта баз пока реализован только перенос имен идентичных функций из старой базы в новую. Первой в Ида должна открываться новая база, т.к. только в неё можно перенести информацию. Результаты сравнения тоже сохраняются в новой базе и доступны для следующих сеансов работы. Для более полного сравнения функций, если оно конечно нужно, рекомендуется в новой базе определить неразмеченные функции, т.к. плагин не форматирует никакой код в новой базе и обрабатывает только функции размеченные Ида. Так же, если вам дорога новая база, то лучше пока работать с её копией, во избежании каких либо ошибок. В старую базу плагин записей не производит. Приветствуются любые багрепорты, замечания и предложения как по имеющимся функциям, так и новым возможностям. В планах много чего хотелось бы сделать, но сначала нужно обкатать движок быстрой идентификации функций. Download ----- Everything is relative... | Сообщение посчитали полезным: daFix, r_e, Larry, sefkrd, SaNX, HandMill, sendersu, Gideon Vi, VodoleY, plutos, Veliant, MarcElBichon, Tony_Stark, ELF_7719116, mak, Rio, DICI BF, 4kusNick |
|
Создано: 31 июля 2017 20:08 · Личное сообщение · #2 пока такой краткий фидбек - http://prntscr.com/g2m4qj ето после диалога Open File на 2ой БД Просьба дампить в лог причину ошибки | Сообщение посчитали полезным: sefkrd |
|
Создано: 31 июля 2017 20:46 · Поправил: Vamit · Личное сообщение · #3 sendersu Сообщение "Error: IDB2 parsing failed." выводится: - если в окне выбора 2ой базы давануть Отмену. - затем появляетcя WaitBox "Parsing second idb...", и если в нем давануть Отмену или Esc. - зетем если курсор меняет форму на ожидание, то происходит загрузка второй ида со старой базой и старт в ней плагина с командной строкой. Если после этого выдает ошибку, то вероятно невозможно открыть 2ую базу, можно попробовать поменять базы местами. Вывести в лог ошибку из 2ой базы проблематично, т.к. прямого доступа к ней нет. Я таких ошибок на 8 базах не наблюдал. Обе базы должны иметь возможность открываться в Ида 6.8 ЗЫ: У вас включена опция "Keep second IDB open" в опциях плагина? ----- Everything is relative... |
|
Создано: 31 июля 2017 21:20 · Личное сообщение · #4 |
|
Создано: 31 июля 2017 22:15 · Поправил: Vamit · Личное сообщение · #5 r_e пишет: По предложениям - сделай перенос структур и енумов, если возможно. Это возможно, в планах такое есть..., но сначала хотелось бы обкатать то что сделано. В окне Identical следом за адресами функций выводятся все опции сравнения. Каждая функция делится на блоки по переходам и меткам ( как в окне графов). Сигнатура функции содержит следующую инфу: "Sig" - хеш по блокам функции, грубо говоря кол-во блоков в функции. "Hash" - хеш по межблоковым переходам внутри функции. "Call" - хеш по call с учетом номера блока "Data" - хеш по data ссылкам на внешние данные с учетом номера блока "Code" - хеш по опкодам инструкций "CRC" - контрольная сумма всех постоянных байт инструкции (исключаются смещения по переходам, внешние оффсеты, сall оффсеты). "Str" - хеш ASCII строк на константных ссылках. Все сигнатуры функций одной базы отсортированы в списке по весу хешей в порядке значимости. Далее для каждой функции строятся цепочки по входящим и исходящим ссылкам на другие функции, а также и таблицы функций (virtual table). Далее пошло само сравнение: - Берется неопознанная функция с макс. весом текущего хеша (всего может выполняться 6 проходов по каждому из хешей до его совпадения, хеш по call и хеш по data обрабатываются в одном проходе) и ищется ей соответствие во второй базе по этому же хешу. - Если найдена, то далее процесс идет по ссылкам на неё и из неё на другие функции, те же 6 проходов. и т.д. Если же делать тупой перебор каждой функции с каждой, то это будет крутиться полдня при кол-ве функций в каждой базе по 40000, а так отработка идет в пределах 3-5х минут. ----- Everything is relative... |
|
Создано: 01 августа 2017 07:51 · Личное сообщение · #6 Vamit пишет: ЗЫ: У вас включена опция "Keep second IDB open" в опциях плагина? что за опции и как их активировать? если запусать плаг через Menu -> Edit -> Plugins -> IdbUpdater v1.00 то сразу идет диалог "дай базу" Vamit пишет: - если в окне выбора 2ой базы давануть Отмену.- затем появляетcя WaitBox "Parsing second idb...", и если в нем давануть Отмену или Esc. нету ескейпа, зачем? Vamit пишет: то происходит загрузка второй ида со старой базой и старт в ней плагина с командной строкой. с етого места поподробней пож-та может ошибка запуска процесса и тд? (например путь с пробелами) 2) как минимум пишите GetLastError() а то вообще неясно что за ошибка и куда глядеть |
|
Создано: 01 августа 2017 09:00 · Личное сообщение · #7 sendersu что за опции и как их активировать? Плагин имеет свое меню опций, вызов его из меню Options Ида. Там пока 2 опции (tooltip на них дает описание): "Keep second IDB open" - быстрый доступ ко 2ой (старой) базе. Обеспечивается тем, что после загрузки 2ой Ида со старой базой и стартом в ней плагина создается синхронный pipe для обмена командами между плагинами в 2х Ида. Сами запрашиваемые данные из 2ой инстанции передаются в первую через временный файл. При включенной опции после исполнения команды 2ая инстанция Ида не закрывается и остается открытой до закрытия первой Ида. "Save results to IDB" - разрешает запись результатов сравнения функций в новую базу для доступа к ним в последующих сеансах работы. Значения опций записываются в реестр Винды. нету ескейпа, зачем? Не понял вопрос, зачем Esc или почему его нет? Любой WaitBox Ида реагирует на Esc и при его нажатии закрывается. может ошибка запуска процесса и тд? Может быть, я не тестировал всевозможные варианты межпроцессного обмена. Я работаю с правами администратора и мне все доступно, возможно причина в этом, а может быть в Винде, какая у вас я не знаю... Может пути к Ида или базам с русскими буквами, а плагин юникод не юзает, только обычная английская ASCII кодировка. Причин может быть много... GetLastError написать со 2ой инстанции не могу, она его в плагин не передает, а вернее так, сначала запускается 2ая Ида через CreateProcess c такой командой: ""%s" -A -S"%s" -OIdbUpdater:%lu:%u:%a:%u:"%s" "%s"", её параметры по порядку path - путь к файлу idag, idcFile - командный файл старта плагина во 2ой ида, он простой и выполняется автоматом после загрузки базы #include <idc.idc> static main (void) { RunPlugin ("IdbUpdater", 1); Exit(1); } далее 5 параметров - опции настройки межплагинного pipe, передаются в плагин во 2ой Ида idbFile - имя файла старой базы, которая открывается во 2ой Ида. До тех пор, пока управление во 2ой Ида будет не будет передано плагину, отсутствует любой доступ к ней и её ошибкам. А управление она передаст только после успешной загрузки базы. До этого следите за стадией процесса косвенно: появилось окно WaitBox - активировано создание процесса, курсор имеет форму ожидания - происходит запуск 2ой Ида и загрузка в неё базы, курсор принял обычную форму стрелки - 2ая Ида запущена, база загружена, плагин активирован, т.е. имеем доступ ко 2ой базе, с этого момента плагин знает об ошибках. ----- Everything is relative... |
|
Создано: 01 августа 2017 21:04 · Личное сообщение · #8 Vamit пишет: Плагин имеет свое меню опций, вызов его из меню Options Ида. спасибо за наводку, не увидел сам Vamit пишет: Любой WaitBox Ида реагирует на Esc и при его нажатии закрывается. да, капитан очевидность я к тому, что ясное дело, что никакой ESC не жмакался... Vamit пишет: Может быть, я не тестировал всевозможные варианты межпроцессного обмена. Я работаю с правами администратора как ведет себя продукт без прав админа? работать все время с правами админа дело рисковое, но дело ваше. Vamit пишет: а может быть в Винде, какая у вас я не знаю... W7x64 sp1 ultimate какой список supported OS у вашего продукта? Vamit пишет: Может пути к Ида или базам с русскими буквами нету, но если есть поддержка кирилика и прога не юникодная должна работать? Vamit пишет: GetLastError написать со 2ой инстанции не могу, она его в плагин не передает а с 1ой? почему не передает? я хочу получить хоть какую-то зацепку ошибки продукта, а то пока все звучит как "сам дурак" Vamit пишет: через CreateProcess c такой командой:""%s" -A -S"%s" -OIdbUpdater:%lu:%u:%a:%u:"%s" "%s"" можно получить информацию + GLE как отработал сей АПИ? скорее всего бага от него, надо детали пути ескейпируете? (вдруг в них будет пробел?) Vamit пишет: До этого следите за стадией процесса косвенно: появилось окно WaitBox не за чем следить - диалог файла и сразу баг Vamit пишет: курсор принял обычную форму стрелки давайте будем печатать ошибки в консоль Ида а не фокусироваться на курсорах, .... Резюме - любой вызов WinAPI (или IDA API) дает код ошибки - я хочу его видеть в логе (в случае ошибки) |
|
Создано: 01 августа 2017 22:08 · Поправил: Vamit · Личное сообщение · #9 sendersu Ну и понаписал как ведет себя продукт без прав админа? Проверил, у меня точно так же как и с правами. какой список supported OS у вашего продукта? Такой же как у Ида. если есть поддержка кирилика и прога не юникодная должна работать? Должна. а с 1ой? Что с первой, тут пока всё норм, плаг стартует, окна выбора 2ой базы выдает, далее CreateProcess, который выдает true и никаких ошибок. Далее 1ая, не получив ответ от второй выводит сообщение IDB2 failed. Всё больше тут ничего не придумать. я хочу получить хоть какую-то зацепку ошибки продукта Ошибка не в продукте, а у тебя, ты случаем не одну и ту же базу открываешь в 2х инстанциях ида? Вторая Ида стартует, в процессах винды появляется? можно получить информацию + GLE как отработал сей АПИ? Уже ответил - нормально отработал, он только стартует процесс, а что там процесс дальше делает тут уже не видно. пути ескейпируете? (вдруг в них будет пробел?) Чего??? Все пути мне дает Ида. Резюме - любой вызов WinAPI (или IDA API) дает код ошибки - я хочу его видеть в логе (в случае ошибки) Вот именно в случае ошибки, а если нет ошибки, то какой может быть код. Осталось только для тебя сделать лог наоборот - выводить не ошибки а правильно сработавшие вызовы функций, может это даст хоть какое-то продвижение... Отпишитесь кто попробовал - у всех так или есть нормальный результат. ----- Everything is relative... |
|
Создано: 08 августа 2017 11:42 · Поправил: Vamit · Личное сообщение · #10 Реализую следующую опцию: Поиск таблиц виртуальных функций, разметка их, именование при наличии RTTI и т.д. Возникает вопрос, возможно ли 100% определить начало vftable? Таблица может быть размечена Идой частично, полностью или не размечена. Применяю следующий алгоритм: 1. Dword данные строки таблицы должны принадлежать сегменту кода. 2. Строка должна иметь любое имя и внешние ссылки на неё. 3. Анализ всех ссылок на строку: - если ссылка не из сегмента кода, то выход (не vftable), [но вроде должны быть исключения, какие?] - если по ссылке нет кода, то выход - получаю инструкцию кода по ссылке - если инструкция не соответствует этим 'mov dword ptr [xx], off_vtbl' or 'mov dword_xx, off_vtbl' or 'mov reg_xx, off_vtbl', то выход [или последняя форма лишняя?] При определении начала таблицы, её строки распознаются 100% даже без разметки. ----- Everything is relative... |
|
Создано: 08 августа 2017 22:24 · Личное сообщение · #11 |
|
Создано: 08 августа 2017 23:29 · Личное сообщение · #12 sendersu пишет: classinformer-code-2\Plugin\RTTI.cpp Тут смотреть надо не это, а это IDA_ClassInformer/Plugin/Vftable.cpp, функция BOOL vftable::getTableInfo(ea_t ea, vtinfo &info) но у них вообще хреновый алгоритм (в функе сделано аж 5 пометок где может ошибиться), он не только пропускает реальные таблицы, но и может всякую хрень за них посчитать. Я уже несколько алгоритмов из разных плагов натаскал, но все не дают 100% результат, решил вот свой реализовать. ----- Everything is relative... | Сообщение посчитали полезным: sendersu |
|
Создано: 10 августа 2017 14:24 · Личное сообщение · #13 |
|
Создано: 10 августа 2017 21:21 · Личное сообщение · #14 |
|
Создано: 10 августа 2017 23:43 · Личное сообщение · #15 |
|
Создано: 11 августа 2017 00:27 · Поправил: rmn · Личное сообщение · #16 |
|
Создано: 11 августа 2017 09:50 · Поправил: Vamit · Личное сообщение · #17 IdbUpdater v1.01 добавлено: - Импорт типов из старой базы (struct, union, enum). - Главное окно с выбором действия. - Разметка и именование таблиц виртуальных функций. Если присутствует RTTI, то производится полный её разбор. Именование таблиц с ограничениями, т.к. в Ида и вообще в природе отсутствует декоратор имен, а писать свой проблематично. rmn пишет: Если попробовать написать полноценный парсер определений c++, то станет понятно почему Да ничего не понятно, если есть полноценный открытый UnDecorator имен, то не вижу проблемы чтобы открыть Decorator (в компиляторах он же есть), всё дело тут в политике... Когда-то я начинал разбирать компилятор от VS c1xx.dll - за декорацию имен отвечает один класс NameEncoder_t в модуле outdname.c ----- Everything is relative... | Сообщение посчитали полезным: sendersu |
|
Создано: 11 августа 2017 10:15 · Личное сообщение · #18 Vamit пишет: если есть полноценный открытый UnDecorator имен, то не вижу проблемы Проблема в том, что сделать из этого Code:
это Code:
несравненно проще, чем обратная операция. |
|
Создано: 12 августа 2017 09:17 · Поправил: redlord · Личное сообщение · #19 Vamit Поищи в гугле c++ filt Там есть деманглер Еще __https://msdn.microsoft.com/en-us/library/windows/desktop/ms681400(v=vs.85).aspx __https://clang.llvm.org/doxygen/MicrosoftMangle_8cpp_source.html | Сообщение посчитали полезным: Vamit |
|
Создано: 13 августа 2017 11:34 · Личное сообщение · #20 redlord Да это frontent компилятор Clang, он хоть и использует декорацию имен в стиле MS, но делает это по типам данных (классы, функции, енумы и т.д), так же как и компилятор VS, а нужна декорация по объявлениям (на входе текстовая стока). А всё остальное это деманглеры, они мне не нужны. ----- Everything is relative... |
|
Создано: 16 августа 2017 19:19 · Поправил: Vamit · Личное сообщение · #21 IdbUpdater v1.02 добавлено: - Разметка EH, SEH и ThrowException обработчиков и всех подчиненных структур. Для полной обработки всех исключений должны быть именованы следующие функции, если это не смогла сделать ИДА, то сделайте вручную, т.к. плагин только ищет функцию по имени, а не распознает её в коде: Для ЕН: _EH_prolog, _EH_prolog3, _EH_prolog3_catch, _EH_prolog3_GS, _EH_prolog3_catch_GS Для SEH: _SEH_prolog, _SEH_prolog4, _SEH_prolog4_GS Для Throw: _CxxThrowException, _CxxThrowException@8 Любая из функций может так же иметь следующие префиксы: j, j_ или _, они распознаются автоматически. Имена из каждого списка могут быть любыми и необязательно чтобы все они присутствовали в анализируемой базе. Добавлено спустя 3 часа 4 минуты Кстати есть у кого-либо файлик mfc140.pdb? Нужен х32, а с MS SymbolServer стягивается mfc140.amd64.pdb, хотя в запрос сую обычную 32 разрядную либу mfc140.dll Добавлено спустя 4 часа 1 минуту Спасибо, уже не надо, через студию стянул mfc140d.i386.pdb, а студийная утиль тянет какую-то хрень... ----- Everything is relative... |
eXeL@B —› Софт, инструменты —› IdbUpdater |