Динамически подключаемые библиотеки (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
просто для эхтого надо быть талантливым и образованным в даной сфере человеком
Не обязательно, главное стремиться учить и пробывать предпринимать действия к цели.
Тема бред да, забейте вы на те билдовские "фишки". Ну пысы пробовали, пытались - с какого мы должны наступать на их грабли ? Скажите спасибо, тем кто что то делали иделает по востановлению ф-ций вырезаных в сталкере.
Quote
В "Сталкере" всё можно восстановить, и Вы это можите!
Зачем ? - кому нужны баговые фитчи и тд. Так же как и авто в игре было много вырезано не нужного, часть они правильно ,вырезали часть нет. Но большинство - не нужное.
Не обязательно, главное стремиться учить и пробывать предпринимать действия к цели.
Для ковыряния движка сталкера нужно быть талантливым программистом. Но программист это понятие имеющее только 2 значения - "1" и "0", т.е. либо человек программист, либо ему это не дано природой и всё на что он способен - индусский/быдлокод. Все программисты фанкомюнити сталка давно обозначились и либо занимались этим вопросом либо нет. Всем остальным достигнуть хоть каких то результатов на этом поприще не дано, только если рэндомно обнаружить что-то, что маловероятно.
Не надо было быть талантливым, надо просто знать где и что искать. Хексом редактировать? В основном только и этим, автор темы ищи и учи статьи мышха, Криса Касперски. Вам всем уже много раз говорили про host, но как я понял это никто не воспринял серьёзно... Зря, вам дают пинок под зад, а вы смиряетесь - это очень плохо. Пляшите в сторону хоста и пишите модули и всё у вас получиться.
Приходит типа программст-любитель к крутому хакеру: -Вот у меня программка не запускается, где у меня ошибка? -В ДНК!
Так вот, глубокое программирование могут понять те кто
А. Очень умные и усидчивые. Б. "Средне умные" и очень усидчивые. В. Туповатые и угробят пол жизни на какую-то фичу (если будут сами делать).
Так-что проще быть очень умным, а таких мало.
ПЫСы исходников не дадут т.к. у них не запатентованы фичи и их стырят, если ПЫСы выложат исходники. Это утечка интеллектуальной собственности.
Можно помечтать о декомпиляторе для X-RAY, но проще каждому кто сидит в этой теме взять и влезть в код игры - если кому-то это ДАНО, то код поддастся (но не сразу), если кому-то НЕ ДАНО, то нихрена не получится, сколько не ковыряй (может и получится, но нужно без подглядыволок типа "как ты там сделал?" и всё-таки в нормальные сроки).
KazakHD5770, про интелектуальную собственность вы отчасти правы, но всё остальное... какой декомпилятор для X-Ray? Вы о чем? Вам мало дизассемблеров? Что там искать? Всё давно найдено, это IDA - самое первое что должно быть в наборе такого ковырялщика и WinHex, остальное можно искать и скачивать по статьям Криса Касперски и прочих гениев этой индустрии. Шутка старая, но до сих пор актуальная. Нужно просто продумать как получить полный исходный код - это не так уж и трудно как думаю некоторые.
Скачал HEX Editor, за неимением лучшего полез в крякнутый XR_3DA.exe 1.0004, помимо огромного кол-ва всякой билиберды нашёл реальные функции (или знакомые слова? ). Редактировать ясенпень ничего не стал. Да и в экзешнике ещё куча всякого мусора, сначало надо было resource hack'ом распаковать реальный код, а то я в HEX'е увидел картинку, которая вылетает при запуске игры...
И почему эта тема называется "Модификация движка" если тут даже советов полезных нет? Собралось, извиняюсь БЫДЛО (вроде меня), и болтают ни о чём - сидят где-то там, нихрена не знают и пишут "мне кажется это намного проще" - это верх тупости народ.
И не надо на меня гнать что я кого-то оскорбляю - мы все недоросли чтобы что-то вякать про редактирование движка (за исключением наверное нескольких человек).
Интересно посадить ПЫСов за их-же скомпиленные dllки и заставить их модифицировать. Скажем, провести столько-же изменений с движком сколько при разработке ЗП
В этом плане наши всякие "Колмогоры" куда круче ПЫСов (работают с скомпиленными ресурсами), сейчас буду ковыряться в ресурсах дальше, может что накопаю. Вообще это такая глубокая тема, что просто ef e8 e7 e4 e5 f6 (что-то впервые в жизни написал в HEX, а это матюк )
Добавлено (23.11.2011, 23:21) --------------------------------------------- Amicron, а я пошёл не в том направлении Тот ещё, "первооткрыватель" xD Со своим HEX'ом полез в самое ацкое пекло.
KazakHD5770, вы несёте чушь, информации вполне достаточно в интернете. Что искать я уже сказал вам - IDA и всё, там даже есть хекс-редактор свой, так что IDA вполне подойдёт для всего. Ищите уроки по IDA и будет вам счастье.
Добавлено (24.11.2011, 06:44) --------------------------------------------- И вообще разработчикам сталкера просто незачем этим заниматься, у них исходники, да и вообще знаний всего персонала студии хватит что бы в течении месяца, а может быть да же и пол месяца, разобрать бинарники на полные исходники.
Знаний программиста с образованием хватит на то, что бы дизассемблить бинарник.
Quote (dPlayer)
Кому они нужны?
Их не стырят, но будут использовать не по назначению, к примеру нехорошие дяди могут использовать часть кода в смоём и использовать коммерчески, а это уже уголовно наказуемо.
Quote (Хызыр)
Хотя бы выложите что нибудь свое для уверенности
Извините конечно, но такое делатеся обычно не три-четыре минуты, а три-четыре недели, а то и месяцы, а уж если проект серьёзный то на разработку уйдут года. И не думайте если уж это сталкер, то можно сделать что-то за пару часов.
Может кто-нибудь подсказать насчёт визуальных exe-dll редакторов по типу Exe Scope? Ими ещё можно картинку и иконки менять у XR_3DA. Вот допустим открывается не просто код без регистров и строк, как в Хекс-Редакторе, а отдельные библиотеки, разложенные по полочкам. Вообщем довольно удобно. Вы же все типа такие умные, можно узнать у вас, возможно ли редактирование длл-библиотек программами данного типа?
Ещё хотелось-бы поинтересоваться, стоит ли выкладывать большой пак разных экзешников крякнутых для тч с разными новыми иконками, загрузочными картинками и некоторыми отредактированными параметрами?
Вот ещё некоторые модмейкерские команды, редактируя определённые файлы в геймдате любят отредактированные файлы складывать в СВОЮ собственную авторскую папочку, например AAz, amk, amik. arsenal и так далее. Некоторых фалов расположение изменить нельзя. Среди них ui_icons_equipment и другие. Может я могу помочь каким-либо модам разложив файлы такого типа в определённые пути геймдаты по заказу? =)
Если нужно, пишите в эту тему, буду очень рад помочь! Сейчас учу ассемблер, если кому-нибудь интересно поработать вместе со мной с какими-нибудь новыми несложными фишками?
Добавлено (24.11.2011, 20:53) --------------------------------------------- Да и ещё. Забыл обосновать кое-что- расположение и названия файлов я меняю через движок)