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

Вызов функции игры


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

Привет всем :)

Необходимо вызвать функцию из игры через c++ (dll)

сама функция:

code:0061165F loc_61165F:                             ; CODE XREF: code:0061176Fjcode:0061165F                 mov     edx, [ebp+8]code:00611662                 mov     eax, [ebp+0Ch]code:00611665                 movzx   eax, word ptr [eax+edi*2+0Ch]code:0061166A                 mov     eax, eaxcode:0061166C                 push    eaxcode:0061166D                 push    edxcode:0061166E                 mov     eax, [edx]code:00611670                 call    dword ptr [eax+3Ch]code:00611673                 add     esp, 8code:00611676                 cmp     eax, 0code:00611679                 jge     short loc_611680code:0061167B                 jmp     loc_611769

три параметра принимает x y text

помогите пожалуйста :C

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

/*---------------------------------------------------------------------------*/

 

Привет!

 

Раз ты в dll, то это сильно облегчает задачу, потому что засунув в игру эту 

самую dll, ты получаешь доступ к адресному пространству игры. Если адрес 

инструкции статический и своего положения не меняет, то ты просто берешь и 

используешь [inline-assembler] (псевдокод в данном примере):

 

__asm:

   push arg1

   push arg2

   call myfuncaddr

 

Просто так, само собой, тебе игра не даст выполнить этот код, поэтому у тебя 

как минимум пара вариантов - сделать стандартную инъекцию кода (рекомендую!) 

или записать все это дело в память (побайтно) и затем сделать новый поток, 

выдав ему адрес памяти, куда ты записал эти инструкции. Работа с игровыми 

функциями - вообще достаточно муторное дело, я планирую записать об этом урок 

или написать статью.

 

/*---------------------------------------------------------------------------*/

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

хм сейчас попробую, я собираюсь использовать функции игры вместо d3d hook для создания меню :D

Не понял, что здесь смешного.

Перехватывай через vTable - EndScene (DX 9, если не ошибаюсь индекс в vTable будет 42) либо Present (DX 10, 11, индекс Present загуглишь сам думаю) и перед тем как вернуть управление оригинальной функции рисуй своё меню, всё просто.

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

нее) я имею ввиду без d3d9 и т.д

просто используя api игры

Тогда реверс инжиниринг тебе в помощь) Ну или SDK по игре (если такой имеется).

 

Касательно твоего основного вопрососа.

Описываешь указатель на функцию и потом просто через указатель вызываешь функцию.

Вот кусок кода из моего проекта, возможно тебе поможет:

typedef void (__thiscall IRenderer::*func)(); // тип мембер-функции интерфейса IRendererfunc origDraw = 0; // указатель на функциюIRenderer* render = 0; // указатель на экземпляр класса IRendererHINSTANCE hDLL = 0;DWORD* ReadPtr(DWORD base, DWORD offset){	return *(DWORD**)(base + offset);}void HookedDraw(void){        // рисуем что хотим	render->TextToScreenColor(1, 1, 255, 0, 0, 255, "Hello world!\nThis is IRenderer::Update hook!");	//printf("HookedDraw!\n");	(render->*origDraw)(); // но не забываем вернуть управление оригинальной функции}void vTableHook(DWORD* vTable, short index, DWORD value){	DWORD oldProt = 0;	VirtualProtect(vTable, index * 4, PAGE_READWRITE, &oldProt);	vTable[index] = value;	VirtualProtect(vTable, index * 4, oldProt, &oldProt);}DWORD WINAPI Thread(LPVOID){	CreateConsole();	DWORD* ptr = ReadPtr((DWORD)GetModuleHandleA("CryGame.dll"), 0x00118564);	DWORD* ptr2 = ReadPtr((DWORD)ptr, 0x48);	CXGame* game = (CXGame*)ptr2; // получили указатель на главный класс игры	ISystem* sys = game->GetSystem(); // получили указатель на основную подсистему игры	render = sys->GetIRenderer(); // получили указатель на рендерер игры	DWORD* vTable = *(DWORD**)render; // получили указатель на vTable экзепляря класса IRenderer	origDraw = (func&)vTable[15]; // получили указатель на оригинальную функцию отрисовки (IRenderer::Update)	vTableHook(vTable, 15, (DWORD)HookedDraw); // подменяем указатель оригинальной IRenderer::Update на нашу HookedDraw	getch(); // ждем пока в консоли нажмут любую клавишу	vTableHook(vTable, 15, (DWORD&)origDraw); // снимаем хук	FreeConsole(); // закрываем консоль	FreeLibraryAndExitThread(hDLL, 0); // выгружаем DLL и завершаем поток	return 0;}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){	if (fdwReason == DLL_PROCESS_ATTACH)	{		hDLL = hinstDLL;		DisableThreadLibraryCalls(hinstDLL);		CreateThread(0, 0, Thread, 0, 0, 0);	}	return 1;}

 

Вообще загугли все это, как вызывать функции на Си через указатели, вот здесь неплохо расписано - http://amse.ru/courses/cpp2/2011_04_11.html .

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

Тогда реверс инжиниринг тебе в помощь) Ну или SDK по игре (если такой имеется).

Реверс-инженеринг? Я просто видел кое что подобное... В чите на PayDay2. Это было гениально! Они перехватили функцию игры, которая выдает сообщения. Тем самым, сделали очень красивое меню) Плюс, там была функция: пополнить боезапас, восстановить жизни и броню и все такое. Когда нажимаешь хоткей - такая приятная надпись вылетает, боеприпасы пополнены) Видно, что игровая функция))

Можно поподробней, как это осуществить?)

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

У меня будет видеоурок на эту тему. Ожидайте. (:

 

keng очень жду твоих интересных уроков. Дай боже тебе сил, здоровья и желания все это сделать. 

 

P.S.: а какие были твои 2 уроки, которые ютуб запретил?

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

keng очень жду твоих интересных уроков. Дай боже тебе сил, здоровья и желания все это сделать. 

 

P.S.: а какие были твои 2 уроки, которые ютуб запретил?

ютуб запретил уроки Кенга?

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

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

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

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