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

Вопрос по уроку Coder'a (читаем указатели)


RockHammer

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

Float - 4 Byta фига первый раз такое слышу  o_0

 

эм... тогда сколько?

sizeof(float)=4 Bytes

 

 

p.s. я сам с ответов мейл ру узнал

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

эм... тогда сколько?

sizeof(float)=4 Bytes

 

 

p.s. я сам с ответов мейл ру узнал

http://msdn.microsoft.com/ru-ru/library/hd7199ke.aspx

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

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

http://msdn.microsoft.com/ru-ru/library/hd7199ke.aspx

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

 

Я, если честно, сам в шоке) Знаю, что тип int занимает 4 байта, но почему же тогда тип float занимает так же 4 байт? 

Ведь Int хранит одно число, а тип float хранит целых 7 цифр... 1-само число и еще 6 знаков после запятой (или 7, тут я не помню)

Delphi по проще будет )))

 

А как на дельфях писать?

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

Я, если честно, сам в шоке) Знаю, что тип int занимает 4 байта, но почему же тогда тип float занимает так же 4 байт? 

Ведь Int хранит одно число, а тип float хранит целых 7 цифр... 1-само число и еще 6 знаков после запятой (или 7, тут я не помню)

 

А как на дельфях писать?

 

Смотря что ты именно хочешь писать ?

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

Смотря что ты именно хочешь писать ?

Пфф, пентагон взломать, конечно же))

Не, ну трейнер обычный... Аобскан, инъекци... Или просто поиск байтов в памяти и их замена нупами.

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

Пфф, пентагон взломать, конечно же))

Не, ну трейнер обычный... Аобскан, инъекци... Или просто поиск байтов в памяти и их замена нупами.

 

Сорь не для рекламы делал для своего ушедшего в прах сайта 

 

https://www.youtube.com/watch?v=Uu-q1fqnZRg

 

https://www.youtube.com/watch?v=YEXuXSNptbo

 

https://www.youtube.com/watch?v=RRMed5KFrX8

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

Сорь не для рекламы делал для своего ушедшего в прах сайта

https://www.youtube.com/watch?v=Uu-q1fqnZRg

https://www.youtube.com/watch?v=YEXuXSNptbo

https://www.youtube.com/watch?v=RRMed5KFrX8

Сам делал видосы?)

Красава!) Я тоже варфейс взламываю))))

 

 

Эм... немного отвлеклись от темы... Кто-то знает как решить проблему?

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

При чтении указателей почему-то там где должен быть адрес - выводится последний оффсет в массиве!

Кто знает, как исправить? На видео даже показал как и что делаю.

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

Ну начнем с того, что Dead Ricing 3 это x64 игра.

А трейнер собирается под x86,так еще и исходники тоже под x64 заточены.

Примерно так надо код фиксить и компилить трейнер надо под x64.

DWORD64 MemReader::ReadPointer(DWORD64 base, DWORD64* offsets, int count){	for (int i = 0; i < count - 1; i++)	{		base = Read(base + offsets[i], 8).toUINT64();	}	return base + offsets[count - 1];}

Единственное, чем я тебе могу помочь, это предоставить свои наработки последнего поколения (их в уроках не было).

Наработки независимы от архитектуры под которую ты компилишь (x86 или x64), а также от кодировки ANSI или UNICODE.

Но однако, трейнер тебе все равно надо собрать под x64, потому что ты работаешь с игрой в x64.

 

Исходники во вложении. Метод ReadPointer накидаешь сам думаю, если возникнут осложнения - пиши.

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

#include "Process.h"#include "MemWorker.h"int SeDebugPrivilege(void){	HANDLE hToken;	LUID Val;	TOKEN_PRIVILEGES tp;	OpenProcessToken(HANDLE(-1), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);	LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Val);	tp.PrivilegeCount = 1;	tp.Privileges[0].Luid = Val;	tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;	AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof (tp), NULL, NULL);	CloseHandle(hToken);	return 1;}int main(int argc, CHAR* argv[]){	GH::Process process;	GH::MemWorker memory;	process.FindProcessID(GH::string(TEXT("game.exe")));	DWORD PID = process.GetPID();	if (PID == 0)	{		printf("Run game first!\n");		system("PAUSE");		return 0;	}	printf("PID: %X\n", PID);	process.OpenProcess(PROCESS_ALL_ACCESS); // открываешь хэндл	memory.SetProcess(&process); // помещаешь указатель на объект Process в MemWorker        // ... дальше оперируешь с процессом игры	process.CloseProcess(); // закрываешь хэндл        return 0;}

Mem.zip

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

 

Ну начнем с того, что Dead Ricing 3 это x64 игра.

А трейнер собирается под x86,так еще и исходники тоже под x64 заточены.

Примерно так надо код фиксить и компилить трейнер надо под x64.

 

Исходники во вложении. Метод ReadPointer накидаешь сам думаю, если возникнут осложнения - пиши.

 

Спасибо))

"Старому" исходнику новое описание ReadPointer не помогло, теперь ковыряю новый ))

В нем, как я понял, FindPattern это поиск сигнатуры. Немного непонятно с предпоследним аргументом,  resultArray... Что ему передавать в майне?

Функция Write, что передавать аргументу destr? 

 

//buffer address where bytes will be stored

Примерный вариант перевода: Буффер адреса, где будут хранится байты. 

Либо у меня плохо с английским) Это буффер с байтами, которые будут записаны?

Еще аргумент count и bytesWrited. count - это количество байтов, которое будет записано. А что тогда bytesWrited?

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

Спасибо))

"Старому" исходнику новое описание ReadPointer не помогло, теперь ковыряю новый ))

В нем, как я понял, FindPattern это поиск сигнатуры. Немного непонятно с предпоследним аргументом,  resultArray... Что ему передавать?

Указатель на массив void* размером maxCount элементов.

void* results[5] = {0};FindPattern(..., results, 5);
Ссылка на комментарий
Поделиться на другие сайты

Привет!

Можешь показать исходный код метода mem->ReadPointer() ?

 

Да, конечно

DWORD MemReader::ReadPointer(DWORD base, DWORD* offsets, int count){	for (int i = 0; i < count - 1; i++)	{		base = Read(base + offsets[i], 4).toUINT32();	}	return base + offsets[count - 1];}

P.S. Учти, что тамошний FindPattern адаптирован для использования в DLL (VirtualQuery), чтобы использовать в трейнере, тебе придется чуток изменить его.

VirtualQuerryEx?

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

Я то уже удалил, это я по глупости своей сморозил) Там все правильно, VirtualQuery это метод класса, все правильно.

 

И еще... Можно как-то получать базовый адрес автоматически, а не ручками? А то он каждый раз меняется...

P.s. игра определенно любит скрипты)

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

Это тебе виднее, я в этом не особо разбираюсь)

 

Coder не разбирается в чем-то, связанном с программированием???)))

Сейчас помоему магма вулканическая развергентся))) :-D

 

Ведь мы это делали, в том уроке с MemReader. BaseAddress, помнишь?))

Разве нельзя это переделать под этот, уже обновленный исходник? (чтобы работал на 32 и 64 бит и без разницы в какой кодировке)

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

Coder не разбирается в чем-то, связанном с программированием???)))

Сейчас помоему магма вулканическая развергентся))) :-D

 

Ведь мы это делали, в том уроке с MemReader. BaseAddress, помнишь?))

Разве нельзя это переделать под этот, уже обновленный исходник? (чтобы работал на 32 и 64 бит и без разницы в какой кодировке)

Моя не понимать о чем ты говорить)

Если ты про получение базового адреса модуля, то там все просто вполне делается. Если DLL - GetModuleHandle, если внешний процесс, то можно через tlhelp32 сделать.

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

Изложи свою проблему понятнее и желательно с примерами кода (или иллюстрациями).

 

P.s. через tlhelp32 не выходит получить modBaseAddr...

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

Ну как же так можно, почему ты даже не смотришь в хидер файлы?

Там каждый метод документирован.

		/*		startAddress - address from which search begins		size - search size (maximum offset)		pattern - pattern for search		mask - mask of pattern for search		resultArray - pointer to an array that stores data		maxCount [opt] - limit count of found signatures		WARNING: size of resultArray should be not smaller than maxCount		You must open process with PROCESS_QUERY_INFORMATION and PROCESS_VM_READ rights before call this function		Return value: none		*/		virtual void FindPattern(void* startAddress, size_t size, PBYTE pattern, char* mask, void* resultArray[], size_t maxCount = 1);

Открой MemWorker.h, там каждый метод документирован. Тебе даже студия мою документацию в твоем видео вывела, но ты продолжаешь ее игнорировать...


tlhelp32 работает, я же тебе уже говорил, что компилить надо в x64 режиме.

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

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

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

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