Сейчас на форуме: vsv1, NIKOLA, r0lka, johnniewalker (+5 невидимых) |
eXeL@B —› Софт, инструменты —› Безграмотный патч в IDA 4.8.0.847 |
Посл.ответ | Сообщение |
|
Создано: 22 августа 2005 18:31 · Личное сообщение · #1 Речь идёт о версии IDA, которую можно найти на CD крэкера, распространяемом нашим уважаемым bad_guy'ем. Если автор патча - не сам bad_guy, то это должно проявляться и в других источниках. Проблема заключается в следующем. В ida.wll (ядре IDA) по RVA 0x8066A (file-offset 0x7FC6A) идёт последовательность из 6 nop'ов, которая явно замещает байты 0F 85 9A 00 00 00. Чуть позже (RVA 0x80672) стоит быйт EB вместо исходного 75. Если у вас (как и у меня) стоит IDA 4.8.0.847, немедленно проверьте это и, если у вас есть этот патч, измените его назад! Этот патч решает одну не очень важную проблему: он позволяет конвертировать базы от IDA 4.5. Без этого патча конвертация (именно от этой версии) невозможна. Почему - подумайте сами А проблемы при использовании следующие. Теперь (при установленном патче) возникают проблемы поважнее. А именно, при загрузке IDB-базы, сохраненной уже в новой версии IDA, код загрузки будет считать, что база была создана ранней версией и попытается провести преобразование к новой! Это вызовет глюки, наиболее заметный из которых - "неубиваемые" хвосты функций. |
|
Создано: 22 августа 2005 19:22 · Личное сообщение · #2 |
|
Создано: 22 августа 2005 19:32 · Личное сообщение · #3 |
|
Создано: 22 августа 2005 21:45 · Личное сообщение · #4 |
|
Создано: 23 августа 2005 02:15 · Личное сообщение · #5 |
|
Создано: 23 августа 2005 08:10 · Личное сообщение · #6 |
|
Создано: 25 августа 2005 17:07 · Личное сообщение · #7 Функция, в которой всё это происходит, на псевдо-C выглядит примерно так: ...получить структуру inf - информацию о базе данных... if (inf.version == 0x10) // я не помню, с чего именно там начинается, пусть будет 0x10 { ...преобразовать базу данных версии 0x10 к версии 0x11... inf.version = 0x11; } if (inf.version == 0x11) { ...преобразовать от версии 0x11 к версии 0x12... inf.version = 0x12; } ...skipped... if (inf.version == 0x29) // <- здесь патч на if (true) { ...преобразовать от версии 0x29 к 0x2A... inf.version = 0x2A; } ...skipped... IDA, как известно, поддерживает открытие баз данных, созданных в более ранних версиях (с конвертацией к текущей версии). Эта функция как раз и занимается преобразованием к понятной новой версии форме. (Уточнение: в случае, когда нововведение не сводится к простому добавлению новых полей или переименованию чего-то, эта функция просто устанавливает соответствующие флаги, а работа делается в другом месте с сообщением "Upgrading database, please wait"). Теперь пусть открывается IDB-база, созданная уже новой версией. Если патча нет, то все if-блоки проскакиваются и в конце получается то же, что и в начале, а в начале было то, что сохранила IDA при предыдущем выходе из нее. А вот если патч есть, то проскакиваются все if-блоки до патча, а дальше все if-блоки выполняются! Так что теперь в конце уже не то, что надо. Наиболее заметное проявление этого - "неубиваемые" хвосты функций. Начиная с версии 4.7, IDA поддерживает "разорванные" функции - функции, состоящие из нескольких связных кусков. Выделяется главный связный кусок, а все остальные именуются хвостами (function tail). Это очень полезно при изучении системных файлов от XP (и выше), а вот в обычных программах мне это ещё не встречалось. В результате этого патча при закрытии IDA и последующей загрузкой базы данных хвосты (по крайней мере, некоторые) становятся неудаляемыми: при попытке удалить их (через меню Edit->Functions->Delete function tail или из плагина del_func_tail()) просто ничего не происходит. Если вам такое не встречалось - у вас ещё всё впереди |
|
Создано: 25 августа 2005 17:13 · Поправил: Модератор · Личное сообщение · #8 Небольшое уточнение - преобразование к новой версии начинается примерно так: bool bl = false; // в начале ... if (inf.version==0x29) { if (!bl) { int res = ask_yn("Do you want to convert database format %d to current (%d) ?",0x29,0x1E0); // сообщение там другое, но смысл такой if (res<=0) exit(); // если не хотим } bl = true; ... } Смысл этого такой, чтобы не спрашивать о преобразовании 2 раза. Запатчен также и оператор if(!bl) на if(false), чтобы это происходило молча и без вопросов. |
|
Создано: 25 августа 2005 17:49 · Личное сообщение · #9 |
|
Создано: 25 августа 2005 18:01 · Личное сообщение · #10 |
|
Создано: 25 августа 2005 18:09 · Личное сообщение · #11 |
|
Создано: 26 августа 2005 10:13 · Личное сообщение · #12 |
eXeL@B —› Софт, инструменты —› Безграмотный патч в IDA 4.8.0.847 |