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

Вопрос про чтение и запись в память на С++


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

цепочка указателей в таблице

9736d2b10812.jpg

код такой

на консоль выводятся p4 = 00000000, то есть не то что нужно, как мне в p4 получить нужное значение и сравнить его с 188, 

NullAlex: Тег спойлера не просто так придуман. Читай правила и FAQ.

#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 base = 0xBA18FC;	DWORD p1 = 0;	DWORD p2 = 0;	DWORD p3 = 0;	DWORD p4 = 0;	DWORD old_prot = 0;	VirtualProtectEx(GtaSA_thread, (LPVOID)base, sizeof(base), PAGE_EXECUTE_READWRITE, &old_prot); 	ReadProcessMemory(GtaSA_thread, (LPVOID)base, &p1, sizeof(base), NULL);//прочитали, записали в p1	p2 = p1 + 0x384;// прибавили смещение	ReadProcessMemory(GtaSA_thread, (LPVOID)p2, &p3, sizeof(p2), NULL);//прочитали адрес p2, записали в p3	p3 = p2 + 0x00;	ReadProcessMemory(GtaSA_thread, (LPVOID)p3, &p4, sizeof(p3), NULL);	 	if (p4 == 188)	{// если равно, то	 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);	}	 CreateConsole ();     		{		 for (;;Sleep (1000))           		printf ("   ID = %p", p4);	return 0;	 	}	            }
Ссылка на комментарий
Поделиться на другие сайты

Если ты инжектишь эту длл-ку в адресное пространство игры, то на кой тебе сдались ReadProcessMemory и WriteProcessMemory?

так тоже не получается

DWORD WINAPI GtaSA_thread (LPVOID){		    DWORD Cp1 = *(DWORD*)(0xBA18FC);    DWORD Cp2 = *(DWORD*)(Cp1 + 0x384);	}

 

так тоже не получается

DWORD WINAPI GtaSA_thread (LPVOID){		    DWORD Cp1 = *(DWORD*)(0xBA18FC);    DWORD Cp2 = *(DWORD*)(Cp1 + 0x384);	}

и так тоже

DWORD p1 = ((DWORD)0xBA18FC);DWORD p2 = *(DWORD *)(p1 + 0x384);

так мы к адресу 0xBA18FC прибавляем, а мне нужно к значению в адресе (которое тоже адрес), в общем я уже запутался 

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

Насколько я понял, тебе нужно взять из базового указателя значение, прибавить к нему смещение, считать из полученного значения следующий адрес, прибавить к нему смещение, и так далее.

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

Насколько я понял, тебе нужно взять из базового указателя значение, прибавить к нему смещение, считать из полученного значения следующий адрес, прибавить к нему смещение, и так далее.

DWORD WINAPI GtaSA_thread (LPVOID){	DWORD* pl = (DWORD *)0xBA18FC;    DWORD value  = *pl; 	 CreateConsole ();  		{		 for (;;Sleep (1000))           		printf ("   ID = %p", *pl);	return 0;	 	}

*p1 равно нужному адресу, а как дальше прочитать этот адрес и прибавить смещение?

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

Немного бреда(но работать должно):

INT value  = *(DWORD*)(*(DWORD*)(*(DWORD*)(0xBA18FC)+0x384)+0x00);printf_s("Pointer value:: 0x%X\nSignification value::%i\n",value,value)if(value==188)	printf_s("value = 188")

+ значение наверное меняется через промежутки времени. поэтому думаю это нужно внутри цикла обрабатывать

DWORD WINAPI GtaSA_thread (LPVOID){CreateConsole();while(true)    {       //Читаем - проверяем - переписываем        Sleep(500);    }return 0;}
Изменено пользователем Крайслер
Ссылка на комментарий
Поделиться на другие сайты

Немного бреда(но работать должно):

DWORD WINAPI GtaSA_thread (LPVOID){while(true){INT value = *(DWORD*)(*(DWORD*)(*(DWORD*)(0xBA18FC)+0x384)+0x00);if(value==188){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;}Sleep(500);}return 0;}

попробовал так. компилируется, но крашится при запуске

NullAlex: Читай FAQ по тегам. И цитировать большие сообщения полностью - необязательно.

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

Спасибо конечно за ответы, но как-бы прошло более года =) Я разобрался во всем через месяц

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

Спасибо конечно за ответы, но как-бы прошло более года =) Я разобрался во всем через месяц

тогда объясни, как получать значения указателей, потом читать их как адрес, например: 0xBA1300 базовый адрес, значение в этом адресе 0xCF0000, плюс смещение 0x384 получаем адрес 0xCF0384 в нем значение 0xCA0002, в этом адресе значение 188, как до него добраться? 

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

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

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

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