Динамически подключаемые библиотеки (dynamic link libraries, DLL) используются для уменьшения объема исполняемого файла, за счет выделения некоторых функций в отдельный файл. Более того, функции из DLL могут использовать разные загрузочные модули, что особенно важно для жизнедеятельности Windows (например в KERNEL32.DLL содержаться функции управления памятью процессами и потоками). Для создания DLL в среде C++ Builder необходимо выбрать File\New\Dll при этом автоматически генерируется проект, компиляция которого и дает искомый результат. Для написания экспортируемых функций используется следующий синтаксис: __declspec(dllexport) void nameFunc(); При компиляции, кроме прочих, создаются файлы с расширениями *.LIB и *.DLL, содержащие экспортируемые функции. Подключение DLL в C++ Builder возможно явным и неявным способом. При неявной компоновке в секцию директив необходимо добавить строку вида: #pragma link ”nameFile.lib” а, в секцию прототипов добавить описание прототипа функции: void nameFunc(); При неявной компоновке функция вызывается по имени, необходимы файлы с расширениями *.LIB и *.DLL. Библиотека подключается к процессу в момент загрузки процесса и выгружается вместе с процессом. Явная компоновка требует использования функций WINAPI LoadLibrary() и GetProcAddress(). В данном случае функция вызывается по номеру, который ей присвоен при создании DLL. C++ Builder упорядочивает экспортируемые функции DLL в алфавитном порядке их имен. Номер функции в DLL можно получить с помощью утилиты tdump с ключом -ee. Функция LoadLibrary() принимает в качестве параметра имя библиотеки, а возвращает переменную типа HINSTANCE. Функция GetProcAddress() имеет следующий прототип: void *GetProcAddress (HINSTANCE, const char *); она принимает переменную типа HINSTANCE и символическую константу, а возвращает указатель на функцию. В приведенных листингах демонстрируется создание, неявная и явная компоновки DLL. //Пример создания DLL #include <vcl.h> #pragma hdrstop int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { return 1; } //Выше находится заголовок DLL, генерируется автоматически double dblValue(double); double halfValue(double); __declspec(dllexport) int AreturnValue(bool); __declspec(dllexport) int CreturnValue(bool); __declspec(dllexport) int BreturnValue(bool); int CreturnValue(bool i) { i= true; return(2); } int BreturnValue(bool i) { i= true; return(3); } int AreturnValue(bool i) { i= true; return(1); } double dblValue(double value) { return value * value; }; double halfValue(double value) { return value / 2.0; }
//Пример неявной компоновки DLL #ifndef useDllU1H #define useDllU1H #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //-------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TLabel *Label1; TLabel *Label2; TLabel *Label3; TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //-------------------------------------------------------- extern PACKAGE TForm1 *Form1; //-------------------------------------------------------- int AreturnValue(bool); int CreturnValue(bool); int BreturnValue(bool); #endif
int (*returnVa1)(bool); int (*returnVa2)(bool); int (*returnVa3)(bool); //-------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner) {//Создание формы hinst=LoadLibrary("dll_cb_c.dll"); returnVa1=(int (*)(bool))GetProcAddress(hinst, MAKEINTRESOURCE(1)); returnVa2=(int (*)(bool))GetProcAddress(hinst, MAKEINTRESOURCE(2)); returnVa3=(int (*)(bool))GetProcAddress(hinst, MAKEINTRESOURCE(3)); } //На форме имеется одна кнопка и три метки void __fastcall TForm1::Button1Click(TObject *Sender) { bool buf_b; int j; buf_b=false; if(returnVa1==NULL) Label1->Caption=AnsiString("Error"); else { j=returnVa1(buf_b); Label1->Caption=AnsiString(j); } Label2->Caption=AnsiString(returnVa2(buf_b)); Label3->Caption=AnsiString(returnVa3(buf_b)); } MAKEINTRESOURCE — макрос для создания символической константы. Переменная типа HINSTANCE создается глобально. Загрузка библиотеки и присвоение указателей на функции производится в момент создания формы. Количество и тип параметров в описании функций (сигнатура функции) в DLL и указателя на функцию, в вызывающем модуле должны совпадать, совпадение имен не обязательно. DLL выгружается из памяти при завершении работы вызывающего модуля. Принудительная выгрузка DLL осуществляется функцией FreeLibrary(HINSTANCE).
Чтобы убрать "тормоза в игре" или одним словом улучшить производительность необходимо открыть в ХЕКС-редакторе (см. ссылку сверху) XR_3DA.exe, там в коде с помощью поиска найти цифры 45 78, найти их просто - ввести в поиске GlobalMemoryStatusEx . Далее изменить их на 00 00 и сохранить изменения. Всё. Теперь всё будет работать нормально. Способ нашёл не я - Rolan.
(С) _Призрак_ Инструкция по изменению плотности травы. Параметр меньше 0.02 не ставить - Колмогор писал что начинает лагать 1. Открываем айда 2. Открываем айда_виев 3. Теперь ищем что нам нужно найти. Нам сейчас нужно найти r__detail_density? Тогда жмем ctrl+t и вводим r__detail_density 4. Находим функцию и тщательно ее разбираем (я ее полностью разбирать не буду, а только укажу где задаются параметры: fld ds:flt_10064400 --нижнее ограничение равное 0.6 or dword_1007CACC, 8 sub esp, 8 fstp [esp+30h+var_2C] mov ecx, offset unk_1007CA9C fld ds:flt_10064380 --верхнее ограничение равное 0.2 fstp [esp+30h+var_30] push offset aSs; "ЪЩЩ>" push offset aR__detail_dens; "r__detail_density" call ds:??0CCC_Float@@QAE@PBDPAMMM@Z; CCC_Float::CCC_Float(char const *,float *,float,float) push offset sub_1005E080; void (__cdecl *)() call _atexit add esp, 4 Если вы заметили, то что бы трава стала плотней нужно уменьшить параметр, а что-бы травы стало меньше нужно параметр увеличить 5. Нам нужно увеличить плотность травы: следовательно нужно изменить верхнее ограничение. Как это сделать? Есть 3 варианта:
Первый и самый логичный вариант: изменить переменную которая задает. Но тут есть небольшой подвох на котором я попался. Этой переменной может пользоваться не одна функция, а несколько. И не ясно что вы можете сломать, поменяв одну циферку в переменной...
Второй: взять другую уже существующую переменную. Хороший вариант которым я и воспользовался. Но и тут есть недочет - переменных в ддлке не так уж и много и можно просто не найти нужную
Третий: создать переменную. Отличный вариант. Единственный минус - я не знаю как это сделать
Я пошел по второму пути. Два раза шелкнув на ds:flt_10064380 айда отправила меня в дебри под названием .rdata. Там я нашел переменную которая называлась - flt_1006452C и которая имела значение 0.0720999 Вообще-то, как я понял, flt_1006452C - не является названием переменной. Это так сказать сборка из 2 показателей - (тип числа)_(оффсет) В нашем случае это число типа float которое находится в 1006452C. Ну чтож приступим к редактированию! 6. Отправляем в самое начало файла. Как? Сверху есть что-то типа статус бара - строка состоящая из синего,серого,черного цвета. Нажимаем там в любом месте мышкой и ведем влево до конца 7. Опять ищем r__detail_density. Находим в этой функции fld ds:flt_10064338. Дальше самое интересное. Жмем на ХЕКС_ВИЕВ и там у нас выделяются какие-то цифры. Это наше 10064338 только написано наоборот. Сравните: 38 43 06 10 10 06 43 38 Похоже, не правда? Начинаем редактировать. нам нужно поменять 4338 на 452C т.к. в этом и есть различие. Жмем правой кнопкой мыши на этих цифрах и выбираем пункт Edit. Меняем 38 43 на 2С 45. Дальше жмем где нибудь в коде. Это нужно сделать обязательно. После этого жмем правой кнопкой мыши и выбираем commit changes. Но айда не меняет исходный файл. В нашем случае мы можем только создать файл изменений. Делается это так - Файл - Produce file - Create DIF file. Назовем его test. DIF файл можно открыть при помощи блокнота и посмотреть что вы сделали. Теперь так сказать соединит этот файл и дллку. Это можно сделать при помощи bpatch. Качаем и смотрим и запускаем bpatch.cmd. Я думаю что вы сможете его изменить сами если нужно будет. Там все элементарно.
Сообщение отредактировал RETRIX - Воскресенье, 04.03.2012, 23:11
GeeP_85, я имел кое-что другое. Я хотел спросить, можно ли им редактировать код движка. Картинки и иконки экзешника не очень интересует. Я уже создал тему в группе АП по этому делу - обосрали как смогли. Хорошо, нашлись нормальные люди, которые поняли меня, некоторым даже понадобилась моя помощь...
RETRIX, нет, я писал уже про IDA. Никаких этих ваших Exe Scope, крайняк Ресорс Хакер, для всего остального есть IDA. Текстуры делаются в основном для моделей, а это прописывается в настройках модели. Лучше для самого начала не лезте в движок, почитайте все основы моддинга на сталкер, те что есть на вики. Тут говорили делиться результатами, вот и первое что есть: Видео на YouTube Демонстрации воспроизведения mp3.
Добавлено (24.11.2011, 22:16) --------------------------------------------- Далее планируется полноценный mp3 плеер со своими фишками. Сейчас нужен в помощь программист LUA который смог бы сделать интрфейс для плеера.
Сообщение отредактировал Amicron - Четверг, 24.11.2011, 22:14
Спасибо за замечания. Я не имел ввиду текстуры привязные к моделям. Я имею ввиду ui_cursor, ui_ani_cursor_..., ui_icons_task, ui_icon_equipment, SYSTEM.LTX и тд, это даже не объязательно текстуры...
Да я переменовывая один такой файл 3 часа в хексе просидел. Многие модеры любят отложить отредактированные файлы в отдельные папки или назвать по своему. с вышенаписанными мною файлыми выше такое без вмешательство в движок невозможно.
Вы не правы, я вам сказал про учение основ моддинга? Сказал, вы это проигнорировали, а зря. Такие фишки включтся инклюдами в нужный файл, к примеру в том же system.ltx можно проследить это явление. Поверьте это просто бессмысленно, но я думаю с такого стоит начинать.
Сообщение отредактировал Amicron - Четверг, 24.11.2011, 22:48
Спасибо, Amicron, я это знал. В этой теме работают с движком =) точнее говорят о движке =(.
Основы моддинга мне поддались: создание нового оружия, создание несложных квестов, создание диалогов, новые предметы, сон, редактирование текстур, кода моделек, скриптинг и конфигурации...Движок сталкера для меня всегда был непреступным Эверестом, надеюсь преодолеть трудности с ним с прочтением всей по нему литературы, хотя без практики, я думаю литра бессмысленно. Как думаете, что-нибудь получится?
Это вы сейчас так говорите, я много успел повидать людей из сталкерского комьюнити и много форумов прочитал, и что же вышло? Вспомни АМК, с каким текстом они покинули сцену? Любая команда распадаясь говорит о недостатке времени и о потере интереса к игре.
RETRIX,Очень рад что комрады которые сами боятся движка и потому громко кричат уже рассеялись. Снимаю шляпу перед Амикроном, я перестал уж было заходить в данную тему ибо мне очень надоели местные "агрессоры". Ну и конечно же удачи Ретрикс!!!
Дизассемблер IDA Pro - действительно выдающийся инструмент исследования исполняемого кода.
Три кита, на которых держится исследование кода в IDA Pro, - это:
мощное средство анализа исполняемого кода, встроенное в дизассемблер. IDA Pro никогда не делает слишком "самоуверенных" предположений. Привилегия на эвристический анализ предоставляется человеку;
человеку предоставляется возможность участвовать в этом анализе, уточнять параметры тех или иных объектов программы, делать исправления. Другими словами, пользователь данного инструмента становится активным участником процесса дизассемблирования;
встроенный язык программирования, весьма близкий по своей структуре к классическому языку С, позволяет значительно наращивать функциональность данного продукта.
На протяжении всей книги мы пользовались этим замечательным инструментом, так что данная глава будет служить двум основным целям:
более подробно описать основные возможности дизассемблера IDA Pro.
представить справочный материал по данной программе, так чтобы читатель смог, по крайней мере, в начале обучения исследовать исполняемый код, заглядывая время от времени в мою книгу.
К сожалению, информация по данному отладчику крайне скудна, кроме довольно бедного справочного файла (idahelp.hlp) фактически ничего нет. И я надеюсь данной главой оказать помощь многочисленным желающим овладеть этим инструментом.
IDA - это Interactive DisAssembler, а совсем не имя женщины, хотя в окне About и помещено изображение прекрасной женской головки. Но инструмент действительно изящен, так что его название (точнее ассоциации, которые оно вызывает) вполне соответствует его сути.
Начало работы
Прежде всего, замечу, что в состав пакета IDA Pro входит консольный (idaw.exe) и графический вариант (idag.exe) программы. В дальнейшем все рассмотрение интерфейса будет касаться именно графического варианта программы.
Общие сведения о виртуальной памяти
Если вы загрузите в IDA Pro некоторый исполняемый модуль, то в каталоге, откуда произошла загрузка, обнаружите два файла с расширениями idO и id I. Это вспомогательные файлы виртуальной памяти, которые используются IDA Pro для хранения используемых им данных. При выгрузке загруженного модуля (File | Close) оба файла исчезают. В файл с расширением idI и именем исследуемого модуля загружается образ этого модуля. Этот образ вполне идентичен образу, загруженному в 32-битную плоскую память операционной системой Windows. Таким образом достигается полная идентичность исследуемого модуля с модулем, исполняемым операционной системой, что, несомненно, сближает IDA Pro с отладчиками. Для каждого адреса в файле хранится 32-битная характеристика: 8-битная ячейка, соответствующая данному адресу, и 24-битный атрибут, определяющий различные свойства данной ячейки (а именно, относится ли данная ячейка к инструкции или к данным (и какой тип данных), а также есть ли другие объекты в строке: комментарии, перекрестные ссылки, метки).
Механизмы работы с виртуальной памятью IDA Pro вполне идентичны аналогичным механизмам, которые используются операционной системой Windows. При обращении к конкретной ячейке загружается в оперативную память (в буфер) вся страница, где эта ячейка расположена. Если же изменить ячейку памяти, то происходит перезапись всей страницы виртуальной памяти. Часть страниц IDA Pro держит в оперативной памяти. Модифицированные страницы периодически сбрасываются дизассемблером на диск. В случае, когда требуется загрузить страницу, а буфер страниц полон, IDA Pro ищет среди загруженных страниц модифицированную раньше всех, сбрасывает ее на диск и загружает на ее место требуемую страницу.
Кроме хранения образа загружаемого модуля IDA Pro требуется память для хранения вспомогательной информации: имен меток, имен функций и комментариев. Для этого используется файл с расширением idO. Эту память в документации называют memory for b-tree.
На рис. 5.1 представлено главное окно дизассемблера IDA Pro с загруженной туда исполняемой программой. Фоновый анализ уже закончился, о чем говорит сообщение в левом нижнем углу: "The initial autoanalysis is finished".
В окне IDA Pro мы видим большое количество вкладок. По умолчанию их девять. На самом деле количество вкладок может быть и больше. Их можно добавлять при помощи пунктов меню Views | Open subviews. Два окна - IDA View (Окно дизассемблера) и Hex View (Окно дампа) - могут дублироваться: таким образом в разных окнах можно просматривать разные участки кода и данных. Эти окна имеют суффиксы, чтобы отличать их друг от друга: А, В, С и т. д.
Конечно, главным окном программы является IDA View. Именно в нем представлен основной результат анализа исполняемого кода, и где вы также можете поучаствовать в продолжение этого анализа.
Когда вы работаете с отладчиком IDA Pro, не забывайте о трех способах управления им: пункты меню, кнопки панели инструментов и горячие клавиши. Последние реализуют далеко не все возможности IDA Pro, но охватывают наиболее часто используемые операции. Например, если какой-то блок данных вызывает у вас сомнение, вы всегда можете преобразовать его в код (дизассемблировать), нажав клавишу <С> (от англ. Code - код). И наоборот, если последовательность ассемблерных команд кажется вам слишком бессмысленной, вы можете преобразовать ее в данные при помощи клавиши (от англ. Data - данные).
IDA Pro использует следующие файлы конфигурации: ida.cfg - общий файл, idatui.cfg - файл конфигурации для консольного варианта программы, idagui.cfg - файл конфигурации для графического варианта программы. Файлы конфигурации должны располагаться в подкаталоге CFG главного каталога IDA Pro.
Загрузка исследуемого кода
При загрузке исполняемого модуля появляется окно, изображенное на рис. 5.2, при помощи которого можно настроить процесс загрузки и первичного анализа. Окно содержит большое количество настроек, которые мы разберем ниже. В абсолютном большинстве случаев IDA Pro предлагает оптимальную настройку, так что ничего настраивать не приходится, а остается только нажать кнопку ОК и положиться на волю провидения и дизассемблер. Но поскольку эти опции все же иногда используются, я дам их краткое толкование.
Список Load file каталог\имя as содержит перечень форматов, которые распознаются данной версией программы IDA Pro для выбранного модуля. В большинстве случаев IDA Pro сам распознает, какой тип файла предполагается загрузить. Кстати, в зависимости от этого типа автоматически устанавливаются и остальные опции окна. Вы можете, например, провести простой эксперимент и дизассемблировать DOS-заглушку РЕ- модуля (см. рад. 1.5.1), выбрав в списке строку MS-DOS executable. Кнопка Set служит для фиксации выбора. Еще раз хочу подчеркнуть, что данный список соответствует тому, что мы выбрали РЕ-модуль. Действительно он может трактоваться и как обычный РЕ-модуль, и как MS-DOS- программа, и как бинарный файл. В случае если выберете, скажем, NE- модуль, то содержимое списка будет другим.
Выпадающий список Processor type предоставляет возможность выбрать процессор, для которого скомпилирован данный исполняемый модуль.
Поля Loading segment и Loading offset позволяют загружать модуль в конкретный сегмент и с конкретным смещением, что может быть полезно для DOS- и двоичных модулей. Для РЕ-модулей эти параметры не используются.
Флажок Enabled (группа Analysis) позволяет отменить первичный анализ исполняемого кода. По умолчанию флажок установлен, т. е. анализ после загрузки будет проводиться.
Флажок Indicator enabled в установленном состоянии (по умолчанию) указывает проводить индикацию процесса анализа.
Флажок Create segments (группа Options) для РЕ-модулей не используется. Если флажок установлен, то IDA Pro создает необходимые сегменты.
Флажок Load resources предписывает загружать ресурсы РЕ-модуля. Для бинарного модуля флажок называется Load as code segment (Загрузить как кодовый сегмент) и используется, например, для сот-программ.
Если флажок Rename DLL entries не установлен, то IDA Pro делает дополнительные комментарии для функций, импортируемых по ординалу, в иротивном случае функции переименуются на усмотрение дизассемблера.
Установка флажка Manual load предписывает дизассемблеру "советоваться" с вами на каждом шаге загрузки.
Флажок Fill segment gaps актуален только для NE-модулей и предписывает заполнять пространство между сегментами, образуя один большой сегмент.
Если установлен флажок Make imports segments, то заставляет дизассемблер трактовать секцию .idata, только в плане импортируемой информации, игнорируя тот факт, что в ней могут находиться и данные.
Флажок Don't align segments предписывает выравнивать сегменты. Данный флажок не используется для рассматриваемых нами модулей.
Кнопка Kernel optionsl вызывает окно опций, используемых при анализе исполняемого кода.
С помощью флажка Create offsets and segments using fixup info дизассемблеру предписывается использовать при анализе информацию из таблицы перемещений.
Флажок Mark typical code sequence as code предписывает дизассемблеру использовать при анализе типичные последовательности команд микропроцессора.
Флажок Delete instructions with no xrefs разрешает игнорировать инструкции микропроцессора, на которые нет перекрестных ссылок.
Флажок Trace execution flow позволяет проводить трассировку для обнаружения инструкций процессора.
Флажок Create functions if call is present предписывает распознавать функции по их вызовам.
Флажок Analyse and create all xrefs - одна из основных опций, которая заставляет дизассемблер использовать в своем анализе перекрестные ссылки.
Флажок Use flirt signatures предписывает использовать технологию FLIRT (учет сигнатур для распознавания библиотечных функций).
Флажок Create function if data xref data->code32 exists предписывает проверять ссылки на исполняемый код в области данных.
Флажок Rename jump functions as j_... разрешает IDA Pro переименовывать простые функции, содержащие только команду перехода jmp
Флажок Rename empty functions as nullsub_... позволяет IDA Pro переименовывать функции, содержащие одну команду RET, в nullsub_....
Флажок Create stack variables предписывает дизассемблеру создавать (определять) локальные переменные и параметры функций.
Флажок Trace stack pointer заставляет IDA Pro отслеживать значение регистра указателя стека ESP.
Флажок Create ascii string if data xref exists предписывает рассматривать данное, на которое есть ссылка, как ASCII-строку, если его длина превосходит определенную величину.
Флажок Convert 32bit instruction operand to offset предписывает рассматривать непосредственное данное в инструкции процессора, как адрес, если его значение попадает в определенный промежуток.
Флажок Create offset if data xref to seg32 exists предписывает рассматривать значение, хранящееся в области данных, как адрес, если оно попадает в определенный промежуток.
Флажок Make final analysis pass сообщает, что дизассемблеру на последней стадии анализа следует преобразовывать все еще неисследованные байты в данные или инструкции.
Кнопка Kernel options2 вызывает окно с еще одним набором опций, используемых при анализе исполняемого кода.
Флажок Locate and create jump tables предписывает IDA Pro делать заключение об адресе и размере таблицы переходов.
Если флажок Coagulate data in the final pass сброшен, то на последней стадии анализа преобразуются только байты сегмента кода (см. флажок Make final analysis pass).
Флажок Automatically hide library functions заставляет скрывать (сворачивать) библиотечные функции, обнаруженные при помощи технологии FLIRT.
Флажок Propagate stack argument information указывает дизассемблеру сохранять информацию о стековых параметрах вызова при последующих вызовах (вызов функции из другой функции и т. д.).
Флажок Propagate register argument information указывает дизассемблеру сохранять информацию о регистровых параметрах вызова при последующих вызовах (вызов функции из другой функции и т. д.).
Флажок Check for Unicode strings разрешает дизассемблеру осуществлять проверку программы на наличие строк в кодировке Unicode.
Флажок Comment anonymous library functions указывает, что дизассемблер должен помечать анонимные библиотечные функции с использованием имени библиотеки и сигнатуры, с помощью которой функция была обнаружена.
Флажок Multiple copy library function recognition разрешает дизассемблеру распознавать в программе несколько копий одной и той же функции.
Флажок Create function tails разрешает поиск и добавление к определению функции ее окончания.
Кнопка Processor options вызывает окно с опциями процессора.
Флажок Convert immediate operand of "push" to offset указывает на возможность преобразовывать непосредственный операнд в команде PUSH в смещение (адрес).
Флажок Convert db 90h after "jmp" to "nop" указывает дизассемблеру, что байты 9он, стоящие после команды JMP, следует трактовать как команды NOP.
Флажок Convert immediate operand of "mov reg,..." to offset указывает на возможность преобразовывать непосредственный операнд в команде MOV reg,... (REG - регистр) в смещение (адрес).
Флажок Convert immediate operand of "mov memory,..." to offset предполагает возможность преобразовывать непосредственный операнд в команде MOV MEM, ... в смещение (адрес).
Флажок Disassemble zero opcode instructions предписывает дизассемблировать следующую инструкцию: ОО ОО ADD [EAX] ,AL. ПО умолчанию данный флажок сброшен.
Флажок Advanced analysis of Borland's RTTI (RTTI, runtime type identification, идентификация типов во время исполнения программы) разрешает IDA Pro проверять и создавать структуры RTTI.
Флажок Check 'unknownlibname' for Borland's RTTI позволяет проверять имена, помеченные как "unknown libname" на наличие RTTI- структуры.
Флажок Advanced analysis of catch/finally block after function разрешает дизассемблеру искать catch/finally блоки обработки исключений.
Флажок Allow references with different segment bases разрешает дизассемблеру указывать ссылки на символы, даже если величина, хранящаяся по указанному адресу, символом не является (не является кодом символа).
Флажок Don't display redundant instruction prefixes предписывает дизассемблеру не показывать некоторые префиксы команд для улучшения читаемости листинга.
Флажок Interpret int 20 as VxDcall предписывает интерпретировать INT 2ОН как VxDcall/jump.
Флажок Enable FPU emulation instructions указывает, что команды типа INT з?н следует интерпретировать как эмуляцию команд арифметического сопроцессора.
Если флажок Explicit RIP-addressing установлен, то предполагается, что в программе используется RIP-адресация (Relative Instruction Pointer, относительный указатель команды). Данный флаг действует для 64-битных процессоров.
Поле System DLL directory содержит каталог, где IDA Pro будет искать динамические библиотеки, если в подкаталоге IDS отсутствует файл с расширением ids, соответствующий данной библиотеки.
Поскольку работать в IDA Pro большей частью приходится в окне дизассемблера, то есть смысл остановиться на нем более подробно. Надо сказать, что разработчики дизассемблера действительно тщательно продумали представление дизассемблированной информации и способы навигации по ней. Мы остановимся только на некоторых ключевых моментах.
Сворачивание функций. Функции в окне дизассемблера могут представляться в свернутом, или скрытом виде (hide), и развернутом, или раскрытом (unhide) виде. В свернутом виде функция представляется всего одной строкой. Это действительно замечательное изобретение позволяет значительно улучшить читаемость дизассемблированного текста. Скрытие и раскрытие функции осуществляется клавишами <-> и <+> (на дополнительной клавиатуре) или с использованием команд View | Hide и View | Unhide.
Индикация переходов. На рис. 5.3 представлено окно дизассемблера. Обратите внимание на крайнюю левую секцию окна. Она предназначена для улучшения ориентации пользователя в листинге. Точками обозначены команды. Строка без точки означает, что здесь расположен комментарий. Щелчок по точке приводит к установке точки останова на данный адрес. Переходы помечаются сплошными и пунктирными линиями. Сплошные линии обозначают безусловные переходы, пунктирные линии - условные переходы.
Комментарии. Адрес в программе, куда осуществляется переход (команды условных и безусловных переходов или команда CALL) или на который имеется ссылка, содержит специальный комментарий. Комментарий начинается либо с CODE XREF, если ссылка имеет смысл перехода на данный адрес, либо с DATA XREF, если на эту инструкцию ссылаются как на данные (например, так MOV EAX, OFFSET LI). Это есть не что иное, как перекрестные ссылки. Перекрестные потому, что данный адрес и есть тот перекресток, где встречаются ссылки из других мест программы. Далее через двоеточие указывается адрес относительно начала функции или начала секции, откуда идет эта ссылка. Наведя курсором мыши на этот адрес, мы вызовем всплывающее окно с фрагментом кода, откуда ссылаются на данную инструкцию. Адрес обязательно содержит символы Т, I, показывающие направление, где находится строка, ссылающая на данную строку. Перейти на строку, откуда идет ссылка, можно просто двойным щелчком мыши по адресу. Если ссылок на данную строку меньше четырех, то они перечисляются, в противном случае указывается многоточие. В этом случае можно щелкнуть по одному из адресов правой кнопкой мыши и выбрать пункт контекстного меню Jump to cross reference. После этого появится окно со списком всех адресов, где имеется ссылка на данную строку. Выбрав нужный адрес щелчком мыши (либо нажатием кнопки ОК), мы окажемся в нужном месте листинга. На рис. 5.4 представлен фрагмент окна дизассемблера, содержащего справа комментарии с указанием перекрестных ссылок.
Обозначение адреса. В листинге, который представлен в окне дизассемблера, используются различные способы обозначения адреса. Например, в случае библиотечной функции или функции API явно указывается имя этой функции. Кроме этого, IDA Pro практикует называть ссылки на обнаруженные им строки, на основе содержимого строки. Например, если строка содержит текст "You are wrong!", то IDA Pro обозначает ссылку на эту строку, как aYouAreWrong. Префикс в данном случае указывает, что IDA Pro считает это ASCII-строкой. Остальные имена, обозначающие имена функций или адреса данных, формируются на основе префикса и адреса. Вы можете встретить следующие префиксы:
sub_ - для обозначения функции;
locret_ - адрес инструкции return;
loc - адрес инструкции;
off_ - данные, содержащие адрес (смещение);
seg_ - данные, содержащие сегментный адрес;
asc_ - адрес ASCII-строки;
byte_ - адрес байта; word_ - адрес слова; dword_ - адрес двойного слова; qword_ - адрес 64-битной величины; fit_ - адрес 32-бйтного вещественного числа; dbi_ - адрес 64-битного вещественного числа; tbyte_ - адрес 80-битного вещественного числа; stru_ - адрес структуры; algn_ - директива выравнивания; unk_ - адрес неисследованной области.
Контекстное меню. При работе с окном дизассемблера удобно пользоваться контекстным меню, которое появляется, если щелкнуть в окне правой кнопкой мыши. При этом меню отличается некоторыми пунктами для разных частей листинга: названий функций, инструкций, комментариев, выделенного блока и т. д. Часть пунктов касается работы IDA Pro в качестве отладчика, и мы об этом еще будем говорить (Run to cursor, Add breakpoint, Add execution trace). В частности, обратите внимание на пункт Rename, с помощью которого, например, можно редактировать содержимое команд (операнды).
Навигация по листингу. Наконец, важным моментом является передвижение по листингу. Выход на перекрестную ссылку мы уже разбирали. Но точно также (двойным щелчком мыши) можно двигаться в обратную сторону по перекрестной ссылке (например, безусловному переходу, команде CALL или по адресу в команде типа MOV EAX, OFFSET addres). Причем IDA Pro запоминает все ваши переходы. Так, вы всегда можете двигать назад по цепочке или опять по ней же вперед (в стиле интернет-браузера), используя кнопки на панели инструментов.
Другие окна
Окно Hex View. Содержит шестнадцатеричный дамп загруженного модуля, а также ASCII-символы, соответствующие этому дампу. Окно является вспомогательным по отношению к окну дизассемблера и легко синхронизируется с ним, для чего достаточно щелкнуть правой кнопкой мыши в окне и выбрать пункт Synchronize with | Ida View контекстного меню. Перейдя в окно дизассемблера, мы окажемся как раз в том месте программы, которое соответствует адресу в окне дампа. Кроме этого, IDA Pro отслеживает адреса, с которыми работает окно дизассемблера, и при переходе к дампу мы оказываемся в нужном месте.
Окно Exports. Содержит список экспортируемых функций. Актуально для динамических библиотек. Для обычных исполняемых модулей список состоит из одного элемента - функции start.
Окно Imports. Содержит список импортируемых функций и модули, откуда они импортируются. Двойной щелчок по импортируемой функции приводит к переходу в окно дизассемблера, в точку входа. Так что мы далее легко можем найти все перекрестные ссылки на эту функцию в программе.
Окно Names. Окно имен содержит список не только всех импортируемых или библиотечных функций, но и распознанные IDA Pro имена переменных и меток. Слева для каждого имени стоит значок, определяющий тип имени:
L - библиотечная функция;
F - регулярные функции, API-функции;
С - инструкция (метка);
А - строка в кодировке ASCII;
D - данные;
I - импортируемая функция.
Двойной щелчок по имени приводит к переходу к тому месту программы, где это имя используется. С помощью клавиши можно создать новое имя (например, для метки) и указать адрес, соответствующий этому имени. Имя, разумеется, появится и в окне дизассемблера.
Окно Functions. Данное окно содержит весь перечень определенных IDA Pro функций (и библиотечных, и импортируемых, и пользовательских).
Окно Strings. Содержит все найденные дизассемблером строки. Сделав двойной щелчок по строке, мы автоматически перейдем в текст листинга, где эта строка определена. По умолчанию в окне представляются только строки в стиле С. Щелкнув по окну правой кнопкой мыши и выбрав пункт Setup в контекстном меню, мы можем включить в окно строки другой структуры (строки Unicode, строки, используемые в языке Pascal, и т. д.).
Окно Structures. Содержит все найденные дизассемблером структуры. При помощи клавиши можно добавить в список новую структуру.
Окно Enums. Служит для указания найденных в программе перечислений (enumerations).
Кроме перечисленных окон при работе дизассемблера будут использоваться и другие. В частности, обращаю ваше внимание на окно Libraries. В справочной системе это окно называется окном сигнатур. В окне содержится перечень сигнатур, которые были использованы при распознавании библиотечных функций. На рис. 5.5 представлено окно сигнатур. Как видно из рисунка, в списке указано имя файла, где содержатся сигнатуры функций, количество найденных с помощью этих сигнатур функций, а также имя библиотеки, к функциям которой были применены данные сигнатуры. Нажав клавишу , вы можете выбрать из появившегося списка файлов сигнатур нужный файл, сигнатуры которого тут же будут использованы для распознавания новых функций, и добавить его.
Я не собираюсь подробно разъяснять все пункты меню и все кнопки панели инструментов IDA Pro. В большей части возможностей IDA Pro читатель легко разберется сам. Хочется остановиться на некоторых, с моей точки зрения, важных моментах.
Меню File содержит следующие пункты:
Open - загрузка дизассемблируемого модуля;
Load - загрузка различных файлов: reload the input file - повторная загрузка дизассемблируемого модуля; Additional binary file - загрузка в базу дополнительного бинарного файла; IDS file - загрузка IDS-файла, содержащего информацию о функциях той или иной библиотеки импорта, все IDS-файлы, находящиеся в каталоге IDS, загружаются автоматически; PDB file - загрузка PDB-файла, который содержит отладочную информацию; DBG file - загрузка файла, содержащего отладочную информацию; FLIRT signature file - загрузка и применение файла сигнатур, такая же операция выполняется в окне сигнатур (см. рис. 5.5 и комментарий к нему); Parse С header file - чтение из заголовочного файла С определений типов для дальнейшего объявления новых структур и перечислений (см. описание окон Enums и Structures в предыдущем разделе);
Produce file - при помощи данного пункта можно создавать новые файлы различной структуры на основе дизассемблируемого кода: МАР-файл, который может быть использован отладчиками, файл на языке ассемблера (расширение asm), LST-файл (листинг), листинг в формате HTML и др.;
IDC file - загрузка и выполнение файла сценария (скрипта) (см. разд. 5.1.3);
IDC command - вызов окна немедленного выполнения скриптов;
Save - сохранение текущей базы дизассемблирования (файл с расширением idb);
Save as - сохранение текущей базы дизассемблирования с заданным именем;
Close - закрытие дизассемблируемого файла с сохранением базы дизассемблирования.
Меню Edit содержит следующие пункты:
Сору - копировать в буфер обмена выделенный фрагмент;
CODE - преобразовать блок к исполняемому коду;
DATA - преобразовать блок к данным;
Struct var - преобразовать блок к выбранной структуре;
Strings - преобразовать к строке. Типы строк предлагаются в подменю;
Array - преобразовать к массиву с заданными параметрами;
Undefine - отметить как данные неопределенной структуры;
Name - переименовать;
Operand type - задать тип операнда;
Comments - управление комментарием;
Segments - управление сегментами;
Structs - управление структурами;
Functions - управление функциями;
Other - другие возможности: указать директиву выравнивания, ввести инструкцию или данные, выделить цветом;
Plugins - плагины (внешние подключаемые модули, от англ. plug in - подключать).
Меню Jump. Пункты посвящены всевозможным переходам по дизассемблированному тексту: переход по указанному адресу, переход к указанной функции (выбор функции из списка), переход к точке входа программы, пометка строки, переход по указанной метке и т. д.
Меню Search. Пункты реализуют различные операции поиска в дизас- семблированном тексте: поиск текста, поиск следующего в тексте блока данных, поиск следующей в тексте ассемблерной инструкции, поиск последовательности байтов и т. д.
Меню View. С помощью пунктов данного меню можно менять внешний вид дизассемблера IDA Pro: открывать новые окна (Open Subviews), создавать и удалять панели инструментов (Toolbars), сворачивать (Hide) и разворачивать (Unhide) функцию, вызвать окно калькулятора и др.
Меню Debugger. Пункты меню относятся к отладочным возможностям IDA Pro: управление точками прерывания (Breakpoints), управление наблюдениями (Watches), управление трассировкой (Tracing), просмотр содержимого регистров (General registers, Segment registers, FPU registers) и др.
Меню Options. Пункты посвящены всевозможным настройкам IDA Pro, с частью из которых мы знакомились, когда рассматривали окно управления загрузкой.
Меню Windows. С помощью пунктов данного меню можно управлять окнами IDA Pro.
Меню Help. Пункты посвящены получению справки и технической поддержки.
Ключи запуска программы
При запуске IDA Pro можно использовать следующие ключи:
-а - отмена автоматического анализа;
-А - запуск IDA Pro с автоматической загрузкой последней базы;
-ь#### - указание адреса для загрузки модуля;
-в - запуск IDA Pro с автоматической генерацией idb- и asm-файлов;
-с - удаление старой базы дизассемблирования;
-ddirectiva - запуск с указанием директивы загрузки для первого прохода анализа;
-Ddirective - запуск с указанием директивы загрузки для второго прохода анализа;
Здесь piugi - название дополнительного модуля; optl, opt2, opt3 - опции модуля;
П -o#### - указание имени базы. Ключ используется вместе с ключом -с; ?I -р - указание типа процессора;
-р+ - упаковка базы;
_Р отказ от упаковки базы;
-R - загрузка ресурсов из ехе-файла;
-s#### - выполнение указанного idc-файла;
-w#### - указание каталога Windows;
-х - отказ от создания сегментов;
-? - экран помощи о ключах запуска IDA Pro.
Простые примеры исследования кода
В данном разделе мы опять вернемся к примерам на языке ассемблера (см. разд. 1.6). Причина очень проста. С помощью языка ассемблера очень легко смоделировать нужную программную ситуацию, чтобы продемонстрировать те или иные закономерности исследования кода в дизассемблере IDA Pro.
О возможностях IDA Pro
Простые вещи
В предыдущих главах мы неоднократно убеждались в возможностях дизассемблера IDA Pro анализировать исполняемый код. Рассмотрим простую программу на языке ассемблера из листинга 5.1.
.text:00401024 ; [00000006 BYTES: COLLAPSED FUNCTION MessageBoxA. PRESS KEYPAD "+" TO EXPAND]
.text:0040102A align 200h
.text:0040102A text ends
Смотрите, IDA Pro четко отследил значение регистра ESI и тем самым определил начало процедуры sub_40i02i. Конечно, арифметика здесь проста: нужно добавить к адресу 1ос_40Ю1Е число три, и получим как раз адрес вызываемой процедуры. Определив же начало процедуры, можно достаточно легко выяснить ее конец, который в данном случае определяется просто ближайшей к началу командой возврата RETN.
Несколько видоизменим программу из листинга 5.1. Оказывается, наше незначительное изменение приводит к некоторым сложностям в дизассембли- ровании (листинг 5.3).
. 586Р
.MODEL FLAT,STDCALL includelib e:\masm32\lib\user32.lib EXTERN MessageBoxA!? 1 6: NEAR ;сегмент данных _DATA SEGMENT TEXTl DB 'No problem!',0 TEXT2 DB 'Message',0 DATA ENDS
;сегмент кода TEXT SEGMENT
START:
PUSH OFFSET 0
PUSH OFFSET TEXT2
PUSH OFFSET TEXTl
PUSH 0
CALL MessageBoxA16
MOV ESI, 3
ADD ESI,OFFSET L2
PUSH ESI
POP EDI
L2:
CALL EDI
RETN
LI:
XOR EAX,EAX RETN _TEXT ENDS END START
Рассмотрим, что получилось у дизассемблера IDA Pro после анализа исполняемого кода, созданного транслятором ассемблера из программы, которую мы видим в листинге 5.3. Результат представлен в листинге 5.4.
.text:00401000 _text segment para public 'CODE1 use32
Рассмотрим листинг 5.4, где представлен анализ, который провел дизассемблер IDA Pro. Посмотрите, незначительные изменения в исходном тексте программы приводят к тому, что процедура по адресу 00401023 более не распознается дизассемблером. Конечно, чтобы все-таки понять, как проводился анализ, надо посмотреть алгоритм, которым пользуется IDA Pro. Но некоторые соображения можно сделать, и не видя алгоритма. Как я уже говорил, IDA Pro - очень осторожная программа. Она не хочет делать слишком скороспелые выводы. В данном случае есть некоторая вероятность, что на метку 1ос_40Ю20 будет сделан переход (неявный, конечно) откуда-то из другого места программы, и тогда, возможно, адрес процедуры будет совсем иным. Конечно, все это трудно взвесить, но из осторожности можно учесть такую возможность и положиться на совместную работу с пользователем.
Впрочем, вот такой фрагмент
push esi pop esi l2:
call esi
IDA Pro уже нисколько не смущает, и адрес процедуры в этом случае определяется вполне корректно.
Как это происходит
Давайте рассмотрим, как происходит совместная работа исследователя кода и дизассемблера IDA Pro. В листинге 5.5 представлена простая программа на ассемблере. Вызов CALL EDI, как легко видеть, осуществляется по адресу, соответствующему метке ы.
Как и следовало ожидать, дизассемблер не распознает адрес, по которому будет осуществлен вызов CALL EDI.
Начнем наши изыскания с того, что создадим функцию по адресу 00401023. То, что мы имеем здесь дело с некоторой функцией, ясно даже без определения адреса, по которому осуществляется вызов CALL EDI. Действительно, последовательность команд
XOR ЕАХ,ЕАХ RETN
почти наверняка указывает на тело некоторой функции. Установим курсор на первую команду предполагаемой функции и нажмем клавишу <Р> или воспользуемся пунктом меню Edit | Functions | Create function. В результате IDA Pro автоматически создаст функцию:
.text:00401023 sub_401023 proc near
.text:00401023 xor eax, eax
.text:00401025 retn
.text:00401025 sub_401023 endp
Итак, функция создана, и теперь ссылки на нее можно использовать в ди- зассемблированном тексте. При этом дизассемблер будет автоматически учитывать наше редактирование и продолжать анализ с учетом нашей корректировки. Перейдем теперь к строке с адресом 0040Ю20 (CALL EDI). Нажмем клавишу <;> для ввода комментария. Можно воспользоваться также пунктом меню: Edit | Comments Enter comments. В результате на экране появится окно для ввода комментария (рис. 5.6). Здесь можно ввести любой комментарий. Но комментарий в IDA Pro обладает одной особенностью: некоторые комментарии несут информацию не только для нас с вами, но для самого дизассемблера.
Итак, в окно редактирования введем следующую строку: DATA XREF: sub_401023. Мы, таким образом, указываем, что вызов процедуры осуществляется по адресу, соответствующему метке sub_401023. Результат более чем интересен. Мы не просто получаем комментарий, щелкнув по которому, переходим по соответствующей ссылке. Автоматически появляется комментарий и у строки с адресом 0040101. Чтобы не быть голословным, привожу следующий фрагмент (листинг 5.7).
pop edi
add edi, offset loc_401020 ; DATA XREF: sub_401023 loc_401020: ; DATA XREF: start+lA?o
call edi ; DATA XREF: sub_401023 retn
start endp
SUBROUTIN E
sub_40l023 proc near
xor eax, eax retn
sub 401023 endp
Сообщение отредактировал Amicron - Пятница, 25.11.2011, 14:12