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

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


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

Ну вот у тебя первое чтение:

ReadProcessMemory(hWnd, (void*) Base, (LPVOID) CPed, sizeof(Base), NULL);

Что в CPed после этой строки?

Да и во обще закинь сюда код и покажи в нем в каком именно месте ошибка, запили обычные MessageBox'ы, и смотри что читает после каждой ReadProcessMemory. Точно узнай в каком именно месте проблема, а то мне лично ничего не понятно во обще, по скринам в которых куски кода..

 

Ну а так то кстати я хз,но должно быть вроде так:

ReadProcessMemory(hWnd, (LPCVOID) Base, (LPVOID) CPed, sizeof(Base), NULL);

То есть ты должен сразу адрес читать а не указатель на этот адрес. Если не так сори сам неделю назад ток начал въезжать в c++ )

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

Ну вот у тебя первое чтение:

ReadProcessMemory(hWnd, (void*) Base, (LPVOID) CPed, sizeof(Base), NULL);

Что в CPed после этой строки?

Да и во обще закинь сюда код и покажи в нем в каком именно месте ошибка, запили обычные MessageBox'ы, и смотри что читает после каждой ReadProcessMemory. Точно узнай в каком именно месте проблема, а то мне лично ничего не понятно во обще, по скринам в которых куски кода..

 

Ну а так то кстати я хз,но должно быть вроде так:

ReadProcessMemory(hWnd, (LPCVOID) Base, (LPVOID) CPed, sizeof(Base), NULL);

То есть ты должен сразу адрес читать а не указатель на этот адрес. Если не так сори сам неделю назад ток начал въезжать в c++ )

 там ноль, в этом то и ошибка!

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

 

 

элементарна. В ReadProcessMemory первым параметром надо передавать не хэндл окна, а хэндл открытого на запись процесса. Исправляй.

 

 

Если я правильно понял, то вы хотите сказать, что надо вот так? У меня так и было только  hwnd - хэндл открытого на запись процесса был выше, но даже в таком случае в переменной CPed == 0

 

-ijGs0uFS3g.jpg

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

Исходя из твоего кода:

1. Процесс ты не открываешь вообще, непонятно, как ты собирался в него писать. Это видно по отсутствию функции OpenProcess после нахождения хэндла окна. Именно указанная функция возвращает хэндл открытого процесса, который и используется в функциях ReadProcessMemory и WriteProcessMemory.

2. Далее, чтобы изменить права доступа региона памяти нужно использоваться VirtualProtectEx, а не просто VirtualProtect.

3. После окончания работы с процессом нужно не забыть закрыть его хэндл с помощью CloseHandle.

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

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

 

Немного дополню пункт №2 предыдущего поста. В той функции, что кончается на

Ex, можно что-то делать в чужом адресном пространстве (не своего процесса), а

в функции без этого окончания - только в пределах адресного пространства

собственного процесса. Я говорю про виртуальное адресное пространство, само

собой, а не про физическое, но это особого отношения к посту не имеет.

 

Ещё есть функция [VirtualQueryEx], которая позволяет получить информацию о той

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

нам странице памяти флаг записи.

 

Все эти VirtualProtect и прочая чушь про защиту страниц памяти нужна затем,

чтобы случайно не попытаться записать при помощи WriteProcessMemory в адрес,

который находит на странице памяти, защищённой от записи. По идее, конечно,

эту ошибку можно и обработать, но если есть обработчик подобных ошибок, то

автор (скорее всего) уже в курсе, что такое защита памяти, как и зачем она

устроена. Поэтому делается так:

 

0. Копируем в укромное место старую защиту со страницы.

1. Ставим странице разрешение на запись.

2. Записываем нужное значение.

3. Возвращаем старую защиту на место.

 

Секция кода чаще всего разрешена для записи, а вот секция данных - далеко не

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

указателя, а никак - страница, где лежит его адрес, защищена от записи. Вот и.

 

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

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

Исходя из твоего кода:

1. Процесс ты не открываешь вообще, непонятно, как ты собирался в него писать. Это видно по отсутствию функции OpenProcess после нахождения хэндла окна. Именно указанная функция возвращает хэндл открытого процесса, который и используется в функциях ReadProcessMemory и WriteProcessMemory.

2. Далее, чтобы изменить права доступа региона памяти нужно использоваться VirtualProtectEx, а не просто VirtualProtect.

3. После окончания работы с процессом нужно не забыть закрыть его хэндл с помощью CloseHandle.

 

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

Вообщем я поменял, как было сказанно, но все равно в переменной CPed == 0. Но только одно я не смог сделать, это снять защиту потому, что выдает ошибку. Вот код который получился

case WM_KEYDOWN:		if(wParam == 0x49)		{			DWORD Base = 0xB6F5F0;			DWORD CPed = 0;			HWND hwnd = FindWindow(0, "grand_theft_auto_san_andreas.dll");			DWORD pID = UpdatePID("grand_theft_auto_san_andreas.dll");			HANDLE phandle = OpenProcess(PROCESS_VM_READ, 0, pID);			MessageBox(hWnd,"Сохранение координат","Lol",MB_OK);			DWORD coord_X;   DWORD coord_X1;			DWORD coord_Y;   DWORD coord_Y1;			DWORD coord_Z;	 DWORD coord_Z1;			DWORD center = 0;			DWORD center_X = 0;			DWORD center_Y = 0;			DWORD center_Z = 0;			DWORD old_prot = 0;			ReadProcessMemory(phandle,(void*)Base, (LPVOID)CPed, sizeof(Base), NULL);			center = CPed + 0x14;
Ссылка на комментарий
Поделиться на другие сайты

1. Впервые вижу, чтобы в FindWindow передавали имя файла процесса, а не заголовок окна. Возможно, и даже весьма вероятно, ошибка кроется именно тут

2. Функции UpdatePID я не вижу, поэтому не могу сказать, в ней ли ошибка. Приведи и ее код тоже.

3. Самая главная ошибка (возможно, в этом куске кода просто не видно) - то, что я писал. После работы с открытым процессом хэндл обязательно надо закрывать.

4. Перед чтением памяти обязательно (для перестраховки) нужно выставить права на регион памяти, из которого собираешься считывать инфу. (VirtualProtectEx)

5. После считывания из региона памяти обязательно нужно восстановить те права, которые были до этого.

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

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

 

Мгм.

 

ReadProcessMemory(phandle,(void*)Base, (LPVOID)CPed, sizeof(Base), NULL);
center = CPed + 0x14;

 

Второй параметр у тебя приводится к void*, а требуется LPCVOID. Объяви:

 

DWORD bRead = 0;

 

И передай последним параметром (вместо NULL) указатель на него. Заодно заверни

вызов RPM в отдельную переменную (BOOL result = ReadProcessMemory), при 

успешном вызове должна возвращать не ноль. Типа:

 

DWORD bRead = 0; // Переменная, куда запишем количество прочитанных байт
// Если RPM сработала с ошибкой (вернула ноль) или bRead == 0
if ( !ReadProcessMemory( 0, 0, 0, 0, &bRead ) || !bRead ) {
// Пробуем прочитать код последней ошибки
    DWORD err = GetLastError();
} else { // Иначе - всё хорошо и прочиталось
 
}

 

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

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

1. Впервые вижу, чтобы в FindWindow передавали имя файла процесса, а не заголовок окна. Возможно, и даже весьма вероятно, ошибка кроется именно тут

2. Функции UpdatePID я не вижу, поэтому не могу сказать, в ней ли ошибка. Приведи и ее код тоже.

3. Самая главная ошибка (возможно, в этом куске кода просто не видно) - то, что я писал. После работы с открытым процессом хэндл обязательно надо закрывать.

4. Перед чтением памяти обязательно (для перестраховки) нужно выставить права на регион памяти, из которого собираешься считывать инфу. (VirtualProtectEx)

5. После считывания из региона памяти обязательно нужно восстановить те права, которые были до этого.

 

1. А что именно туда надо передавать? ЗАголовок какого окна?

2. Функция UpdatePID работает отлично, все проверено на отладке. Вот ее код

int UpdatePID(char* pName){	HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);	PROCESSENTRY32 pInfo;	DWORD pID = 0;	pInfo.dwSize = sizeof(PROCESSENTRY32);	if(Process32First(snapshot,&pInfo))		{			while(Process32Next(snapshot,&pInfo))			{				if(_stricmp(pName,pInfo.szExeFile) == 0)				{										CloseHandle(snapshot);					return pID = pInfo.th32ProcessID;				}			}		}	CloseHandle(snapshot);	return 0;}

3. Хэндл закрывается.

4 и 5 этот пункт я не смог реализовать потому, что выдает ошибку, что невозможно пребразовать DWORD в PDDWORD. 

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

Функция FindWindow принимает два параметра, первый - класс окна ("жертвы"), второй - заголовок окна ("жертвы").

Пример:

HWND hWin;hWin = FindWindow("GTA_SA_Wnd_Class", "GTA San Andreas");
ID процесса, опять же, можно получить с помощью WinAPI функции GetWindowThreadProcessId().

Пример ее использования:

HWND hWin;DWORD dwPID;GetWindowThreadProcessId(hWin, &dwPID);
По 4 и 5 пункту нужно использовать функцию VirtualProtectEx, почитать о ней можно в MSDN (или здесь), у нее два варианта.

Заводим переменную типа DWORD, например:

DWORD dwOldProtect;
Далее снимаем защиту, используя функцию VirtualProtectEx с нужными атрибутами, и указав имя переменной, куда нужно получить защиту. После чего выполняем нужный код, и снова выполняем функцию с возвращением старой защиты.

P.S.

В примере, с получением ID процесса, возможно нужно использовать не оператор "&", а "*"... Я пока полностью не въехал в тему указателей в плюсах, но я учусь потихоньку, так что прошу прощения заранее за возможный косяк :)

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

Функция FindWindow принимает два параметра, первый - класс окна ("жертвы"), второй - заголовок окна ("жертвы").

Пример:

HWND hWin;hWin = FindWindow("GTA_SA_Wnd_Class", "GTA San Andreas");
ID процесса, опять же, можно получить с помощью WinAPI функции GetWindowThreadProcessId().

Пример ее использования:

HWND hWin;DWORD dwPID;GetWindowThreadProcessId(hWin, &dwPID);
По 4 и 5 пункту нужно использовать функцию VirtualProtectEx, почитать о ней можно в MSDN (или здесь), у нее два варианта.

Заводим переменную типа DWORD, например:

DWORD dwOldProtect;
Далее снимаем защиту, используя функцию VirtualProtectEx с нужными атрибутами, и указав имя переменной, куда нужно получить защиту. После чего выполняем нужный код, и снова выполняем функцию с возвращением старой защиты.

P.S.

В примере, с получением ID процесса, возможно нужно использовать не оператор "&", а "*"... Я пока полностью не въехал в тему указателей в плюсах, но я учусь потихоньку, так что прошу прощения заранее за возможный косяк :)

 

 

Я по поводу функции FindWindow, а если я не знаю класс окна(или просто на данной стадии не понимаю, что это), то можно поставить просто 0? И еще заголовок окна жертвы брать из названия окна игры?  По поводу pID - здесь все правильно я проверял pID находит правильно,  я сверял с Диспетчером задач. Сейчас буду пробывать с функцией VirtualProtectEx и напишу о результатах.

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

Ну, не знаю как на счет простого "0", но NULL точно должен сработать). И да, заголовок - именно заголовок окна жертвы. Что касается получения PID, то что лучше, использовать самопальные N строчек кода, или всего одну, входящую в состав интерфейсов "окон", и проверенную временем?) А-ля "зачем изобретать велосипед"? :)

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

case WM_KEYDOWN:		if(wParam == 0x49)		{			DWORD Base = 0xB6F5F0;			DWORD CPed = 0;			HWND hwnd = FindWindow(0, "GTA:San Andreas");			DWORD pID = UpdatePID("gta_sa.exe");			HANDLE phandle = OpenProcess(PROCESS_VM_READ, 0, pID);			MessageBox(hWnd,"Сохранение координат","Lol",MB_OK);			DWORD coord_X;   DWORD coord_X1;			DWORD coord_Y;   DWORD coord_Y1;			DWORD coord_Z;	 DWORD coord_Z1;			DWORD center = 0;			DWORD center_X = 0;			DWORD center_Y = 0;			DWORD center_Z = 0;			DWORD old_prot = 0;			VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), PAGE_EXECUTE_READWRITE, &old_prot); 			ReadProcessMemory(phandle,(LPCVOID)Base, (LPVOID)CPed, sizeof(Base), NULL);			center = CPed + 0x14;			VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), old_prot, &old_prot); 			CloseHandle(phandle);

Вот так получилось и все равно в Cped == 0. Название изменилось потому, что я стал пробывать не на Криминальной России, а на  обычной Сан-Андреас(Думал в этом ошибка). 

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

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

 

Я очень горячо предлагаю в функции OpenProcess использовать флаг

"PROCESS_ALL_ACCESS", а потом, убедившись, что она возвращает валидный

идентификатор процесса (не ноль), посмотреть коды ошибок вызова

ReadProcessMemory и колько байт она читает. Если нисколько - то смотреть код

ошибки, а затем подняться на уровень вверх - проверить, корректно ли

срабатывает функция VirtualProtectEx. Без обид, но гадать на куске кода мы

можем ещё очень долго, но с использованием отладчика и кодов ошибок дело может

пойти куда быстрее.

 

PS: Третий параметр функции ReadProcessMemory - это указатель на адрес

переменной, куда будет прочитано значение адреса памяти. У тебя объявлена 

переменная типа DWORD, которая затем конвертируется в LPVOID (void*). Я могу

ошибаться, но при этом переменная принимает значение "0", так как

конвертируется значение переменной, а функции нужен её адрес. Попробуй просто

написать "ReadProcessMemory(..., ..., &CPed, ..., ...);".

 

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

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

А почему у тебя в ReadProcessMemory в качестве последнего параметра передается NULL? Заведи переменную, и читай туда количество байт.

И проверки сделай, например так:

 

 if (hWnd != 0) {  //дескриптор окна получен, продолжаем выполнение}
Блин... Повторил сообщение keng, показалось, что нажал кнопку "Отправить". Извините :)
Ссылка на комментарий
Поделиться на другие сайты

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

 

Я очень горячо предлагаю в функции OpenProcess использовать флаг

"PROCESS_ALL_ACCESS", а потом, убедившись, что она возвращает валидный

идентификатор процесса (не ноль), посмотреть коды ошибок вызова

ReadProcessMemory и колько байт она читает. Если нисколько - то смотреть код

ошибки, а затем подняться на уровень вверх - проверить, корректно ли

срабатывает функция VirtualProtectEx. Без обид, но гадать на куске кода мы

можем ещё очень долго, но с использованием отладчика и кодов ошибок дело может

пойти куда быстрее.

 

PS: Третий параметр функции ReadProcessMemory - это указатель на адрес

переменной, куда будет прочитано значение адреса памяти. У тебя объявлена 

переменная типа DWORD, которая затем конвертируется в LPVOID (void*). Я могу

ошибаться, но при этом переменная принимает значение "0", так как

конвертируется значение переменной, а функции нужен её адрес. Попробуй просто

написать "ReadProcessMemory(..., ..., &CPed, ..., ...);".

 

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

 

Все заработало. Надо было извенить третий параметр функции RPM. Вот как изменился код. Сейчас буду дописывать, чтобы читал все координаты до конца и записывал. Спасибо большое за помощь.

case WM_KEYDOWN:		if(wParam == 0x49)		{			DWORD Base = 0xB6F5F0;			DWORD CPed = 0;			HWND hwnd = FindWindow(0, "GTA:San Andreas");			DWORD pID = UpdatePID("gta_sa.exe");			HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pID);			MessageBox(hWnd,"Сохранение координат","Lol",MB_OK);			DWORD coord_X;   DWORD coord_X1;			DWORD coord_Y;   DWORD coord_Y1;			DWORD coord_Z;	 DWORD coord_Z1;			DWORD center = 0;			DWORD center_X = 0;			DWORD center_Y = 0;			DWORD center_Z = 0;			DWORD old_prot = 0;			VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), PAGE_EXECUTE_READWRITE, &old_prot); 			ReadProcessMemory(phandle,(LPCVOID)Base, &CPed, sizeof(Base), NULL);			center = CPed + 0x14;			VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), old_prot, &old_prot); 			CloseHandle(phandle);

Если нужен будет полный код, то он вот здесь вот https://yadi.sk/d/cFXHd8S5aLqXT. Как допишу полностью отмечусь, еще раз спасибо за помощь.

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

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

 

Пустяки, я только рад помочь. Здорово, что всё получилось. Очень советую

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

во всей этой каше из типов и макросов (HMODULE == DWORD == unsigned long)

очень легко запутаться. Так же советую почитать (например, в Kernighan &

Ritchie) про указатели, как они работают и что делают - наконец можно будет 

перестать (почти перестать) путаться в "*" и "&". Крайне полезная штука в нашем

деле, рекомендую.

 

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

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

LONG WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){	HDC hDC;	PAINTSTRUCT ps;	DWORD Base = 0xB6F5F0;	DWORD CPed = 0;	HWND hwnd = FindWindow(0, "GTA:San Andreas");	DWORD pID = UpdatePID("gta_sa.exe");	HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pID);	DWORD coord_X;   DWORD coord_X1;	DWORD coord_Y;   DWORD coord_Y1;	DWORD coord_Z;	 DWORD coord_Z1;	DWORD center = 0;	DWORD center_X = 0;	DWORD center_Y = 0;	DWORD center_Z = 0;	DWORD old_prot = 0;	switch(msg)	{	case WM_DESTROY:		PostQuitMessage(0);	case WM_COMMAND:		switch(wParam)		{		case 1:					break;		}	case WM_KEYDOWN:		if(wParam == 0x49)		{			MessageBox(hWnd,"Сохранение координат","Lol",MB_OK);			VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), PAGE_EXECUTE_READWRITE, &old_prot); 			ReadProcessMemory(phandle,(LPCVOID)Base, &CPed, sizeof(Base), NULL);			center = CPed + 0x14;			ReadProcessMemory(phandle,(LPCVOID)center, &coord_X1, sizeof(center), NULL);			center_X = coord_X1 + 0x30;			ReadProcessMemory(phandle,(LPCVOID)center_X, &coord_X, sizeof(center_X), NULL);						ReadProcessMemory(phandle,(LPCVOID)center, &coord_Y1, sizeof(center), NULL);			center_Y = coord_Y1 + 0x34;			ReadProcessMemory(phandle,(LPCVOID)center_Y, &coord_Y, sizeof(center_Y), NULL);			ReadProcessMemory(phandle,(LPCVOID)center, &coord_Z1, sizeof(center), NULL);			center_Z = coord_Z1 + 0x38;			ReadProcessMemory(phandle,(LPCVOID)center_Z, &coord_Z, sizeof(center_Z), NULL);					}		if(wParam == 0x55)		{			MessageBox(hWnd,"Телепорт","Lol",MB_OK);			WriteProcessMemory(phandle, &coord_X, 0, sizeof(coord_X), NULL); 			WriteProcessMemory(phandle, &coord_Y, 0, sizeof(coord_Y), NULL); 			WriteProcessMemory(phandle, &coord_Z, 0, sizeof(coord_Z), NULL); 			VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), old_prot, &old_prot); 			CloseHandle(phandle);		}		break;		case WM_PAINT:		{			hDC = BeginPaint(hWnd, &ps);			OnPaint(hDC);			EndPaint(hWnd, &ps);			break;		}	default:		return DefWindowProc (hWnd, msg, wParam, lParam);	}	return 0;}

Я знаю, что скорей всего надоел с этой темой, но прошу помочь еще. Читать все начало и все правильно, но теперь я не понимаю, на каком моменте мне надо остановиться. Дело в том, что в таблице СЕ вот такая ситуация5es8rnBsafs.jpgБаза адреса это переменная Base, из нее читается CPed, потом в переменную center пишется CPed+0x14, для первого смещения, далее coord_X1 читается(CPed+0x14) и далее в center_X пишется coord_X1+0x30 и это как я понял нужный адрес и мы читаем его последней функцией RPM в переменную coord_X, но в ней уже непонятный для меня мусор(но я не обратил внимания и стал сразу же писать  функции для записи) и заметил это только на отладке, и теперь я не понимаю откуда надо начинать писать, если вам не трудно, то подскажите пожалуйста.

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

 

Пустяки, я только рад помочь. Здорово, что всё получилось. Очень советую

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

во всей этой каше из типов и макросов (HMODULE == DWORD == unsigned long)

очень легко запутаться. Так же советую почитать (например, в Kernighan &

Ritchie) про указатели, как они работают и что делают - наконец можно будет 

перестать (почти перестать) путаться в "*" и "&". Крайне полезная штука в нашем

деле, рекомендую.

 

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

Учту твои советы, всю нужную литературу прочитаю. 

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

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

 

Могу предположить, что "непонятный мусор", судя по открытому окну Cheat

Engine, является типом float, так что его ещё надо из DWORD сконвертировать:

 

float f_coord_X = (float)coord_X;

 

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

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

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

 

Могу предположить, что "непонятный мусор", судя по открытому окну Cheat

Engine, является типом float, так что его ещё надо из DWORD сконвертировать:

 

float f_coord_X = (float)coord_X;

 

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

 

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

И выглядеть это будет как то так?

WriteProcessMemory(phandle, &coord_X, coord_X , sizeof(coord_X), NULL);

Получается вот так 

 

 

coord_X == 181410528     f_coord_X == -107374176.

coord_Y == 3298893584   f_coord_Y == 3.29889357e+009

coord_Z == 1096163328   f_coord_Z == -107374176.

 

Настоящие координаты не менялись такие же, как и на скрине

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

При записи в память при таком коде 

case WM_KEYDOWN:		if(wParam == 0x49)		{			MessageBox(hWnd,"Сохранение координат","Lol",MB_OK);			VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), PAGE_EXECUTE_READWRITE, &old_prot); 			ReadProcessMemory(phandle,(LPCVOID)Base, &CPed, sizeof(Base), NULL);			center = CPed + 0x14;			ReadProcessMemory(phandle,(LPCVOID)center, &coord_X1, sizeof(center), NULL);			center_X = coord_X1 + 0x30;			ReadProcessMemory(phandle,(LPCVOID)center_X, &coord_X, sizeof(center_X), NULL);			float f_coord_X = (float)coord_X;			ReadProcessMemory(phandle,(LPCVOID)center, &coord_Y1, sizeof(center), NULL);			center_Y = coord_Y1 + 0x34;			ReadProcessMemory(phandle,(LPCVOID)center_Y, &coord_Y, sizeof(center_Y), NULL);			float f_coord_Y = (float)coord_Y;			ReadProcessMemory(phandle,(LPCVOID)center, &coord_Z1, sizeof(center), NULL);			center_Z = coord_Z1 + 0x38;			ReadProcessMemory(phandle,(LPCVOID)center_Z, &coord_Z, sizeof(center_Z), NULL);			float f_coord_Z = (float)coord_Z;					}		if(wParam == 0x55)		{			MessageBox(hWnd,"Телепорт","Lol",MB_OK);			WriteProcessMemory(phandle, &center_X, (LPCVOID)coord_X, sizeof(center_X), NULL); 			WriteProcessMemory(phandle, &center_Y, (LPCVOID)coord_Y, sizeof(center_Y), NULL); 			WriteProcessMemory(phandle, &center_Z, (LPCVOID)coord_Z, sizeof(center_Z), NULL); 			VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), old_prot, &old_prot); 			CloseHandle(phandle);		}

Выдает вот такие ошибки, на отладке смотрел читает правильно, но при записи выдает вот так ошибки:

 

Run-Time Check Failure #3 - The variable 'coord_X' is being used without being initialized.

Run-Time Check Failure #3 - The variable 'coord_Y' is being used without being initialized.

Run-Time Check Failure #3 - The variable 'coord_Z' is being used without being initialized.

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

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

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

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

 

Дополню предыдущий пост и порекомендую сперва проверить, не нули ли в

координатах, а только потом пытаться их куда-то записывать. Неосторожность

чревата вылетами из игры.

 

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

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

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

 

Дополню предыдущий пост и порекомендую сперва проверить, не нули ли в

координатах, а только потом пытаться их куда-то записывать. Неосторожность

чревата вылетами из игры.

 

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

 

Странно, но при чтение в переменной coor_X имеется значение, да оно не того типа, но оно имеется. Сначало я нажимаю, чтобы записать в эти переменные, а потом, чтобы записать и когда записываю в переменных уже нули. Хотя, когда читаю память в переменнх имеется значение. И еще у меня вопрос возник про чтение вот у меня в переменной center_X есть адрес в котором хранится значение координаты Х и последняя функция  RPM получается читает в переменную cord_X  значение этого адреса, но оно не в том типе и даже то, что приводил кенг не работает вот пример значение cord_X == 184490720,  а  f_coord_X == -107374176 Хотя истинное значение в данный момент равно 2250.819336. 

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

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

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

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