#1 16-03-2018 20:45

zorin_chel
From: Челябинск
Registered: 27-09-2010
Posts: 18
Website

Как внедрить мини-игру в exe

Кто может помочь сделать такую вещь: в GTA SA нужно вместо стандартной мини-игры внедрить любую другую (например "сапер", шахматы или типа того), есть вот такой код GTA SA main menu Stalker Theme

#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm")

using namespace std; 
 
DWORD WINAPI GtaSA_thread (LPVOID);
 
 
 
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved)
 
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return true;
}
 





DWORD WINAPI GtaSA_thread (LPVOID)
{
	DWORD*var = (DWORD*)0xBA68A5; 
    for (;;Sleep (100))

    {  
		
		if (*var != 0x00000022)
		{        
	                PlaySound("C:\\Games\\GTA2\\sound.WAV", NULL, SND_ASYNC);

		}           
                      
	}   
		            

}

проигрывает музыку из папки C:\\Games\\GTA2 - нужно что-то вроде этого

Last edited by zorin_chel (17-03-2018 06:03)

Offline

#2 16-03-2018 20:50

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Как внедрить мини-игру в exe

zorin_chel wrote:

Кто может помочь сделать такую вещь: в GTA SA нужно вместо стандартной мини-игры внедрить любую другую

zorin_chel wrote:

проигрывает музыку из папки C:\\Games\\GTA2 - нужно что-то вроде этого

Что?

Стандартные мини-игры - это scm-скрипты. Т.е. для их редактирования надо менять main.scm.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#3 17-03-2018 05:37

zorin_chel
From: Челябинск
Registered: 27-09-2010
Posts: 18
Website

Re: Как внедрить мини-игру в exe

Мне нужно вместо scm-скрипта "врезать" exe поток другой игры, т.е. я через базу адресов найду адрес который запускает scm-скрипт мини-игры и его нужно подменить, чтобы запускалось окно с другой игрой. Должно выглядеть вот так:
https://yadi.sk/i/UBkABtTy3TTemx
https://yadi.sk/i/Y6eYfvAF3TTepi

Last edited by zorin_chel (17-03-2018 06:04)

Offline

#4 05-10-2018 18:27

zorin_chel
From: Челябинск
Registered: 27-09-2010
Posts: 18
Website

Re: Как внедрить мини-игру в exe

пока получилось вот что

#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#include <tlhelp32.h>
#pragma comment(lib, "winmm")

using namespace std; 
 
DWORD WINAPI GtaSA_thread (LPVOID);
 
 
 
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved)
 
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return true;
}
 








DWORD WINAPI GtaSA_thread(LPVOID)

{




	for (;; Sleep(1000))
	{
		if (GetAsyncKeyState(VK_NUMPAD0) & 0x8000)

		{

			ShellExecute(NULL, "open", "c:\\GSR_1.5\\GAMES\\MK4\\MK4.exe", NULL, NULL, SW_SHOWNORMAL);






		}


	}
}

но работает хреново
https://www.youtube.com/watch?v=3MMbbno18i8

Offline

#5 04-08-2020 14:37

Red_Ender
From: Смоленск
Registered: 28-07-2020
Posts: 40

Re: Как внедрить мини-игру в exe

Ахахах. МК запускаешь?

Offline

#6 12-09-2020 20:42

zorin_chel
From: Челябинск
Registered: 27-09-2010
Posts: 18
Website

Re: Как внедрить мини-игру в exe

получился вот такой код

#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#include <tlhelp32.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9core.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib, "winmm")
#pragma comment(lib, "D3dx9.lib")


LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
	// Register the window class.
	const wchar_t CLASS_NAME[] = L"Sample Window Class";

	WNDCLASS wc = { };

	wc.lpfnWndProc = WindowProc;
	wc.hInstance = hInstance;
	wc.lpszClassName = CLASS_NAME;

	RegisterClass(&wc);

	// Create the window.

	HWND hwnd = CreateWindowEx(
		0,                              // Optional window styles.
		CLASS_NAME,                     // Window class
		L"Learn to Program Windows",    // Window text
		WS_OVERLAPPEDWINDOW,            // Window style

		// Size and position
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

		NULL,       // Parent window    
		NULL,       // Menu
		hInstance,  // Instance handle
		NULL        // Additional application data
	);

	if (hwnd == NULL)
	{
		return 0;
	}

	ShowWindow(hwnd, nCmdShow);

	// Run the message loop.

	MSG msg = { };
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hwnd, &ps);



		FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));

		EndPaint(hwnd, &ps);
	}
	return 0;

	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}





typedef HRESULT(__stdcall* PRESENT9)(IDirect3DDevice9* pDevice, const RECT*, const RECT*, HWND, void*);


PRESENT9 g_D3D9_Present = 0;
BYTE g_codeFragment_p9[5] = { 0, 0, 0, 0, 0 };
BYTE g_jmp_p9[5] = { 0, 0, 0, 0, 0 };
DWORD present9 = 0;
bool indicator = 0;
D3DRECT rec = { 10, 10, 160, 240 }; //menu size
ID3DXFont* m_font = 0;
RECT fontRect = { 10, 15, 120, 120 };
D3DCOLOR fontColor = 0;
D3DCOLOR bkgColor = 0;





void DrawIndicator(void* pDevice)
{
	IDirect3DDevice9* dev = (IDirect3DDevice9*)pDevice; //get the actual D3D-device
	dev->BeginScene();

	if (indicator)

	{
		HDC hdc = GetDC(0);
		RECT rect = { 20, 20, 200, 200 };
		SetTextColor(hdc, RGB(255, 0, 0));
		SetBkMode(hdc, TRANSPARENT);
		SetBkColor(hdc, RGB(0, 255, 0, 0));
		DrawText(hdc, L"Directx Hook", -1, &rect, DT_LEFT);

	

		
		
	//PlaySound(L"H:\\Program Files (x86)\\GTA SA Revision2\\GAMES\\CNN Intro.wav", NULL, SND_ASYNC);
	//Sleep(1000);

	//CreateProcess(L"H:\\Program Files(x86)\\GTA SA Revision2\\GAMES\\CNN Intro.mp4", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
			
	



    }
	


	dev->EndScene();
}

//get the VMT and the hooking functions offsets
void GetDevice9Methods()
{
	IDirect3D9* d3d9_ptr;
	IDirect3DDevice9* pDevice;
	DWORD* vtablePtr;
	D3DPRESENT_PARAMETERS d3dpp;
	static HMODULE d3d9_handle = 0;
	HWND hWnd = CreateWindowExA(0, "STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0);
	d3d9_handle = LoadLibraryA("d3d9.dll");
	d3d9_ptr = Direct3DCreate9(D3D_SDK_VERSION);
	ZeroMemory(&d3dpp, sizeof(d3dpp));
	d3dpp.Windowed = 1;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	IDirect3D9_CreateDevice(d3d9_ptr, 0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
	vtablePtr = (DWORD*)(*((DWORD*)pDevice));
	present9 = vtablePtr[17] - (DWORD)d3d9_handle;
	IDirect3DDevice9_Release(pDevice);
	IDirect3D9_Release(d3d9_ptr);
	FreeLibrary(d3d9_handle);
	CloseHandle(hWnd);
}

HRESULT HookedPresent9(IDirect3DDevice9* pDevice, const RECT* src, const RECT* dest, HWND hWnd, void* unused)
{
	BYTE* codeDest = (BYTE*)g_D3D9_Present; //restore the original Present() bytes
	codeDest[0] = g_codeFragment_p9[0];
	*((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p9 + 1));
	DrawIndicator(pDevice); //draw the menu
	DWORD res = g_D3D9_Present(pDevice, src, dest, hWnd, unused); //place the hook back
	codeDest[0] = g_jmp_p9[0];
	*((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p9 + 1));
	return res;
}

void HookDevice9Methods()
{
	DWORD g_savedProtection_p9 = 0;
	HMODULE hD3D9 = GetModuleHandleA("d3d9.dll"); //get the actual d3d9.dll address
	g_D3D9_Present = (PRESENT9)((DWORD)hD3D9 + present9); //calculate the actual Present() address
	g_jmp_p9[0] = 0xE9; //fill the codecave array ("jmp hooked_present")	
	DWORD addr = (DWORD)HookedPresent9 - (DWORD)g_D3D9_Present - 5; //calculate the hooked Present() address
	memcpy(g_jmp_p9 + 1, &addr, sizeof(DWORD)); //write it into the cave
	memcpy(g_codeFragment_p9, g_D3D9_Present, 5); //save the first 5 (jmp + addr) bytes of the original Present() 
	VirtualProtect(g_D3D9_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p9); //make the code writable\executable
	memcpy(g_D3D9_Present, g_jmp_p9, 5); //write the codecave in the beginning of the original Present()
}

//hooking thread main function
DWORD WINAPI TF(LPVOID)
{
	GetDevice9Methods(); //get the VMT and the offsets
	HookDevice9Methods(); //actually, hook the needed functions	
	return 0;
}

//hotkeys thread main function
DWORD WINAPI KeyboardHook(LPVOID)
{
	while (1)
	{
		if (GetAsyncKeyState(VK_F4))
		{
			indicator = !indicator;
			Beep(500, 200);

		}
		Sleep(100);
	}
	return 0;
}

int _stdcall DllMain(HINSTANCE hInst, DWORD ul_reason_for_call, void* lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH: //if we are attached into the game's process


		CreateThread(0, 0, TF, 0, 0, 0); //start D3D-hooking thread
		CreateThread(0, 0, KeyboardHook, 0, 0, 0); //start hotkeys thread
	}
	return 1;
}

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

Offline

#7 14-09-2020 08:57

Goldfish
From: Псков
Registered: 21-04-2015
Posts: 177
Website

Re: Как внедрить мини-игру в exe

спустя 2 года)

Offline

Board footer

Powered by FluxBB