eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: rmn, IsNull, yuu (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Софт, инструменты —› IdbUpdater
Посл.ответ Сообщение


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 31 июля 2017 19:28 · Поправил: Vamit New!
Цитата · Личное сообщение · #1

Каждый, кто хоть раз разбирал функции в Идашной базе, знает какой адский труд с выходом очередной версии программы нужно сделать чтобы перенести в новую базу свои наработки и выявить различия в функциях.

Данный плагин к ИДА 6.8 моя первая попытка автоматизировать эту работу. Он производит сравнение функций в двух базах одной программы разных версий и выдает результат в 3 окна: идентичные функции, частично совпадающие и несовпадающие. Из апдейта баз пока реализован только перенос имен идентичных функций из старой базы в новую. Первой в Ида должна открываться новая база, т.к. только в неё можно перенести информацию. Результаты сравнения тоже сохраняются в новой базе и доступны для следующих сеансов работы. Для более полного сравнения функций, если оно конечно нужно, рекомендуется в новой базе определить неразмеченные функции, т.к. плагин не форматирует никакой код в новой базе и обрабатывает только функции размеченные Ида.
Так же, если вам дорога новая база, то лучше пока работать с её копией, во избежании каких либо ошибок. В старую базу плагин записей не производит.

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


Download --> IdbUpdater v1.02 <--

| Сообщение посчитали полезным: daFix, r_e, Larry, sefkrd, SaNX, HandMill, sendersu, Gideon Vi, VodoleY, plutos, Veliant, MarcElBichon, Tony_Stark, ELF_7719116, mak, Rio, DICI BF, 4kusNick


Ранг: 510.2 (!)
Статус: Модератор

Создано: 31 июля 2017 20:08 New!
Цитата · Личное сообщение · #2

пока такой краткий фидбек - http://prntscr.com/g2m4qj
ето после диалога Open File на 2ой БД

Просьба дампить в лог причину ошибки

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



Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 31 июля 2017 20:46 · Поправил: Vamit New!
Цитата · Личное сообщение · #3

sendersu
Сообщение "Error: IDB2 parsing failed." выводится:
- если в окне выбора 2ой базы давануть Отмену.
- затем появляетcя WaitBox "Parsing second idb...", и если в нем давануть Отмену или Esc.
- зетем если курсор меняет форму на ожидание, то происходит загрузка второй ида со старой базой и старт в ней плагина с командной строкой.
Если после этого выдает ошибку, то вероятно невозможно открыть 2ую базу, можно попробовать поменять базы местами.
Вывести в лог ошибку из 2ой базы проблематично, т.к. прямого доступа к ней нет.
Я таких ошибок на 8 базах не наблюдал. Обе базы должны иметь возможность открываться в Ида 6.8

ЗЫ: У вас включена опция "Keep second IDB open" в опциях плагина?

Ранг: 575.6 (!)
Статус: Модератор

Создано: 31 июля 2017 21:20 New!
Цитата · Личное сообщение · #4

По предложениям - сделай перенос структур и енумов, если возможно. Сравнение как происходит?


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 31 июля 2017 22:15 · Поправил: Vamit New!
Цитата · Личное сообщение · #5

r_e пишет:
По предложениям - сделай перенос структур и енумов, если возможно.

Это возможно, в планах такое есть..., но сначала хотелось бы обкатать то что сделано.
В окне Identical следом за адресами функций выводятся все опции сравнения.
Каждая функция делится на блоки по переходам и меткам ( как в окне графов).
Сигнатура функции содержит следующую инфу:
"Sig" - хеш по блокам функции, грубо говоря кол-во блоков в функции.
"Hash" - хеш по межблоковым переходам внутри функции.
"Call" - хеш по call с учетом номера блока
"Data" - хеш по data ссылкам на внешние данные с учетом номера блока
"Code" - хеш по опкодам инструкций
"CRC" - контрольная сумма всех постоянных байт инструкции (исключаются смещения по переходам, внешние оффсеты, сall оффсеты).
"Str" - хеш ASCII строк на константных ссылках.
Все сигнатуры функций одной базы отсортированы в списке по весу хешей в порядке значимости.
Далее для каждой функции строятся цепочки по входящим и исходящим ссылкам на другие функции, а также и таблицы функций (virtual table).
Далее пошло само сравнение:
- Берется неопознанная функция с макс. весом текущего хеша (всего может выполняться 6 проходов по каждому из хешей до его совпадения, хеш по call и хеш по data обрабатываются в одном проходе) и ищется ей соответствие во второй базе по этому же хешу.
- Если найдена, то далее процесс идет по ссылкам на неё и из неё на другие функции, те же 6 проходов.
и т.д.
Если же делать тупой перебор каждой функции с каждой, то это будет крутиться полдня при кол-ве функций в каждой базе по 40000, а так отработка идет в пределах 3-5х минут.

Ранг: 510.2 (!)
Статус: Модератор

Создано: 1 августа 2017 07:51 New!
Цитата · Личное сообщение · #6

Vamit пишет:
ЗЫ: У вас включена опция "Keep second IDB open" в опциях плагина?


что за опции и как их активировать?
если запусать плаг через Menu -> Edit -> Plugins -> IdbUpdater v1.00 то сразу идет диалог "дай базу"

Vamit пишет:
- если в окне выбора 2ой базы давануть Отмену.- затем появляетcя WaitBox "Parsing second idb...", и если в нем давануть Отмену или Esc.


нету ескейпа, зачем?



Vamit пишет:
то происходит загрузка второй ида со старой базой и старт в ней плагина с командной строкой.


с етого места поподробней пож-та
может ошибка запуска процесса и тд? (например путь с пробелами)
2) как минимум пишите GetLastError() а то вообще неясно что за ошибка и куда глядеть


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 1 августа 2017 09:00 New!
Цитата · Личное сообщение · #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ой базе, с этого момента плагин знает об ошибках.

Ранг: 510.2 (!)
Статус: Модератор

Создано: 1 августа 2017 21:04 New!
Цитата · Личное сообщение · #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) дает код ошибки - я хочу его видеть в логе (в случае ошибки)


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 1 августа 2017 22:08 · Поправил: Vamit New!
Цитата · Личное сообщение · #9

sendersu
Ну и понаписал
как ведет себя продукт без прав админа?
Проверил, у меня точно так же как и с правами.
какой список supported OS у вашего продукта?
Такой же как у Ида.
если есть поддержка кирилика и прога не юникодная должна работать?
Должна.
а с 1ой?
Что с первой, тут пока всё норм, плаг стартует, окна выбора 2ой базы выдает, далее CreateProcess, который выдает true и никаких ошибок. Далее 1ая, не получив ответ от второй выводит сообщение IDB2 failed. Всё больше тут ничего не придумать.
я хочу получить хоть какую-то зацепку ошибки продукта
Ошибка не в продукте, а у тебя, ты случаем не одну и ту же базу открываешь в 2х инстанциях ида?
Вторая Ида стартует, в процессах винды появляется?
можно получить информацию + GLE как отработал сей АПИ?
Уже ответил - нормально отработал, он только стартует процесс, а что там процесс дальше делает тут уже не видно.
пути ескейпируете? (вдруг в них будет пробел?)
Чего??? Все пути мне дает Ида.
Резюме - любой вызов WinAPI (или IDA API) дает код ошибки - я хочу его видеть в логе (в случае ошибки)
Вот именно в случае ошибки, а если нет ошибки, то какой может быть код.

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


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 8 августа 2017 11:42 · Поправил: Vamit New!
Цитата · Личное сообщение · #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% даже без разметки.

Ранг: 510.2 (!)
Статус: Модератор

Создано: 8 августа 2017 22:24 New!
Цитата · Личное сообщение · #11

Поглядите код ИДА плагина
classinformer-code-2\Plugin\RTTI.cpp
51 КБ С++


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 8 августа 2017 23:29 New!
Цитата · Личное сообщение · #12

sendersu пишет:
classinformer-code-2\Plugin\RTTI.cpp

Тут смотреть надо не это, а это IDA_ClassInformer/Plugin/Vftable.cpp,
функция BOOL vftable::getTableInfo(ea_t ea, vtinfo &info)
но у них вообще хреновый алгоритм (в функе сделано аж 5 пометок где может ошибиться), он не только пропускает реальные таблицы, но и может всякую хрень за них посчитать.
Я уже несколько алгоритмов из разных плагов натаскал, но все не дают 100% результат, решил вот свой реализовать.

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



Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 10 августа 2017 14:24 New!
Цитата · Личное сообщение · #13

Ундекорировать любое имя просто, а вот как создать из С++ декларации декорированное имя?
Существуют ли какие либо АПИ функции, утилиты и другое для этого?
Не вызывать же для этого компилятор...

Ранг: 510.2 (!)
Статус: Модератор

Создано: 10 августа 2017 21:21 New!
Цитата · Личное сообщение · #14

Vamit пишет:
Существуют ли какие либо АПИ функции, утилиты и другое для этого?Не вызывать же для этого компилятор...


хохо
а ведомо ли могучему Вамиту, что у каждого компилятора своя система декорации (манглирования) имен?


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 10 августа 2017 23:43 New!
Цитата · Личное сообщение · #15

sendersu
Конечно ведомо, да их всего-то 3 широко распространенных MS, Borland и GCC. Но вопрос остается, только похоже что глухо, даже утилей никаких нет.

Ранг: 141.4 (ветеран)
Статус: Участник

Создано: 11 августа 2017 00:27 · Поправил: rmn New!
Цитата · Личное сообщение · #16

Vamit пишет:
даже утилей никаких нет.

Если попробовать написать полноценный парсер определений c++, то станет понятно почему


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 11 августа 2017 09:50 · Поправил: Vamit New!
Цитата · Личное сообщение · #17

IdbUpdater v1.01
добавлено:
- Импорт типов из старой базы (struct, union, enum).
- Главное окно с выбором действия.
- Разметка и именование таблиц виртуальных функций. Если присутствует RTTI, то производится полный её разбор. Именование таблиц с ограничениями, т.к. в Ида и вообще в природе отсутствует декоратор имен, а писать свой проблематично.


rmn пишет:
Если попробовать написать полноценный парсер определений c++, то станет понятно почему

Да ничего не понятно, если есть полноценный открытый UnDecorator имен, то не вижу проблемы чтобы открыть Decorator (в компиляторах он же есть), всё дело тут в политике...
Когда-то я начинал разбирать компилятор от VS c1xx.dll - за декорацию имен отвечает один класс NameEncoder_t в модуле outdname.c

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


Ранг: 141.4 (ветеран)
Статус: Участник

Создано: 11 августа 2017 10:15 New!
Цитата · Личное сообщение · #18

Vamit пишет:
если есть полноценный открытый UnDecorator имен, то не вижу проблемы

Проблема в том, что сделать из этого
Code:
  1. ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@IIABV?$allocator@G@1@@Z

это
Code:
  1. public: __thiscall std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &,unsigned int,unsigned int,class std::allocator<unsigned short> const &)

несравненно проще, чем обратная операция.

Ранг: 33.4 (посетитель)
Статус: Участник

Создано: 12 августа 2017 09:17 · Поправил: redlord New!
Цитата · Личное сообщение · #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



Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 13 августа 2017 11:34 New!
Цитата · Личное сообщение · #20

redlord
Да это frontent компилятор Clang, он хоть и использует декорацию имен в стиле MS, но делает это по типам данных (классы, функции, енумы и т.д), так же как и компилятор VS, а нужна декорация по объявлениям (на входе текстовая стока).
А всё остальное это деманглеры, они мне не нужны.


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 16 августа 2017 19:19 · Поправил: Vamit New!
Цитата · Личное сообщение · #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, а студийная утиль тянет какую-то хрень...
 eXeL@B —› Софт, инструменты —› IdbUpdater

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS