#1 Re: Работа с памятью, EXE » Как внедрить мини-игру в exe » 12-09-2020 20:42

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

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

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

#2 Re: Работа с памятью, EXE » Как внедрить мини-игру в exe » 05-10-2018 18:27

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

#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

#3 Re: Работа с памятью, EXE » Как внедрить мини-игру в exe » 17-03-2018 05:37

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

#4 Работа с памятью, EXE » Как внедрить мини-игру в exe » 16-03-2018 20:45

zorin_chel
Replies: 6

Кто может помочь сделать такую вещь: в 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 - нужно что-то вроде этого

#5 Re: Справочная информация » Работа с компонентами машины » 25-11-2015 17:24

я заменил на 01DC, т.е. rustler, ни к чему не привело

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

void CreateConsole ()

{
int hConHandle = 0;
HANDLE lStdHandle = 0;
FILE *fp = 0;
AllocConsole ();
SetConsoleTitle ("ID   ");
lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT);
fp = _fdopen (hConHandle, "w");
*stdout = *fp;
setvbuf (stdout, NULL, _IONBF, 0);
}




int* ReadPointer (DWORD base, int offsets [], int level)

{
	int* pointer = (int*)base;
	for (int i = 0; i < level; i++)
	{
		pointer = (int*)(*pointer + offsets[i]);
		printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer);
	}
	return pointer;
}

void MEMwrite(void *adr, void *ptr, int size)
{
DWORD OldProtection;
VirtualProtect(adr,size,PAGE_EXECUTE_READWRITE, &OldProtection);
memcpy(adr,ptr,size);
VirtualProtect(adr,size,OldProtection, &OldProtection);
}

DWORD WINAPI GtaSA_thread (LPVOID)

{
	int* pointer0 = 0;
	DWORD base = 0xBA18FC;
	int offsets[1] = { 0x00 };
	pointer0 = ReadPointer (base, offsets, 0);

    

	DWORD*var =  (DWORD*)(0x6CC3B2);
	DWORD*var2 = (DWORD*)(0x6C9103);
    DWORD*var3 = (DWORD*)(0x406AF3);
	DWORD*var4 = (DWORD*)(0x6c9690);
	DWORD*var5 = (DWORD*)(0x6C9F1C);
    DWORD*var6 = (DWORD*)(0x6C8F10);
	DWORD*var7 =  (DWORD*)(0x6d9c06);
	DWORD*var8 =  (DWORD*)(0x6cd78a);   
	


    CreateConsole ();
    for (;;Sleep (100))
	{


		if (*pointer0)

		{

		 int offsets[2] = { 0x384, 0x00 };
            

		 int* pointer = 0;
	   	 pointer = ReadPointer (base, offsets, 2);


	
		
		
		       if (*pointer == 188)
			   {

				   *var  = 0x01DCF981;
				   *var2 = 0x01DC227E;
				   *var3 = 0x01DC227E;
                   *var4 = 0x01DC227E;
                   *var5 = 0x01DC3D66;
                   *var6 = 0x01DCFF81;
				   *var7 = 0x01DC227E;
				   *var8 = 0x01DCB800;


	//			MEMwrite ((void*)(adr), (void*)"1", 1);
	//			MEMwrite ((void*)(adr2), (void*)"1", 1);
			
			   }else

			   {
			       *var  = 0x0208F981;
				   *var2 = 0x0208227E;
				   *var3 = 0x0208227E;
                   *var4 = 0x0208227E;
                   *var5 = 0x02083D66;
                   *var6 = 0x0208FF81;
				   *var7 = 0x0208227E;
				   *var8 = 0x0208B800;
			   }

		}

	
	}


}

результат: у rustlera появляются все функции hydra, в.ч. работающие (поворачивающиеся) сопла, вертикальный взлет/посадка, но шасси не работают

#6 Re: Справочная информация » Работа с компонентами машины » 20-11-2015 18:51

подскажите, пожалуйста, есть функция вызова шасси у hydra, как ее применить к другим самолетам

text:006CC3B1     loc_6CC3B1:                             ; CODE XREF: CPlane__m110+BBF j
.text:006CC3B1 0A4                 cmp     cx, 208h
.text:006CC3B6 0A4                 jnz     loc_6CC461
.text:006CC3BC 0A4                 test    byte ptr [esi+36h], 0F8h
.text:006CC3C0 0A4                 jnz     loc_6CC461
.text:006CC3C6 0A4                 movzx   edx, word ptr [esi+86Ch]
.text:006CC3CD 0A4                 movsx   eax, word_8D33C8
.text:006CC3D4 0A4                 cmp     edx, eax
.text:006CC3D6 0A4                 jl      loc_6CC461
.text:006CC3DC 0A4                 mov     eax, _modelPtrs+6A4h
.text:006CC3E1 0A4                 mov     edi, [esi+388h]
.text:006CC3E7 0A4                 xor     ecx, ecx
.text:006CC3E9 0A4                 mov     cl, [eax+4Ah]
.text:006CC3EC 0A4                 push    ecx             ; id
.text:006CC3ED 0A8                 mov     ecx, offset handlingData
.text:006CC3F2 0A8                 call    CHandlingData__getFlyingHandling
.text:006CC3F7 0A4                 fld     dword ptr [esi+994h]
.text:006CC3FD 0A4                 fcomp   ds:dbl_859EF8
.text:006CC403 0A4                 mov     [esi+388h], eax
.text:006CC409 0A4                 fnstsw  ax
.text:006CC40B 0A4                 test    ah, 41h
.text:006CC40E 0A4                 jz      short loc_6CC422
.text:006CC410 0A4                 cmp     byte ptr [esi+960h], 4
.text:006CC417 0A4                 jnb     short loc_6CC451
.text:006CC419 0A4                 test    dword ptr [esi+40h], 8000000h
.text:006CC420 0A4                 jnz     short loc_6CC451
.text:006CC422
.text:006CC422     loc_6CC422:                             ; CODE XREF: CPlane__m110+C4E j

#7 Re: Работа с памятью, EXE » Вопрос по памяти » 11-11-2015 18:40

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

int* ReadPointer (DWORD base, int offsets [], int level)

{
	int* pointer = (int*)base;
	for (int i = 0; i < level; i++)
	{
		pointer = (int*)(*pointer + offsets[i]);
		printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer);
	}
	return pointer;
}

осталось только рабочее шасси доделать

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

void CreateConsole ()

{
int hConHandle = 0;
HANDLE lStdHandle = 0;
FILE *fp = 0;
AllocConsole ();
SetConsoleTitle ("ID   ");
lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT);
fp = _fdopen (hConHandle, "w");
*stdout = *fp;
setvbuf (stdout, NULL, _IONBF, 0);
}




int* ReadPointer (DWORD base, int offsets [], int level)

{
	int* pointer = (int*)base;
	for (int i = 0; i < level; i++)
	{
		pointer = (int*)(*pointer + offsets[i]);
		printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer);
	}
	return pointer;
}

void MEMwrite(void *adr, void *ptr, int size)
{
DWORD OldProtection;
VirtualProtect(adr,size,PAGE_EXECUTE_READWRITE, &OldProtection);
memcpy(adr,ptr,size);
VirtualProtect(adr,size,OldProtection, &OldProtection);
}

DWORD WINAPI GtaSA_thread (LPVOID)

{
	int* pointer0 = 0;
	DWORD base = 0xBA18FC;
	int offsets[1] = { 0x00 };
	pointer0 = ReadPointer (base, offsets, 0);

    

	DWORD*var =  (DWORD*)(0x6CC3B2);
	DWORD*var2 = (DWORD*)(0x6C9103);
    DWORD*var3 = (DWORD*)(0x406AF3);
	DWORD*var4 = (DWORD*)(0x6c9690);
	DWORD*var5 = (DWORD*)(0x6C9F1C);
    DWORD*var6 = (DWORD*)(0x6C8F10);
	
	   
	


    CreateConsole ();
    for (;;Sleep (100))
	{


		if (*pointer0)

		{

		 int offsets[2] = { 0x384, 0x00 };
            

		 int* pointer = 0;
	   	 pointer = ReadPointer (base, offsets, 2);


	
		
		
		       if (*pointer == 188)
			   {

				   *var  = 0x01DCF981;
				   *var2 = 0x01DC227E;
				   *var3 = 0x01DC227E;
                   *var4 = 0x01DC227E;
                   *var5 = 0x01DC3D66;
                   *var6 = 0x01DCFF81;


	//			MEMwrite ((void*)(adr), (void*)"1", 1);
	//			MEMwrite ((void*)(adr2), (void*)"1", 1);
			
			   }else

			   {
			       *var  = 0x0208F981;
				   *var2 = 0x0208227E;
				   *var3 = 0x0208227E;
                   *var4 = 0x0208227E;
                   *var5 = 0x02083D66;
                   *var6 = 0x0208FF81;
			   }

		}

	
	}


}

работает так: когда сел в rustler в нем появляются функции hydra (вертикальный взлет/посадка), когда сел в hydra ее функции возвращаются

#8 Re: Работа с памятью, EXE » Вопрос по памяти » 03-11-2015 17:08

есть адрес в процессе 0xBA18FC, значение в этом адресе = 0xAAA6480(динамический) - это опять же адрес, значение в котором, является адресом = 0x00C35E5C в этом адресе записана переменная, которую мне нужно сравнить, использую конструкцию:

   DWORD p1; 
    DWORD p2;
    DWORD p3;
 
    ReadProcessMemory(GtaSA_thread, (LPCVOID)(0xBA18FC), &p1, sizeof(4), NULL);//прочитали адрес 0xBA18FC, записали значение в p1
    p1 = p1 + 0x384; // прибавили смещение
    ReadProcessMemory(GtaSA_thread, (LPCVOID)p1, &p2, sizeof(4), NULL);//прочитали адрес р1(со смещением), записали значение в р2
    ReadProcessMemory(GtaSA_thread, (LPCVOID)p2, &p3, sizeof(4), NULL);//прочитали адрес р2, записали значение в р3
    if (p3 == 188)
    {
 
// если равно, то ...
    }

но не получается почему-то

#9 Re: Работа с памятью, EXE » Вопрос по памяти » 27-10-2015 20:36

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

#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*)(0x6CC3B2);
	 DWORD*var2 = (DWORD*)(0x6C9103);
     DWORD*var3 = (DWORD*)(0x406AF3);
	 DWORD*var4 = (DWORD*)(0x6c9690);
	 DWORD*var5 = (DWORD*)(0x6C9F1C);
	 DWORD*var6 = (DWORD*)(0x6C8F10);
	


	*var  -= 0x2c0000;
	*var2 -= 0x2c0000;
	*var3 -= 0x2c0000;
	*var4 -= 0x2c0000;
	*var5 -= 0x2c0000;
	*var6 -= 0x2c0000;
	

WriteProcessMemory(GtaSA_thread, (void*)var, var, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var2, var2, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var3, var3, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var4, var4, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var5, var5, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var6, var6, sizeof(4), NULL);


     	
	{

		 for (;;Sleep (1000))           
		
	return 0;

	 
	}
	            

}

вопрос с шасси пока не решен
https://www.youtube.com/watch?v=NRbNcmd-e9s

#10 Re: Работа с памятью, EXE » Вопрос по памяти » 26-10-2015 19:52

у меня получилось поменять в HEX редакторе + asi плагин вот что
https://youtu.be/K-7xkpbY_t0
пришлось в exe менять вот этот участок
https://yadi.sk/i/NZ7bFTcgk2kE7
как мне в запущенном процессе найти этот участок памяти, адрес

#11 Re: Работа с памятью, EXE » Вопрос по памяти » 25-10-2015 12:10

установил чистую gta, там значение адресов такое же

006CB4F3 90 E9 F8 B5 D3 FF 0F 85 EB 00 00 00 57 E8 6B 46

а не

006CB4F3 66 81 7E 22 08 02 0F 85  EB 00 00 00 57 E8 6B 46

как в базе IDA

#12 Re: Работа с памятью, EXE » Вопрос по памяти » 25-10-2015 10:55

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

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

void CreateConsole ()

{
int hConHandle = 0;
HANDLE lStdHandle = 0;
FILE *fp = 0;
AllocConsole ();
SetConsoleTitle ("ID   ");
lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT);
fp = _fdopen (hConHandle, "w");
*stdout = *fp;
setvbuf (stdout, NULL, _IONBF, 0);
}



DWORD WINAPI GtaSA_thread (LPVOID)
{
	 

	 DWORD*var = (DWORD*)(0x6CC3B2);
	 DWORD*var2 = (DWORD*)(0x6C9103);

	// DWORD*var3 = (DWORD*)(0x6C9103);

	*var  -= 0x2c0000;
	*var2 -= 0x2c0000;

	
WriteProcessMemory(GtaSA_thread, (void*)var, var, sizeof(4), NULL);
WriteProcessMemory(GtaSA_thread, (void*)var2, var2, sizeof(4), NULL);


     	
	{

		 for (;;Sleep (1000))           
		
	return 0;

	 
	}
	            

}

пока получилось только это
https://www.youtube.com/watch?v=cMMd7vroo9A
в каком направлении дальше двигаться?

#13 Re: Работа с памятью, EXE » Вопрос по памяти » 25-10-2015 07:37

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

.text:006CB4F3
.text:006CB4F3     loc_6CB4F3:                             ; CODE XREF: CPlane__processControlInput+611j
.text:006CB4F3                                             ; CPlane__processControlInput+636j
.text:006CB4F3                                             ; CPlane__processControlInput+64Dj
.text:006CB4F3                                             ; CPlane__processControlInput+688j ...
.text:006CB4F3 024                 cmp     word ptr [esi+22h], 208h

во вкладке HEX он выглядит так

006CB4F3  66 81 7E 22 08 02 0F 85  EB 00 00 00 57 E8 6B 46

меня интересует конкретно строка
.text:006CB4F3 024                 cmp     word ptr [esi+22h], 208h //здесь происходит сравнение с id 520 (гидра)
так вот, в exe (если открыть в hex-редакторе) или открыть запущенный процесс этот участок выглядит совсем не так
F7 FF FF 90 E9 F8 B5 D3 FF 0F 85 EB 00 00 00 57
наглядно
https://yadi.sk/d/1UKc1vIpjybDr
мне нужно выполнить сравнение не с 208h, а с другим числом, как его вычислить?

#14 Re: Вопросы по скриптингу » видеоэкраны » 20-11-2010 20:08

в cull.ipl - места установки зеркал, видеоэкранов на стадионах и т.д.
можно вообще вставить свой видеоэкран хоть куда-нибудь?

#15 Вопросы по скриптингу » видеоэкраны » 20-11-2010 16:41

zorin_chel
Replies: 3

кто-нибудь может подсказать как сделать видеоэкран в gta

#16 Re: Вопросы по скриптингу » блокпост на гроув стрит помогите дописать » 18-10-2010 18:58

еще один вопрос.


{$VERSION 3.1.0027}
{$CLEO .cs}

//-------------MAIN---------------
thread "Electricgate"

:PCAR_8
wait 0
if
   Player.Defined($PLAYER_CHAR)
jf @PCAR_8
Model.Load(969)
038B: load_requested_models

:PCAR_40
wait 0
if and
   Model.Available(969)
   jf @PCAR_40
1@ = Object.Create(969, 2461.81, -1663.53, 12.5156)
Object.Angle(1@) = 90.0
Model.Destroy(969)

:PCAR_121
wait 0
0471: actor $PLAYER_ACTOR near_object 1@ radius 10.0 10.0 flag 0
jf @PCAR_121
034E: move_object 1@ to 2461.81 -1684.93 12.5156 speed 0.0 10.0 0.0 flag 0


:PCAR_199
wait 0 
while true
034E: move_object 1@ to 2461.81 -1663.53 12.5156 speed 0.0 10.0 0.0 flag 0
jump  @PCAR_121
0A93: end_custom_thread


ворота, если к ним подходишь, начинают скакать туда-сюда, а надо, что бы плавно перемещались, можно такое сделать?

#17 Re: Вопросы по скриптингу » блокпост на гроув стрит помогите дописать » 18-10-2010 18:43

спасибо за помощь


{$CLEO .cs}

//-------------MAIN---------------
thread "PCAR"

:PCAR_8
wait 0
if
   Player.Defined($PLAYER_CHAR)
jf @PCAR_8
Model.Load(#RHINO)
Model.Load(#FBI)
038B: load_requested_models

:PCAR_40
wait 0
if and
   Model.Available(#RHINO)
   Model.Available(#FBI)
jf @PCAR_40
1@ = Car.Create(#RHINO, 2457.36, -1658.67, 13.3)
Car.Angle(1@) = 180.0
0129: 2@ = create_actor_pedtype 6 model #FBI in_car 1@ driverseat
Model.Destroy(#RHINO)
Model.Destroy(#FBI)

:PCAR_121
wait 0
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2457.36 -1658.67 13.3 radius 35.0 35.0 35.0
jf @PCAR_121
Car.SetSpeedInstantly(1@, 5.0)
02C2: car 1@ drive_to 2457.36 -1678.67 13.3

:PCAR_199
wait 0
80FE:   not actor $PLAYER_ACTOR sphere 0 in_sphere 2457.36 -1658.67 13.3 radius 35.0 35.0 35.0
jf @PCAR_199
Car.SetSpeedInstantly(1@, 5.0)
02C2: car 1@ drive_to 2457.36 -1658.67 13.3
jump @PCAR_121
0A93: end_custom_thread



все работает

#18 Вопросы по скриптингу » блокпост на гроув стрит помогите дописать » 27-09-2010 18:51

zorin_chel
Replies: 6

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



{$VERSION 3.1.0027}
{$CLEO .cs}

//-------------MAIN---------------
thread "PCAR" 

:PCAR_8
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
jf @PCAR_8 
Model.Load(#RHINO)
Model.Load(#FBI)
038B: load_requested_models 

:PCAR_40
wait 0 
if 
   Model.Available(#RHINO)
   Model.Available(#FBI)
jf @PCAR_40 
1@ = Car.Create(#RHINO, 2457.36, -1658.67, 13.3)
0129: 2@ = create_actor_pedtype 6 model #FBI in_car 1@ driverseat 

:PCAR_101
wait 0 
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2457.36 -1658.67 13.3 radius 35.0 35.0 35.0 
jf @PCAR_101 
Car.SetSpeedInstantly(1@, 5.0)
02C2: car 1@ drive_to 2457.36 -1668.67 13.3
Model.Destroy(#RHINO)
Model.Destroy(#FBI)
end_thread

в общем работает, танк отъезжает, освобождая дорогу, но нужно, что бы он парковался обратно и еще: пытался его развернуть на 180

1@ = Car.Create(#RHINO, 2457.36, -1658.67, 13.3)
Car.Angle(1@) = 180.0 - не получается. помогите доделать это мой первый скрипт

Board footer

Powered by FluxBB