Перейти к содержанию
Авторизация  
VoLT

Вызов процедур из игр написанных на Delphi

Рекомендуемые сообщения

Далеко не всё можно реализовать изменением каких либо значений, например добавление в игру определённого оружия, или скажем каких либо игровых бонусов, а иногда в разы проще реализовать через процедуры игры.

И так мной была написана DLL работоспособная на Космических рейнджерах 2: Перезагрузка которая добавляет текст в игру используя процедуры в игре :closeyes:

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);
}

woweg.th.png

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

PS поскольку fastcall в Delphi и C++ отличается как хлеб и рама пришлось использовать обёртку - процедуру _call которая выполняет вызов процедур таким образом как это принято в Delphi

PSS для компиляции требуется MinGW например можно заюзать Code::Blocks.

PSSS чудную вставку на MSVC++ можно написать путём goto и меток

PSSSS данным способом можно изголятся так же и на играх написанных на Borland C++

  • Плюс 2

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


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

О, не плохо. Если ты сам написал описание "_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;
}

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.