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

Coder

Ветераны
  • Постов

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

  • Посещение

  • Победитель дней

    13

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

  1. статья на английском, нашел на русском.

    Переключил на х64, теперь насколько я знаю, собирается проект под х64. Правда только дебаг, релиз не хочет. "Доступ к ликвидированному объекту не возможен" при компиляции.

    Ну да ладно, компилю в дебаге. Не думаю что это что-то меняет. tlhelp32 по прежнему не в какую.

    MODULEENTRY32 game = { 0 };printf("Process base: 0x%X, ", game.modBaseAddr);

    вот код. Прописал, конечно же, #include <tlhelp32>. При компиле выдается 0х0

    Ну а как ты снимок создаешь показать не хочешь? Код перечисления где?

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

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

    		/*		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 режиме.

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

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

     

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

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

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

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

  4. Спасибо))

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

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

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

    void* results[5] = {0};FindPattern(..., results, 5);
  5. Ну начнем с того, что 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
  6. нее) я имею ввиду без d3d9 и т.д

    просто используя api игры

    Тогда реверс инжиниринг тебе в помощь) Ну или SDK по игре (если такой имеется).

     

    Касательно твоего основного вопрососа.

    Описываешь указатель на функцию и потом просто через указатель вызываешь функцию.

    Вот кусок кода из моего проекта, возможно тебе поможет:

    typedef void (__thiscall IRenderer::*func)(); // тип мембер-функции интерфейса IRendererfunc origDraw = 0; // указатель на функциюIRenderer* render = 0; // указатель на экземпляр класса IRendererHINSTANCE hDLL = 0;DWORD* ReadPtr(DWORD base, DWORD offset){	return *(DWORD**)(base + offset);}void HookedDraw(void){        // рисуем что хотим	render->TextToScreenColor(1, 1, 255, 0, 0, 255, "Hello world!\nThis is IRenderer::Update hook!");	//printf("HookedDraw!\n");	(render->*origDraw)(); // но не забываем вернуть управление оригинальной функции}void vTableHook(DWORD* vTable, short index, DWORD value){	DWORD oldProt = 0;	VirtualProtect(vTable, index * 4, PAGE_READWRITE, &oldProt);	vTable[index] = value;	VirtualProtect(vTable, index * 4, oldProt, &oldProt);}DWORD WINAPI Thread(LPVOID){	CreateConsole();	DWORD* ptr = ReadPtr((DWORD)GetModuleHandleA("CryGame.dll"), 0x00118564);	DWORD* ptr2 = ReadPtr((DWORD)ptr, 0x48);	CXGame* game = (CXGame*)ptr2; // получили указатель на главный класс игры	ISystem* sys = game->GetSystem(); // получили указатель на основную подсистему игры	render = sys->GetIRenderer(); // получили указатель на рендерер игры	DWORD* vTable = *(DWORD**)render; // получили указатель на vTable экзепляря класса IRenderer	origDraw = (func&)vTable[15]; // получили указатель на оригинальную функцию отрисовки (IRenderer::Update)	vTableHook(vTable, 15, (DWORD)HookedDraw); // подменяем указатель оригинальной IRenderer::Update на нашу HookedDraw	getch(); // ждем пока в консоли нажмут любую клавишу	vTableHook(vTable, 15, (DWORD&)origDraw); // снимаем хук	FreeConsole(); // закрываем консоль	FreeLibraryAndExitThread(hDLL, 0); // выгружаем DLL и завершаем поток	return 0;}
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){	if (fdwReason == DLL_PROCESS_ATTACH)	{		hDLL = hinstDLL;		DisableThreadLibraryCalls(hinstDLL);		CreateThread(0, 0, Thread, 0, 0, 0);	}	return 1;}

     

    Вообще загугли все это, как вызывать функции на Си через указатели, вот здесь неплохо расписано - http://amse.ru/courses/cpp2/2011_04_11.html .

  7. Всё просто.

    У тебя в функции FindSignature выполняется VirtualQueryEx к твоему процессу если что:

    VirtualQueryEx(System.Diagnostics.Process.GetCurrentProcess().Handle,

    А здесь должен быть процесс Heroes 3. Вот и думай теперь, почему у тебя не получается.

    И во первых, FindSignature должен возвращать не int, так как адреса у нас хранятся в виде unsigned int - uint.

    Во вторых FindSignature по логике твоего кода - первым параметром должен получать хэндл на открытый процесс Heroes 3 и вторым параметром сигнатуру.

    uint FindSignature(HANDLE hProcess, byte[] signature)....

    P.S. Тебе нет нужды постоянно открывать и закрывать хэндл на процесс игры, один раз открывай - пользуйся им и закрывай  (когда он не нужен).

  8. хм сейчас попробую, я собираюсь использовать функции игры вместо d3d hook для создания меню :D

    Не понял, что здесь смешного.

    Перехватывай через vTable - EndScene (DX 9, если не ошибаюсь индекс в vTable будет 42) либо Present (DX 10, 11, индекс Present загуглишь сам думаю) и перед тем как вернуть управление оригинальной функции рисуй своё меню, всё просто.

  9. NullAlex, и тебя с наступающим! Желаю хорошо отменить в семейном кругу или в кругу друзей!

    Всем желаю всех благ в наступающем, 2015м году! Желаю форумчанам: творческих в успехов, обрести смысл жизни и найти своё предназначение (для тех, кто пока не определился).

    Помните - ищущий всегда найдет, эта поговорка существует еще с древних времен (по некоторым источникам с 15-16 веков), а значит не нужно сдаваться и отчаиваться!

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

     

    А теперь, что касается 31 декабря - уважаемые форумчане, фраза: "Чрезмерное употребление алкоголя вредит вашему здоровью" не пустые слова.

    Поэтому не стоит пить больше, чем нужно (если есть такой соблазн). Празднуйте и веселитесь!

    Спасибо за внимание, всем удачи!

  10. Нет, чтоб хотябы шаблон сделал для остальных читов. Т.е. показал как "размножить" эту функцию и как ее потом включать отдельно от остальных. Не думаю что это так уж прям долго. Минуты 2-3...

    В смысле размножить? У него же есть функция FindSignature или как-то так - вот и вызывай ее когда нужно. А вообще писать трейнеры на .NET это просто полнейшее безумие, лучше уж на дельфях попробуй.

  11. Тебе нужно использовать альфа-канал, который отвечает за прозрачность.

    RGBA формат.

    Первые 3 это код цвета (Красный, Зеленый, Синий), а посл. это А - Альфа канал (от 0 до 255 регулируется уровень прозрачности, если я конечно ничего не путаю).

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

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

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