Rolan 22 Опубликовано 4 Октября 2010 X-Ray Предлагаю всем задавать вопросы по редактированию движка здесь,а не в ковырялках. И так начнём: Сам X-Ray написан на C/C++, к нему был подключен компилятор языка LUA "lua.JIT.1.1.4". IDA Pro – это дизассемблер, альтернативы которому просто нет. Для профессиональной работы это единственный пригодный дизассемблер. Он давно стал стандартом, и если говорят о дизассемблере, то в первую очередь имеют в виду IDA Pro. IDA Pro имеет огромное количество функций и модулей, которые значительно упрощают процесс дизассемблирования. Сюда входит распознавание стандартных библиотечных функций, распознавание аргументов функций и их типов, представление всего кода в удобной древовидной форме и многое другое. Основные группы пользователей IDA Pro – это антивирусные компании, крупные разработчики ПО, специалисты по информационной безопасности. IDA Pro поставляется в двух версиях Standard и Advanced. Standard поддерживает более 20 семейств процессоров, а Advanced - более 50. Основные пользователи нашего дизассемблера: * антивирусные компании * специалисты по информационной безопасности * эксперты по программному обеспечению * а также разработчики программных защит Основная задача - превращение бинарного кода в читаемый текст программы - дополнена многими уникальными возможностями: * распознавание стандартных библиотечных функций (технология FLIRT) * интерактивность работы * развитая система навигации * система типов и параметров функций * встроенный язык программирования IDC * открытая и модульная архитектура * возможность работы практически со всеми популярными процессорами (список) * возможность работы практически со всеми популярными форматами файлов (список) * работа со структурами данных высокого уровня: массивами, структурами, перечисляемыми типами * встроенный отладчик для Win32 Типичные примеры задач, решаемые с помощью дизассемблера: * анализ вирусов, троянов и других вредоносных программ * поиск ошибок в программах * изучение полученного кода * валидация программ * оптимизация программ * разработка защит и поиск дыр в защите В настоящей версии присутствует отладчик для Win32, Win64, WinCE(ARM) и Linux программ, что делает анализ таких программ еще проще и быстрей. IDA Pro работает под MS Windows, Linux и Mac OS X. IDA Proрусский сайт интерактивного дизассемблерра IDA ProДекомпилятор HexRays - Руководство пользователяРусский форум IDA Pro P.S. Выкладывайте свои программы для работы с движком и декомпиляцией. Лет пять назад мне понадобилось подправить синтаксический анализатор компилятора Turbo C 2.0 Prof, а для этого нужно было найти в немаленьком (что-то около 180 кб) по тем временам EXE-файле нужный фрагмент. Трассировать отладчиком не было никакого терпения, популярный в то время дизассемблер Sourcer его не брал по причине этой самой величины, а DisDoc, который брал, выдавал настолько "непричесанный" результат, что невольно вспоминалось из Жванецкого - "...лекарство, которое не берет микроб, а наоборот - с ним сотрудничает". В тот момент мне на глаза и попалась IDA - интерактивный дизассемблер москвича Ильфака Гильфанова с его заманчивым "объем исходного файла - не ограничен". Однако, успев уже привыкнуть к максимально вылизанным выходным текстам Sourcer'а, я после запуска IDA обнаружил на экране полное отсутствие интеллекта - как я тогда его понимал - выразившееся в нежелании дизассемблера сразу же выдавать готовый результат, как это делал Sourcer. И, поленившись вникнуть в непривычную идеологию нового инструмента (а она оказалась поистине революционной) я забросил его на целых два года - и, как понял впоследствии, потерял из-за этого кучу времени и сил. Для сравнения скажу, что вскоре после того, как я все же разобрался с IDA и в полном смысле слова полюбил ее (а ее мощность тогда была чуть ли не вполовину ниже теперешней), я снова взялся за компилятор - ради интереса, ибо в прошлый раз нашел-таки нужное место за пару дней плотной работы). IDA сделала первичное дизассемблирование минут за пятнадцать (на DX2-66), еще пара часов ушла на основное причесывание программы, после чего требуемые фрагменты отыскивались элементарно. Программисты, знакомые с Sourcer, хорошо знают его идеологию - это полностью пакетный (работающий самостоятельно) дизассемблер; он сразу же пытается все сделать за вас все, что может, и в результате, преуспев в одном, может совершенно запустить другое. Разумеется, у Sourcer есть файл описания - DEF - в котором многое можно исправить, явно прописав типы данных, аргументов, адреса сегментов и многое другое; но для этого нужно сначала полностью "прогнать" его по файлу (а это может занять не один десяток минут), затем получить результат в виде обычного текстового файла, просмотреть его обычным же текстовым редактором и сделать нужные исправления в DEF-файле. Затем следует новый прогон и новый анализ результатов. Причем раздражает не столько рутинная работа, сколько то, что масса полезной информации о структуре программы, образующаяся в процессе работы дизассемблера, из "объемного" внутреннего представления преобразуется по окончании сеанса в пару "плоских" текстовых файлов, совершенно неудобных для изучения. Идея IDA, собственно, проста - это дизассемблер-среда, или оболочка, ее не используют в качестве вспомогательного средства - в ней живут, изучая структуру дизассемблируемой программы. Удивительно, что такая простая, по сути, мысль больше никому не пришла в голову - при наличии сотен различных инструментов визуальной разработки программ, для их анализа, кроме IDA, ничего визуального нет, хотя различных любительских (то есть - изначально сделанных не на продажу) дизассемблеров существует великое множество. IDA строит по исследуемой программе базу данных, описывающую карту типов данных, граф переходов, границы подпрограмм, адреса и форматы текстовых строк, имена меток и переменных, и многое другое. Изюминка состоит в том, что эта база, однажды возникнув, существует всегда - непрерывно пополняясь и изменяясь в результате исследования программы. При завершении сеанса работы с IDA база просто закрывается, а при следующем сеансе - открывается вновь в том же самом состоянии, и вы видите перед собой фрагмент программы, который покинули в конце прошлого сеанса. Для построения базы данных используется виртуальная память, объем которой ограничен только свободным местом на диске, поэтому в IDA можно загружать файлы любого размера. Скорость дизассемблирования тоже не имеет решающего значения - сеанс можно прервать в любой момент, и в начале следующего сеанса дизассемблирование будет продолжено с прерванного места. Вся информация о программе - как полученная автоматическим анализатором, так и введенная вами - хранится в базе в удобном для IDA представлении - в виде B-дерева. Преобразование в текстовый вид происходит только при выводе на экран, а все команды редактирования выполняются непосредственно над внутренним представлением. Таким образом, программа оказывается как бы многослойной - самый верхний слой в виде дизассемблированного текста отображается на экране, а более глубокие информационные слои превращают его в гипертекст, описывая направления переходов, отслеженные изменения значений регистров, перекрестные ссылки и прочие вроде бы мелкие, но чрезвычайно упрощающие анализ детали. IDA не является автоматическим дизассемблером - самостоятельно выполняются только очевидные операции, вроде расшифровки программного кода, определения начал/концов функций, именования входных точек и т.п. Все остальные операции должны быть явно запрошены пользователем. Это не означает, что IDA недостаточно собственного интеллекта - она всего лишь не пытается опережать вас в анализе программы. От вас требуется лишь сформулировать направление дальнейшей работы, а всю рутинную и кропотливую работу IDA берет на себя. Например, стоит указать, что неопределенный массив данных является таблицей переходов, как IDA автоматически преобразует эти данные в таблицу адресов и запустит дизассемблирование по этим адресам. Можно сказать, что IDA работает в тесном сотрудничестве с вами - в этом и заключается ее интерактивность. Фактически IDA состоит из двух почти полностью независимых подсистем - пользовательского интерфейса и фонового анализатора. Анализатор работает, как отдельный фоновый процесс - получая команды от пользователя, исследуя программу и посылая результаты обратно, где интерфейсная часть отображает их в удобном виде. Пока вы не спеша пролистываете на экране уже дизассемблированный текст - анализатор уходит дальше, и результаты его работы можно наблюдать прямо по ходу дела, когда неопределенная переменная вдруг обретает имя, шестнадцатеричный дамп превращается в текст или таблицу данных. И наоборот - команды преобразования адресов или типов данных тут же передаются анализатору, который соответствующим образом отражает их во всех связанных точках программы. При загрузке программ в форматах Windows и OS/2 - NE, PE, LX - IDA автоматически определяет тип файла (EXE/DLL/VXD и т.п.), находит все DLL, на которые ссылается файл, и загружает для них таблицы входов в виде символических имен. Профессиональная версия - IDA Pro - обладает и вовсе уникальными возможностями: при помощи технологии FLIRT (Fast Library Identification and Recognition Technology) она способна автоматически определять компилятор и служебные библиотеки, использованные при построении программы, и посредством специального набора сигнатур находить в программе стандартные функции из этих библиотек, тут же присваивая им соответствующие имена и атрибуты. Если версия RTL-библиотеки опознана по сигнатуре - в программе уже в самом начале анализа выделяются характерные служебные функции - printf, strcpy, malloc и им подобные. Разбираться в программе с уже найденными основными функциями RTL на порядок проще, чем в совершенно неисследованной. Кроме этого, в последних версиях IDA Pro реализована поддержка локальных переменных, формируемых в стековом кадре - в каждой функции анализируются обращения к стековому кадру через BP/EBP и создается список переменных в кадре. Эти переменные аналогичны обычным статическим переменным, и с ними могут работать все операции IDA - смена имени, типа данных, создание ссылки и т.п. IDA также поддерживает структуры - заранее описанный формат структуры можно привязать к переменной, и тогда IDA будет трактовать все адреса в заданном диапазоне, как поля указанной структуры - и именованные константы (enums), имена которых могут отображаться вместо числовых констант с заданными значениями. Для программ на C++ выполняется восстановление имен перегруженных функций (demangling). IDA имеет великолепную навигационную систему. Многооконный интерфейс позволяет одновременно наблюдать несколько фрагментов программы - при этом результаты изменений, сделанные в одном из окон, тут же отображаются во всех остальных. Простым нажатием Enter или щелчком мыши на операнде команды или ссылке можно перейти к месту определения операнда, метки или ссылающемуся объекту, оттуда - на другую ссылку, а потом, как угодно далеко углубившись в структуру программы, последовательным нажатием Esc вернуться к исходной точке. Можно перейти к заданной метке/переменной или сегменту, месту модификации сегментного регистра, функции, перекрестной ссылке или закладке - заранее помеченной позиции; можно искать заданное значение операнда, очередной неисследованный или, наоборот, исследованный фрагмент, фрагмент кода или данных, двоичный образец в файле или текстовую строку уже в дизассемблированном представлении (например, поиск "DX, AX" найдет все команды с этими операндами - разумеется, если все кодовые участки в программе полностью проанализированы. Помимо обычных комментариев, которыми можно снабдить каждую строку текста, IDA позволяет вводить так называемые повторяемые, или размножаемые комментарии, которые дублируются во всех строках, ссылающихся к описанному объекту. Например, если такой комментарий задан для переменной или функции, IDA будет отображать его во всех командах, ссылающихся на нее. Для того, чтобы удобно и эффективно приводить в нужный вид дизассемблируемый текст, IDA предоставляет широкий выбор команд редактирования. Наиболее употребительные команды - преобразование фрагмента в код или данные, задание типов переменных и операндов, ввод комментариев и закладок - выполняются нажатием единственной клавиши, для остальных действий предусмотрена удобная система вложенных меню. Пакеты команд можно объединять в макросы, выполняемые затем нажатием единственной клавиши. IDA позволяет чрезвычайно гибко настраивать формат отображения текста на экране, разрешая или запрещая вывод отдельных полей текста - адресов, двоичного дампа, комментариев, списков перекрестных ссылок, разделительных строк, повышающих читаемость текста. Автоматический генератор имен, присваивающий имена адресам, для которых они не были заданы явно, позволяет выбирать более десятка различных форм, включая последовательную нумерацию с возможностью перенумеровки в любой момент. Для ASCII-строк автоматически создаваемые имена могут формироваться из начальных слов самой строки, когда по имени легко догадаться о содержащемся в ней тексте. Поддерживаются также строки в формате UNICODE. Цветовое выделение полей текста улучшает его читаемость и облегчает поиск нужных имен или операндов. Для полноты возможностей предусмотрены даже команды модификации образа, которыми можно подправить исходный файл, тут же наблюдая результаты исправлений в удобном виде. Встроенный C-подобный язык программирования IDC (у меня язык не поворачивается назвать его командным языком, ибо по мощности он почти не уступает ранним версиям полного C), содержащий более двухсот разнообразных функций, позволяет описать любой по сложности алгоритм анализа и обработки программы. В комплекте имеются также готовые IDC-программы - например, для обработки образа AWARD BIOS 4.51 или расшифровки структуры Windows VxD. И наконец - после завершения исследования и "причесывания" программы ее можно вывести во внешний файл - в виде текста, ассемблерного листинга, карты компоновщика (MAP), списка различий исходного и исправленного файла (DIF) и даже исправленной версии исходного файла (EXE). В отличие от пакетных дизассемблеров, эти возможности реально нужны только для печати или перекомпиляции текста, ибо изучать структуру и работу программы несравненно удобнее в самой IDA, нежели по сгенерированному ею тексту. В ранних версиях IDA функции вывода блокировались до ввода регистрационного ключа, и многие обладатели незарегистрированных версий сильно комплексовали по этому поводу; мне же за три года обладания честно оплаченным ключом всего дважды потребовалось вывести фрагменты текста в файл, и то - для их отправки в телеконференции. Для всех программ, исследованием которых мне приходится заниматься, я храню только базы данных IDA - как наиболее информативное представление их структуры. Единственное, на мой взгляд, полезное применение функций вывода при чистом исследовании программ, не сопряженном с их модификацией - формирование карты компоновщика, из которой утилита TDMAP может сделать файл с отладочной информацией для Turbo Debugger, после чего по программе можно лазить и в TD, пользуясь символическими именами вместо адресов. IDA работает под DOS, Windows 95/NT и OS/2. Для нее существует набор разработчика (SDK), позволяющий создавать дополнительные модули - дизассемблирования файлов для новых процессоров, загрузки модулей особой структуры, внесения дополнительного интеллекта и т.п. Существуют также утилиты для построения файлов сигнатур (FLAIR - Fast Library Acquisition for Identification and Recognition) и генерации списков входных точек для файлов форматов NE/LE/LX/PE. В заключение можно сказать, что IDA, помимо исполняемых файлов для процессоров x86 под DOS, Windows и OS/2, может дизассемблировать код для процессоров Intel 8080, 860, 8051, Motorola 680x0, 6502, 6301, 6810, DEC PDP-11, а также модули NLM, библиотечные, архивные и объектные файлы, модули JAVA. О существовании в мире другого программного продукта, хотя бы близкого по возможностям к IDA, мне неизвестно. Информация об IDA доступна на www.idapro.com и www.datarescue.com (почтовый адрес - ida@datarescue.com). Там же можно взять демонстрационную версию IDA Pro, в которой сохранена вся функциональность полной, за исключением запрета на загрузку существующих баз данных, обработки файлов более 64 кб и записи результатов в файл. Упрощенная бесплатная версия доступна на www.simtel.com/pub/simtelnet/msdos/disasm. Евгений Музыченко, eugene@muzychenko.net Динамически подключаемые библиотеки (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 //-------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "useDllU1.h" #pragma package(smart_init) #pragma resource "*.dfm" #pragma link "createDllP1.lib" TForm1 *Form1; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { bool buff; Label1->Caption=AnsiString(AreturnValue(buff)); Label2->Caption=AnsiString(BreturnValue(buff)); Label3->Caption=AnsiString(CreturnValue(buff)); } //--------------------------------------------------------- //Пример явной динамической компоновки DLL #include <vcl.h> #pragma hdrstop #include "dll_cb_u.h" //-------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; HINSTANCE hinst; 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). АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC Под редакцией Еpшова В.Г. ОГЛАВЛЕНИЕ ========== Предисловие переводчика Предисловие 1. Введение в семейство персональных компьютеров IBM PC Введение Биты и байты ASCII код Двоичные числа Шеснадцатеричное представление Сегменты Регистры Архитектура персональных компьютеров Основные положения на память Вопросы для самопроверки 2. Выполнение программы Введение Начало работы Просмотр памяти Пример машинных кодов: непосредственные данные Пример машинных кодов: определенные данные Машинная адресация Пример машинных кодов: определение размера памяти Свойства отладчика Основные положения на память Вопросы для самопроверки 3. Формат языка ассемблера Введение Комментарии Формат кодирования Псевдокоманды Указатели памяти и регистров Инициализация программы Пример исходной программы Основные положения на память Вопросы для самопроверки 4. Ассемблирование и выполнение программы Введение Ввод программы Подготовка программы для выполнения Ассемблирование программы Компановка загрузочного модуля Выполнение программы Пример исходной программы Файл перекрестных ссылок Основные положения на память Вопросы для самопроверки 5. Определение данных Введение Псевдокоманды определения данных Определение байта (DB) Определение слова (DW) Определение двойного слова (DD) Определение "четверного" слова (DQ) Определение десяти байт (DT) Непосредственные операнды Псевдокоманда (директива) EQU Основные положения на память Вопросы для самопроверки 6. Программные COM-файлы Введение Различия между EXE- и COM-файлами Пример COM-файла COM-стек Отладка Основные положения на память Вопросы для самопроверки 7. Логика и организация программы Введение Команда JMP Команда LOOP Флаговый регистр Команды условного перехода Процедуры и вызовы (CALL) Стековый сегмент Программа: команды длинной пересылки Логические команды: AND, OR, XOR, TEST, NOT Программа: изменение нижнего и верхнего регистров Сдвиги и ротация Организация программы Основные положения на память Вопросы для самопроверки 8. Работы с экраном I: Основные возможности Введение Команда прерывания: INT Установка курсора Очистка экрана Команды экрана и клавиатуры: Базовая DOS Ввод на экран: стандарт DOS Программа: Ввод набора ASCII символов Ввод с клавиатуры: Базовая DOS Программа: Ввод имен с клавиатуры и вывод на экран Команды экрана и клавиатуры: Расширенная DOS Вывод на экран: Расширенная DOS Ввод с клавиатуры: Расширенная DOS Использование CR, LF, TAB для вывода на экран Основные положения на память Вопросы для самопроверки 9. Работа с экраном II: Расширенные возможности Введение Байт атрибутов Прерывания BIOS Программа: мигание, видеореверс, скроллинг Расширенные ASCII коды Другие команды ввода/вывода DOS BIOS INT 16H для ввода с клавиатуры Дополнительные функциональные клавиши Основные положения на память Вопросы для самопроверки 10. Работа с экраном III: Цвет и графика Введение Текстовый (алфавитно-цифровой) режим Графический режим Режим средней разрешающей возможности Программа: Установка цвета и графического режима Основные положения на память Вопросы для самопроверки 11. Обработка строк Введение Особенности команд обработки строк REP: Префикс повторения строки MOVS: Пересылка строки LODS: Загрузка строки STOS: Сохранение строки CMPS: Сравнение строк SCAS: Сканирование строки Сканирование и замена Альтернативное кодирование Дублирование шаблона (образца) Программа: Выравнивание справа при выводе на экран Основные положения на память Вопросы для самопроверки 12. Арифметика I: Обработка двоичных данных Введение Сложение и вычитание Беззнаковые и знаковые данные Умножение Сдвиг регистров DX:AX Деление Преобразование знака Процессоры Intel 8087 и 80287 Основные положения на память Вопросы для самопроверки 13. Арифметика II: Обработка ASCII и BCD данных Введение ASCII формат Двоично-десятичный формат (BCD) Преобразование ASCII формата в двоичный формат Преобразование двоичного формата в ASCII формат Сдвиг и округление Программа: Расчет зарплаты Основные положения на память Вопросы для самопроверки 14. Обработка таблиц Введение Определение таблиц Прямой табличный доступ Поиск в таблице Команда перекодировки (трансляции) (XLAT) Программа: Вывод шестнадцатеричных и ASCII кодов Программа: Сортировка элементов таблицы Операторы TYPE, LENGTH и SIZE Основные положения на память Вопросы для самопроверки 15. Дисковая память I: Организация Введение Объем диска Каталог Таблица распределения файлов (FAT) Основные положения на память Вопросы для самопроверки 16. Дисковая память II: Функции базовой DOS Введение Управляющий блок файла: FCB Использование FCB для создания дискового файла Программа: FCB для создания дискового файла Последовательное чтение дискового файла Программа: FCB для чтения дискового файла Прямой доступ Программа: Прямое чтение дискового файла Прямой блочный доступа Программа: Прямое чтение блока Абсолютный дисковый ввод/вывод Другие возможности Программа: Выборочное удаление файлов Основные положения на память Вопросы для самопроверки 17. Дисковая память III: Функции расширенной DOS Введение Строка ASCIIZ Номер файла и коды возврата по ошибкам Создание дискового файла Программа: Использование номера для чтения файла ASCII файлы Другие функции расширенной DOS Основные положения на память Вопросы для самопроверки 18. Дисковая память IV: Команды ввода/вывода BIOS Введение Дисковые команды BIOS Байт состояния Программа: Использование BIOS для чтения секторов Основные положения на память Вопросы для самопроверки 19. Печать Введение Управляющие символы для печати Использование расширенной DOS для печати Программа: Постраничная печать с заголовками Печать ASCII файлов и управление табуляций Печать с использованием базовой DOS Специальные команды принтера Печать с использованием BIOS INT 17H Основные положения на память Вопросы для самопроверки 20. Макрокоманды Введение Простое макроопределение Использование параметров в макрокомандах Комментарии Использование макро внутри макроопределения Директива LOCAL Подключение библиотеки макроопределений Конкатенация (&) Повторение: REPT, IRP и IRPC Условные директивы Директива EXITM Макрокоманды, использующие IF и IFNDEF условия Макрокоманды, использующие IFIDN условие Основные положения на память Вопросы для самопроверки 21. Связь между подпрограммами Введение Межсегментные вызовы Атрибуты EXTRN и PUBLIC Программа: Использование EXTRN и PUBLIC для меток Программа: Использование PUBLIC в кодовом сегменте Программа: Общие данные в подпрограммах Передача параметров Связь Бейсик-интерпретатор - ассемблер Связь Паскаль - ассемблер Связь C - ассемблер Основные положения на память Вопросы для самопроверки 22. Загрузчик программ Введение COMМAND.COM Префикс программного сегмента Выполнение COM-программы Выполнение EXE-программы Пример EXE-программы Функция загрузки или выполнения программ 23. BIOS и DOS прерывания Введение Обслуживание прерываний BIOS прерывания DOS прерывания Функции DOS INT 21H Резидентные программы Порты Генерация звука 24. Справочник по директивам ассемблера Введение Индексная память Команды ассемблера Директивы ассемблера 25. Справочник по командам ассемблера Введение Обозначение регистров Байт способа адресации Двухбайтовые команды Трехбайтовые команды Четырехбайтовые команды Команды в алфавитном порядке Приложения 1. ASCII коды 2. Шестнадцатерично-десятичные преобразования 3. Зарезервированные слова 4. Режимы ассемблирования и компановки Ответы на некоторые вопросы ЯЗЫК МАКРОАССЕМБЛЕРА IBM PC (Справочное пособие) Составитель: В.Н.Пильщиков (МГУ, ВМК) ГЛАВА 1. ОСОБЕННОСТИ ПК. ВВЕДЕНИЕ В MASM. 1.1. ОПЕРАТИВНАЯ ПАМЯТЬ. РЕГИСТРЫ. 1.2. ПРЕДСТАВЛЕНИЕ ДАННЫХ. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ 1.3. ПРЕДСТАВЛЕНИЕ КОМАНД. МОДИФИКАЦИЯ АДРЕСОВ. 1.4. СЕГМЕНТИРОВНИЕ 1.5. ПЕРЕХОДЫ 1.6. СТРОКОВЫЕ ОПЕРАЦИИ 1.7. СТЕК. ПОДПРОГРАММЫ. Полные статьи тут:http://ifolder.ru/19892288http://narod.ru/disk/26406306000/asm.rar.html А теперь самое интересное немного теории и практики: В описании STALKER Зов Припяти есть такая строчка Цитата Оперативная память: 768 Mб Это ессесно в минимальных,а в оптимальных 2 гигабайта.Бывает так,что на слабых компах глючит,поведую как сделать,так что и на 512 нормально бегал. Во всех сталкерах сделано так, использование оперативной памяти до упора, что иногда и вызывает тормоза,что за это отвечает? Многие не поверят пока не проверят,а ведь отвечает за это всего две буквы Ex. Думаю теории хватит, приступим к практике. Ну вот пожалуй и самое интересное...Практика. И так начнёмс... Для начала сделайте копию файла xrEngine.exe или ХR_3DA.exe(смотря на что делаете, ЗП , ЧН или ТЧ) Первое качаем WinHex(ссылка в шапке) или открываем любой другой Hex-редактор. Открываем файл,если делаем на ЗП то это - xrEngine.exe , а если на ЧН- xrEngine.exe , а вот на Тень Чернобыля XR_3DA.exe. Открыли и что Мы видим?Каие-то циферки и буковки,про это сразу забываем и изаем поиск,в поиск вбиваем GlobalMemoryStatusEx и ждём пока он найдёт. Вот нашли мы эту строку и что дальше?А вот теперь смотрим на те циферки , выделяем окончание Ех у GlobalMemoryStatusEx выделилось как вы заметили не только Ех но и ещё 4 цифры , вот теперь это нужно удалить , те цифры которые были выделены заменяем нулями, то есть вот так У вас выделились цифры 45 78 их заменяем нулями 00 00 Вот и всё, сохраняем. Запускаем игру и смотрим, игра больше не тормозит у кого тормозила. Цитата(Kolmogor) Вот исходники доработок для ЗП , в том числе и машинки: http://www.sendspace.com/file/3bo9xx Инструкция по изменению плотности травы. Параметр меньше 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. Я думаю что вы сможете его изменить сами если нужно будет. Там все элементарно. Огромное спасибо Kolmogor'у и malandrinus'у. Если бы не они, я бы ничего не сделал. Спасибо вам еще раз. Спасибо и Ролану, с которым я очень много беседовал и тоже узнал много чего. 5 5 4 Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 5 Октября 2010 _Призрак_, хм...Странно,значит остаётся 2 варината,декомпиляция или где-то что-то в скриптах,но точно я в этом не уверен.Подождём ответов профи. P.S.Поговорю с одним человеком,может знает Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 5 Октября 2010 (изменено) Мне тут мысль реально бредовая в голову пришла...короче значение выставлено 5 , а если к примеру выставить в конфигах костюма 6 ? Думаю так же ничего не произойдёт,в ТЧ можно было так,ну любой костю вешай столько сколько укажешь и ведь всё это видно,а может мы просто не видим этого 6 слота?Может он тупо в xml файле не сделан?Не задумывались? Изменено 5 Октября 2010 пользователем Rolan Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 5 Октября 2010 Серый Волк, Можно на это чудо посмотреть?Ну хотя бы скрином. Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 5 Октября 2010 goust, Возможно он у тебя открыт ещё где-то помимо hex-редактора. Серый Волк, тут дело странное...Да, у тебя они на кнопки забиндены? Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 5 Октября 2010 iDreD, Хм...Нереально говоришь?Хех, ну тогда....Через движок чтоль? Ну не знаю,если кому нужно, могу приложить коды клавишь клавиатуры. Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 26 Октября 2010 (изменено) Еху!Я вернулся!Чтож отвечу на вопросы: Министр-нет ассемблер я не знаю,но если приспичит выучу.Чел добрей быть надо :ny_z_1: ! На счёт темы про протектор: Лично я на стороне Сабира , цитирую кое-что из моей личной переписки с одним очень хорошим человеком : А верить надо той информации, которая подкреплена действительностью, а именно, получилось у кого-нибудь реально файлы движка отредактировать так как ему вздумается? Нет. Почему не получается, хотя спецов в этом вопросе не мало? Потому что файлы движка защищены от редактирования. А как можно защитить контент? Протектором. А что такое протектор? Либо программа, либо метод защиты. Что применили в движке? Метод - поэтому и не видят слепые следов протектора. Плюс ко всему, как сказал (не буду называеть его имя), многие фишки движка запакованы - поэтому IDA и выдает ошибки декомпиляции, потому что не может программа (она и не предназначена для такого) распаковать функции. Есть выход из ситуации? Есть. Надо сначала продэбажить файлы движка и только потом декомпилить. Такая вот кулинария. Так что любая информация может быть проверена только фактами. malandrinus, Kolmogor, ну,а теперь что скажете? P.S. Кстати, Колмогор, давно наблюдаю за твоей активностью - туманный ты человече и с загадками.- полностью ссогласен! Чуть позже,может завтра добавлю в шапку все туторы что тут выложены. Добавлено через 10 мин.: P.S. Как начну обновлять шапку выложу и xrGame исходный Изменено 26 Октября 2010 пользователем Rolan 1 Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 26 Октября 2010 Kolmogor, и что *.cpp файлики редактировал?Можешь показать хоть что-нибудь?Уж больно интересно Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 26 Октября 2010 Kolmogor, Извиняюсь,мальнеко не правильно выразился.Хоть какой-нибудь работы исходник,машинок например? Пусть и люди учатся. Добавлено через 12 мин.: Может у кого-нибудь талант скрытый откроется.Так что выкладываем не стесняемся. Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 26 Октября 2010 Kolmogor, Обновил\Добавил в шапку Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 26 Октября 2010 Министр, И вообще я добрый и пушистыйЯ тебе верю это не исходникразрешат,выложу,увидишь Хех,пойду Колмогору паранойю развивать :rofl2: :D Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 27 Октября 2010 malandrinus, Выложу с разрешения админов ибо тут Шкипер писал 2. Огромная проблема : Сталкер - это не Open Source, поэтому подобные действия - криминал ... Так что только, с разрешения. Добавлено через 357 мин.: malandrinus, _Призрак_, но всё же,проблем после не охото.открою голосование Добавлено через 19 мин.: malandrinus, Не веришь что у меня есть? Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 27 Октября 2010 _Призрак_, Может тутор забацаешь?Интересно на это будет глянуть Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 27 Октября 2010 Вот он , xrGame от ЗП на сцене! Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 27 Октября 2010 C2D, Мы,добрый дядька Колмогор не фигурировал. Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 27 Октября 2010 _Призрак_, Добавил в шапку. Очень хорошая статья получилась. Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 4 Ноября 2010 (изменено) Kolmogor, пока что нет ибо времени не хватает да же на разработку Путь Разведчика . Но если приспичит забацаем P.SюВсех с прошедшим Хэллоуином! Изменено 4 Ноября 2010 пользователем Rolan Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 5 Ноября 2010 SibireaStalker, в настройках глянь Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 5 Ноября 2010 Народ,а кто-нибудь знает как поменять значения фаер мода А на худе на AUTO ? Поделиться этим сообщением Ссылка на сообщение
Rolan 22 Опубликовано 5 Февраля 2011 но некий strchi и ролан говорят что компилили... Ха не знаю как strchi, но Ролан такого не делал и не надо тут враки распускать. Поделиться этим сообщением Ссылка на сообщение