VoLT Опубликовано 10 июля, 2011 Поделиться Опубликовано 10 июля, 2011 Далеко не всё можно реализовать изменением каких либо значений, например добавление в игру определённого оружия, или скажем каких либо игровых бонусов, а иногда в разы проще реализовать через процедуры игры. И так мной была написана DLL работоспособная на Космических рейнджерах 2: Перезагрузка которая добавляет текст в игру используя процедуры в игре void AddMsg(){ BSTR bstr = SysAllocString(L"Галактика в опасности!"); int curtime = *(DWORD *)(*(DWORD *)(*(DWORD *)(0x007058D0))+0x48); // в CE 0x007058D0+0x48 //данный способ универсален можно расписать до сколь угодно глубокого вложения _call(0x006B67BC, 3, 7, curtime, bstr); // первый параметр адрес второй количество параметров остальное параметры DWORD *screens = *(DWORD **)(0x007056BC); BYTE index = *(BYTE *)(*(DWORD *)(0x00705DA8)); DWORD curscreen = *(DWORD *)(screens[index]+0xB8); // поверьте в отладчике, при поиске сего чуда, код выглядит страшнее ) // как реализовать его в CE без скрипта мне не довелось узнать _call(0x006A6374, 1, curscreen); SysFreeString(bstr);}За сим всё, получилось несколько сумбурно, но исходные коды должны расказать большее, их можно скачать тутPS поскольку fastcall в Delphi и C++ отличается как хлеб и рама пришлось использовать обёртку - процедуру _call которая выполняет вызов процедур таким образом как это принято в DelphiPSS для компиляции требуется MinGW например можно заюзать Code::Blocks.PSSS чудную вставку на MSVC++ можно написать путём goto и метокPSSSS данным способом можно изголятся так же и на играх написанных на Borland C++ 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 10 июля, 2011 Поделиться Опубликовано 10 июля, 2011 О, не плохо. Если ты сам написал описание "_call()", то даже я не знал про то, что так можно динамически определять аргументы функции... // как реализовать его в CE без скрипта мне не довелось узнать _call(0x006A6374, 1, curscreen);Это можно реализовать и на автоассемблере, и на Lua, и на том и другом вместе. Я подумаю как сделать удобнее... Возможно стоит просто вызывать AddMsg() из скриптов CE по горячим клавишам... посмотрим.-------------Кстати по той же теме, может кому будет полезно, мой набросок одной инъекции. Её предназначение сохранять базу данных из одного формата в другой в файл. Код не был доработан, но можно понять что делать чтобы сохранить что-то и как-то в файл.// dllmain.cpp: определяет точку входа для приложения DLL.#include "stdafx.h"void AddRecord(ofstream *DBFile, long int i, char name[], char cheat[]){ *DBFile << " <Names>\n"; *DBFile << " <Key>"<< i << "</Key>\n"; *DBFile << " <Name>"<< name <<"</Name>\n"; *DBFile << " </Names>\n"; *DBFile << " <Cheats>\n"; *DBFile << " <Key>"<< i << "</Key>\n"; *DBFile << " <Cheat>"<< cheat << "</Cheat>\n"; *DBFile << " </Cheats>\n";}void Code(){ ofstream DBFile; DBFile.open ("D:\\DB.txt"); if (DBFile.is_open()) { cout << "Files opens:\n\n"; DBFile << "<?xml version=\"1.0\" standalone=\"yes\"?>\n<DataSet1 xmlns=\"http://tempuri.org/DataSet1.xsd\">\n"; _asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop } long int maxCount = 50; for(long int i=0; i < maxCount; i++) { char name[100] = "Name"; char cheat[100] = "Cheats"; AddRecord(&DBFile, i, name, cheat); } DBFile << "</DataSet1>"; DBFile.close(); } else cout << "Unable to open file\n\n";}BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;} Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения