Rolan

Редактирование движка X-Ray

2 490 сообщений в этой теме

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/19892288
http://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'у. Если бы не они, я бы ничего не сделал. Спасибо вам еще раз.
Спасибо и Ролану, с которым я очень много беседовал и тоже узнал много чего.

 



  • http://www.amk-team.ru/forum/uploads//ratings/bf.gif × 3
  • http://www.amk-team.ru/forum/uploads//ratings/thumb_up.png × 5
  • http://www.amk-team.ru/forum/uploads//ratings/wrench_orange.png × 3

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, раз создали тему, и народ здесь есть, может объявятся мастера программирования, которые реально могут управляться с файлами движка ? А то некоторые вещи без ковыряния .dll ну никак не хотят получаться...

 

P.S.Ненадо тут просить: "мол сделайте то и это"

А вот здесь в корне не согласен !

Действительно программистов обладающих навыками работы на том уровне, чтоб игра работала в дальнейшем без сбоев - единицы. И как, скажите на милость, мне внести задуманные изменения/дополнения в игру, если без редакции движка ну никак не обойтись (пусть и по мелочи совсем, как кажется). И затрачено времени много очень, и сил, и работа почти закончена - бац - тупик - движок - необходимо изменить параметры. А изучать даже основы программирования - процесс небыстрый и с учетом занятости работой и семьёй - года на 2-3 хватит - за это время желание может отпасть, а могут обстоятельства измениться. А мод так и не будет закончен, хотя время и силы потрачены.

И в конце концов - попросить я думаю всегда можно, а вот получить желаемое... дай бог каждому.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну давай Ролан с тобой подумаем вот над каким вопросом. Все знаю что в ЗП кол-во артов на поясе записано в двигателе. Я говорил с колмогором по этому поводу и даже копался в движке но ничего не нашел кроме строку belt и дальше 2 пробела (00 00). Собственно вопрос - где та цифра 5 которая жестоко ограничивает читерство?

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть правленые dll-ки для увелечения плотности травы на r1 и r2.Такое было,дальность прорисовки-не слышал о таком...

Изменено пользователем C2D

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

_Призрак_, хм...Странно,значит остаётся 2 варината,декомпиляция или где-то что-то в скриптах,но точно я в этом не уверен.Подождём ответов профи.

P.S.Поговорю с одним человеком,может знает

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

_Призрак_, Судя по .ltx-файлам, я вижу картину следующую:

 

system.ltx

max_belt = 5 ;16

 

artefact.ltx

belt = true

slot = -1 ;10

 

weapons.ltx

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; AMUNITION

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[ammo_base]:identity_immunities,default_weapon_params

;belt = true;

slot = -1

 

единственное место где фигурирует цифра 5 (реальное кол-во слотов в игре) - system.ltx, а в artefact.ltx - под слоты зарезервировано 11 мест, но -1 под патроны на пояс (но закомментирован) и возможно слот 0 тоже где-то под что-то планировался. То есть разрабы изначально оставили места для увеличения кол-ва мест на поясе (и видимо не только под арты).

Все знают что в ЗП кол-во артов на поясе записано в двигателе. Я говорил с колмогором по этому поводу и даже копался в движке но ничего не нашел кроме строки belt и дальше 2 пробела (00 00). Собственно вопрос - где та цифра 5 которая жестоко ограничивает читерство?

Вопрос: а откуда все знают что кол-во слотов на поясе зашито в движок ? Может так решили потому-что в конфигах или скриптах найти не смогли ? :dash3: ну, а дальше, сарафанное радио...

Может ПЫСы хорошо спрятали, а может мы плохо ищем. Обычно то, чего найти не можешь долго и нудно - на поверхности, смотришь и не замечаешь.

Изменено пользователем Серый Волк

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мне тут мысль реально бредовая в голову пришла...короче значение выставлено 5 , а если к примеру выставить в конфигах костюма 6 ? Думаю так же ничего не произойдёт,в ТЧ можно было так,ну любой костю вешай столько сколько укажешь и ведь всё это видно,а может мы просто не видим этого 6 слота?Может он тупо в xml файле не сделан?Не задумывались?

 

 

Изменено пользователем Rolan

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Rolan, Я уже пробовал по разному, и так тоже: менял во всех кофигах кол-во слотов под арты -результат пока нулевой. С ячейками быстрыми дальше продвинулся: у меня их 8 отображается, но работают реально 4, причем новые задваивают предмет на обе ячейки (старую и новую), когда в новую ячейку его кладешь. даже клавиши новые назначил для новых ячеек - но в этом случае в основном меню игры "ОПЦИИ" не открываются.

 

Наковырял интересную статейку :

Динамически подключаемые библиотеки (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).

 

Изменено пользователем Серый Волк

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах
Серый Волк, Можно на это чудо посмотреть?Ну хотя бы скрином.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я не жадный:

U4ATd4tUcq.jpg

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

Изменено пользователем Серый Волк

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Rolan

А,чё он у меня XR_3DA сохранять не хочет,пишет что файл типа не может быть сохранён :dash3::dash2::wacko:

 

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

goust, Возможно он у тебя открыт ещё где-то помимо hex-редактора.

Серый Волк, тут дело странное...Да, у тебя они на кнопки забиндены?

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах
Rolan, их нереально забиндить на кнопки скриптом. Нужно смотреть родные ячейки и делать на их основе. Изменено пользователем iDreD

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

iDreD, Хм...Нереально говоришь?Хех, ну тогда....Через движок чтоль?

Ну не знаю,если кому нужно, могу приложить коды клавишь клавиатуры.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

iDreD, я забиндил новые ячейки на кнопки через ui_keybinding.xml и после этого меню "ОПЦИИ" перестало открвываться, думаю потому, что они не прописаны в xrGame. Старые 4 ячейки прописаны, и даже описание забинденных кнопок там прописано.

pV5qTXGU43.jpg

 

goust, посмотри по редакторам здесь, у меня без проблем установился и до сих пор работает

 

чем несколько раз в личку, лучше один раз здесь выложу, если народ не против.

xSrjeAsR2t.jpg

Изменено пользователем Серый Волк

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

PavelSnork, этот модик посмотри и скрины его. там увеличена дальность прорисовки вообще всего, может наковыряешь чего интересного.

 

48celt48, что именно выложить?

Изменено пользователем Серый Волк

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну разгрузку какую ты делаеш , кстати а что если сделать все проще увеличить кол-во слотов под арты и этот слот прописать всему крроме оружия тоесть получиться хорощий аналог разгрузки.

 

Извиняюсь.

||

\/

Изменено пользователем 48celt48

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах
кстати а что если сделать все проще увеличить кол-во слотов под арты

А ты попробуй под арты ... :dash3::grin2:

я рассказал только о том, что на данный момент уже получилось, дальше ещё пока ковыряю, как доковыряю - выложу.

Изменено пользователем Серый Волк

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах
Серый Волк, обсуждалось уже тыщу раз - забинтить хотя бы скриптово на Х-рэе можно только клавишу Таb. Для быстрых ячеек ещё хуже, ибо клавиши от F5, F6 и далее не прописаны в хrГейме (?). Поэтому смысла ковырять ячейки только в игре нет.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. Называть файлы лежащие в папке bin движком не правильно - это скомпилированные библиотеки функций движка. Сам движок нам не будет доступен никогда, ну если только кто-нибудь из нас миллионер и не купит у разработчиков.

2. Многие посчитали вид инвентаря ЗП лучшим и красивым. Однако он был изначально сделан не для красоты и удобства, а для затруднения редактирования.

3. Профи действительно есть. Только с какой радости они будут расписывать здесь способы редактирования папки bin.

4. Редактировать ехе и dll Notepadom++ - извините ребята но это дикость, а потом вы еще удивляетесь почему у вас ничего не работает и глючит.

 

 

Изменено пользователем sabir

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!


Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.


Войти

  • Пользователи, читающие эту тему   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.