Перейти к содержанию

Вызов процедур из игр написанных на 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;
}

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

×
×
  • Создать...

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

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