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

Chusa

Пользователи
  • Постов

    25
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Chusa

  1. /*----------------------------------------------------------------------------*/

     

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

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

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

     

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

     

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

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

    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.

  3. /*---------------------------------------------------------------------------*/

     

    Могу предположить, что "непонятный мусор", судя по открытому окну 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.

     

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

  4. 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) про указатели, как они работают и что делают - наконец можно будет 

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

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

     

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

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

  5. /*---------------------------------------------------------------------------*/

     

    Я очень горячо предлагаю в функции 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
  6. 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. Название изменилось потому, что я стал пробывать не на Криминальной России, а на  обычной Сан-Андреас(Думал в этом ошибка). 

  7. Функция 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 и напишу о результатах.

  8. 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. 

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

    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;
  10.  

     

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

     

     

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

     

    -ijGs0uFS3g.jpg

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

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

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

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

     

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

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

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

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

  12. Хм, ну в принципе читать по смещениям это не так уж и сложно должно быть..  Недавно делал похожее...

    Могу глянуть если проблема именно в получении hWnd окна или процесса...

     

    Или проблема уже решена?

     

    Ну а так то я заметил что ты не верно написал смещения, в СЕ у тебя стоит первое же смещение "0x14" а ты читаешь "0xE", это же вроде разные значения, или я ошибаюсь?

     

    И еще не знаю как в C++, но я когда писал на C# чтение адресов то у меня была проблема что я хранил прочтенные адреса в int вместо uint, так что в эту сторону можешь тоже глянуть, мне помогло..

     

    Проблемане решена, если не сложно, то можем глянуть вместе в скайпе(lol_44_lol) или в RC.  А по поводу смещений, да я не прав, но все равно дело до них не доходит, ошибка возникает в другом.

  13. /*---------------------------------------------------------------------------*/

    Интересно!

    А в диспетчере задач процесс прям такой и висит - с "dll" на конце? Не "exe"?

    У меня есть подозрение, что ты не в том процессе ищешь.

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

    VfGCjfbh6kU.jpg

    pID определяет правильно с таким названием и CE подключается к этому же процессу

  14. /*---------------------------------------------------------------------------*/

    Покажи значение переменной CPed и из какого процесса ты читаешь

    (вызов FindWindow).

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

    SCnnMOIrToA.jpg

    А во время исполнения программы значение CPed == содержимому Base

  15. Предположу, что что-то не так. Можешь показать цепочку указателей в таблице Cheat Engine и твой код на C++, который читает? Вряд ли в моём коде где-то ошибка - проверил на нескольких указателях.

    B3lfgj03Blw.jpgSRhhhlJlEPw.jpg

  16. Попробуй:

    HWND hwnd = FindWindowA("0", "asdfg");

    И проверь в свойствах проекта, как он относится к юникоду.

    Вообщем попробывал, как ты сказал все тоже самое. Потом я решил начать писать все с нуля написал только чтение из памяти без всяких клавиш тупо вывод на консоль значений при каждом смещении, так все равно читате только то , что в базовом адресе и все дальше не идет. Я не знаю, что делать. Делал все, как показано у тебя в видео 1 к 1, только изменяется название игры и базовый адрес со смещениями

  17. HWND hwnd = FindWindow(0, L"здесь имя окна игры");

    Я делал так выдает ошибку 1 IntelliSense: аргумент типа "const wchar_t *" несовместим с параметром типа "LPCSTR" , а если удаляю букву L то переменная hwnd пустая и выдает ошибку unused <Чтение памяти невозможно>

    .

  18. Keng я как только не пробывал, но у меня постоянно не может прочесть Handle процесса, но есть одна странность, что значение в базы он читает, но не записывает и поэтому дальше чтение по со смещениями не идет. Я пробывал делать, как ты, но у меня все равно пишет unused <Чтение памяти невозможно> , хотя значение базы читает правильно, я проверял на отладке, но не записывает его. Я снимал защиту на чтение с помощью функции VirtualProtect, но все равно пишет, что чтение невозможно. Если у тебя будет свободная минутка, то можешь написать чтение на координату Х, а дальше я уже сам пойму.


  19. #include "stdafx.h"
    #include <Windows.h>
    #include <iostream>
    #include <string>

    using namespace std;

    int _tmain(int argc, _TCHAR* argv[])
    {
    //0x035EA564 + 0x40 + 0x3A8 + 0xC + 0x10 + 0x90 = 4 bytes DWORD

    HWND hwnd = FindWindow(0, L"Assassin's Creed IV Black Flag");
    DWORD value = 0;
    DWORD addr = 0x035EA564;
    DWORD pid;
    printf("Handle: 0x%x\n", hwnd);
    printf("Address: 0x%x\n", addr);
    GetWindowThreadProcessId(hwnd, &pid);
    HANDLE phandle = OpenProcess(PROCESS_VM_READ, 0, pid);
    printf("Success: %d\n", ReadProcessMemory(phandle, (void*)addr, &value, sizeof(value), 0));
    printf("Read: %x\n", value);
    printf("Error: %d\n", GetLastError());

    addr = value + 0x40;
    printf("Old addr: 0x%X, offset: 0x40, new addr: 0x%X\n", value, addr);
    value = 0;
    printf("Success: %d\n", ReadProcessMemory(phandle, (void*)addr, &value, sizeof(value), 0));
    printf("Read: %x\n", value);
    printf("Error: %d\n", GetLastError());

    addr = value + 0x3A8;
    printf("Old addr: 0x%X, offset: 0x3A8, new addr: 0x%X\n", value, addr);
    value = 0;
    printf("Success: %d\n", ReadProcessMemory(phandle, (void*)addr, &value, sizeof(value), 0));
    printf("Read: %x\n", value);
    printf("Error: %d\n", GetLastError());

    addr = value + 0xC;
    printf("Old addr: 0x%X, offset: 0xC, new addr: 0x%X\n", value, addr);
    value = 0;
    printf("Success: %d\n", ReadProcessMemory(phandle, (void*)addr, &value, sizeof(value), 0));
    printf("Read: %x\n", value);
    printf("Error: %d\n", GetLastError());

    addr = value + 0x10;
    printf("Old addr: 0x%X, offset: 0x10, new addr: 0x%X\n", value, addr);
    value = 0;
    printf("Success: %d\n", ReadProcessMemory(phandle, (void*)addr, &value, sizeof(value), 0));
    printf("Read: %x\n", value);
    printf("Error: %d\n", GetLastError());

    addr = value + 0x90;
    printf("Old addr: 0x%X, offset: 0x90, new addr: 0x%X\n", value, addr);
    value = 0;
    printf("Success: %d\n", ReadProcessMemory(phandle, (void*)addr, &value, sizeof(value), 0));
    printf("Read: %d\n", value);
    printf("Error: %d\n", GetLastError());

    cin.get();
    return 0;
    }

    Результат:

    1555a041f8.png

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

    Спасибо буду теперь доделывать, чтобы у меня все работало.

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

    Я смотрел все твои уроки и кодера тоже. Именно после уроков мне и захотелось перевести все с СЕ на С++ потому, что он открывает еще большие просторы.

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

    Keng можешь объяснить как хотя бы прочесть одну координату, я а дальше я на примере сдедлаю. Вот та часть которую я написал сейчас, в вот здесь послностью весь код https://yadi.sk/d/6nkwuunIZdgPq

    case WM_KEYDOWN:

    if(wParam == 0x49)

    {

    DWORD pID = UpdatePID("grand_theft_auto_san_andreas.dll");

    DWORD offsets_coordX[2] = {0xE, 0x1E};

    DWORD offsets_coordY[2] = {0xE, 0x22};

    DWORD offsets_coordZ[2] = {0xE, 0x26};

    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;

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

    center = CPed + 0xE;

    ReadProcessMemory(hWnd,(LPCVOID)center, (LPVOID)coord_X1, sizeof(center), NULL);

    center_X = coord_X1 + 0x1E;

    ReadProcessMemory(hWnd,(LPCVOID)center_X, (LPVOID)coord_X, sizeof(center_X), NULL);

    ReadProcessMemory(hWnd,(LPCVOID)center, (LPVOID)coord_Y1, sizeof(center), NULL);

    center_Y = coord_Y1 + 0x22;

    ReadProcessMemory(hWnd,(LPCVOID)center_Y, (LPVOID)coord_Y, sizeof(center_Y), NULL);

    ReadProcessMemory(hWnd,(LPCVOID)center, (LPVOID)coord_Z1, sizeof(center), NULL);

    center_Z = coord_Z1 + 0x26;

    ReadProcessMemory(hWnd,(LPCVOID)center_Z, (LPVOID)coord_Z, sizeof(center_Z), NULL);

    }

    Заранее спасибо.

  21. С чтением указателей вся фишка в том, что их нужно читать по очереди. Типа, есть цепочка:

    0x1234567 + 0x12 + 0x15 + 0x20 = значение.

    Порядок такой:

    1. Прочитали 0x1234567 - там будет лежать адрес.

    2. Прибавили к прочитанному адресу 0x12 (первое смещение) - получили новый адрес.

    3. Прочитали значение нового адреса - опять получаем адрес.

    4. Прибавили к новому прочитанному адресу второе смещение (0x15), опять получили новый адрес.

    5. Прочитали.

    6. Прибавили.

    7. Прочитали.

    8. Смещения кончились - значит мы прочитали уже значение указателя, а не очередной его адрес из цепочки.

    Спасибо большое если я правильно понял, то сейчас все получится.

  22. RPM читает в свой третий аргумент:

    _Out_  LPVOID lpBuffer,

    Указатель искать нужно каким-нибудь сканером памяти, вроде Cheat Engine, или же я тебя неправильно понял.

    Да ты меня не правильно понял) В CE у меня уже все координаты найдены, теперь же я хочу, чтобы в любой момент времени я мог нажать клавишу и координаты записались(как делал ты в видео-уроке, но только я хчу реализовать на С++ и для трех осей), а потом нажать другую и опять вернуться на тоже место. И я не могу понять с чего начать читать потому что все что у меня есть в начале это указтель на CPed 0xB6F5F0 и я не знаю, как его прочитать, чтобы потом читать со смещениями. Как-то так) Сори если очень муторно по-другому я пока что не могу объянсить

  23. Привет!

    Есть две функции - [WriteProcessMemory] и [ReadProcessMemory]. Первая, значит, пишет в память, а вторая её читает. В аргументах разобраться достаточно просто, нужен хэндл целевого процесса, откуда читать\писать будешь, адрес (адресного пространства процесса), куда будешь писать\читать, буфер, что писать или в который читать, да и всё, в общем-то.

    Как найти хэндл процесса я объяснять сейчас не буду, это ещё проще. Поясню немного разве что про чтение указателей. Допустим, тебе нужно прочитать указатель (возьму твой пример):

    1. Читаешь "CPed + B6F5C0", получаешь DWORD (4 байта, адрес).

    2. Прибавляешь к нему 0x30, т.е. смещение.

    3. Читаешь ещё раз получившееся, опять получаешь DWORD.

    4. Когда смещения кончились, ты прочитал уже значение - приводишь его к нужному типу.

    Т.е. прочитал адрес, прибавил смещение, прочитал, прибавил следующее, прочитал и так далее, пока не прочитал уже само значение указателя. Примеры есть на форуме (на плюсах - от [Coder], на шарпе можно у меня поискать (ссылка в подписи или в местном разделе видео).

    Как-то так.

    Как работают эти функции я разобрался из твоих уроков и уроков Codera, я не могу понять как с самого начала когда найти базовый адрес CPed, когда у нас есть адрес 0xB6F5F0 который хранит адрес CPed. И еще есть один непонятный момент куда читает функция ReadProcessMemory.

  24. Я начинающий и еще не очень сильно разобрался в работе указателей на С++. Но мне нужно из процесса игры прочесть и сохранить три координаты и в нужный момент по нажатию клавиши все это записать в память. pID процесса и все что еще необходимо я нашел и написал(из видео уроков и msdn), но только не могу написать само прочтение и записаь в память. Кому не сложно объяснить помогите пожалуйста. Исходники если надо, то я скину. Вот эти самые адреса из которых надо читать, сохранять и писать

    0xB6F5F0 - Указатель игрока (CPed)

    (CPed+0x14) +0x30 = [dword] позиция по X-координате

    (CPed+0x14) +0x34 = [dword] позиция по Y-координате

    (CPed+0x14) +0x38 = [dword] позиция по Z-координате

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

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

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