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

helldrg

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

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

  • Посещение

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

    3

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

  1. LIRW

    Я попробовал как Вы написали, все равно крашит
     

    Скрытый текст
    
    push eax
      mov eax,[ecx+10]
      mov eax,[eax+8]
      cmp eax,'play'
      jne code
      //mov dword ptr [ecx+00000134],(float)100
      jmp code
    code:
      pop eax

     

    Даже в этом куске крашит, тут же ничего не изменятся для того что бы крашило

    И почему бывает невозможно скрипт активировать, нажимаешь на него, а крестик не ставится

    Сейчас готовой функцией попробую сравнить

  2. Здравствуйте! Посмотрел я видео про реализацию фильтра "свой чужой". Чтобы его сделать необходимо различие в структурах найти. Я нашел в виде строки:

    Скрытый текст

     

    download?id=VqusuiMaq8LaCp56nPIgeMmmjWdp

     

    Почитав форумы пришел к выводу, что можно писать так:

    cmp word ptr[eax+4],'te' и cmp dword ptr[eax+4],'team'


    Начало у всех одинаковое, надо делать смещение:

    cmp dword ptr[eax+8],'play'


    Но почему то программа крашится после того как запускаю скрипт
    И почему то после перезапуска CE нельзя включить скрипт. Подскажите в чем дело
    Вот код:

    Скрытый текст
    
    newmem:
      push eax
      mov eax,[ecx+10]
      cmp dword ptr[eax+8],'play'
      jne code
      mov dword ptr [ecx+00000134],(float)100
      jmp code
    code:
      pop eax
      fld dword ptr [ecx+00000134]
      jmp return
    INJECT:
      jmp newmem
      nop

     

  3. Dino
    Спасибо большое еще раз! Я вроде как разобрался, теперь использую E9 - это наверно far jmp =)

    Скрытый текст
    
    BYTE *bytes = new BYTE[20];
                DWORD jmpAddress = allocAddress - (baseAddress + offsetAddress[2]) - 5;
                BYTE *b = new BYTE[4];
                memcpy((void*)b, &jmpAddress, 4);
                bytes[0] = '\xe9';
                bytes[1] = b[0];
                bytes[2] = b[1];
                bytes[3] = b[2];
                bytes[4] = b[3];
                bytes[5] = '\x90';
                bytes[6] = '\x90';
                if (Process.WriteMemory(baseAddress + offsetAddress[2], (LPVOID)bytes, 7) == FALSE)
                    wsprintf(buffer, "Ошибка!");
                jmpAddress = (baseAddress + offsetAddress[2]) - allocAddress - 19 + 7;
                memcpy((void*)b, &jmpAddress, 4);
                bytes[0] = '\xc7';
                bytes[1] = '\x46';
                bytes[2] = '\xc8';
                bytes[3] = '\x00';
                bytes[4] = '\x00';
                bytes[5] = '\x16';
                bytes[6] = '\x44';
                bytes[7] = '\xd9';
                bytes[8] = '\x46';
                bytes[9] = '\xc8';
                bytes[10] = '\x8a';
                bytes[11] = '\x5c';
                bytes[12] = '\x24';
                bytes[13] = '\x17';
                bytes[14] = '\xe9';
                bytes[15] = b[0];
                bytes[16] = b[1];
                bytes[17] = b[2];
                bytes[18] = b[3];
                if (Process.WriteMemory(allocAddress, (LPVOID)bytes, 19) == FALSE)
                    wsprintf(buffer, "Ошибка!");

     

    Вот такое чудовище получилось, но оно работает :DD Спасибо за терпение к моей не образованности!!! Спасибо kengу за замечательные уроки!!!

    • Плюс 1
  4. Сложность в том состоит, что вот к примеру:

    05F70000 - E9 05F70000           - jmp 05F7F70A

    если писать E9  EB FE(я так понял это как раз и будет зацикливание, потому что <Адрес куда прыгаем> - <Адрес от куда прыгаем>  равняется 0, а - 2 байта тут говорят равняется EB FE), то еще появятся 00 00.
    Че то я вообще не доганяю

  5. Здравствуйте! Хотел записать переход по jmp даже порядок записи изменил байтов, заметил такую особенность:

                       Bytes                          Opcode  

    088A0000 - E9 088A0000           - jmp 088A8A0D


    В Bytes все правильно записывается 0xe9 - команда безусловного перехода и адрес перехода 088A0000. В итоге должно получится зацикливание (только сейчас заметил =)). Но в Opcode адрес перехода другой 088A8A0D. Почему так?

  6. Здравствуйте! Уже месяц бьюсь над этим вопросом но, либо я недалекий, либо структура игры хитрая. Вообщем:
    1. Command & Conquer: Generals
    2. v1.8
    3. Repack в антологии by МОРОЗОВ, в описаннии - таблетка не требуется, поэтому не знаю какая она

    4. d3d menu в пункте 7 опишу
    5. лимит 500 рублей на покупку в стиме игр, шмоток с торговой площадки, как пожелаете
    6. месяц
    7. Исходник на с++, который компилируется в VS13 на Windows 8.1. Опция: вывод картинок, предположим для меню в игре(режим игры на весь экран).
    Суть в том, что нужно работать с vTable, которая возможно пересоздаётся.

  7. 2 часа назад, keng сказал:

    переустанавливать хук в новое место.

    То есть vTable функций смещается и нужно их найти заново, например, создать d3d устройство скопировать адреса нужных функций и удалить устройство?
    Все таки интересно,  что бы посмотреть адрес указателя на устройство надо писать так: printf("pDevice: %x\n", *(DWORD*)pDevice); ?

     

    Я пробовал не сразу vTable находить, а после, по нажатию горячей кнопки, но таблица не находится

  8. Здравствуйте! В перехваченной функции HookPresent я отрисовываю спрайт. В простом приложении на d3d8 после инжекта работает отлично, но вот с игрой не работает. После инжекта в игре во время заставки в самом начале спрайт отображается, но когда ролик заканчивается картинка исчезает. Подскажите в чем дело, может устройство пересоздавать  надо? Игра C&C:Generals v1.8 
    P.S.: что бы посмотреть адрес указателя на устройство надо писать так: printf("pDevice: %x\n", *(DWORD*)pDevice); ?

  9. 1 минуту назад, keng сказал:

    Тебе хочется разобраться вообще в алгоритме работы всей этой штуки, или только в конкретной функции?

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

  10. Просто хотелось бы не просто копипастить или качать detour и им пользоваться, а разобраться во всем процессе, ведь люди которые к примеру разрабатывают велосипеды новые, они сперва изучают старые, собирают их а потом начинают усовершенствовать =)
    Если бы объяснили бы функцию подробно я был бы премного благодарен, а если бы еще и кенг разобрался бы почему его пример не работает так было бы идеально =)

  11. 20 минуты назад, keng сказал:

    в нижнем-правом углу сообщения стрелочки - плюс и минус.

    У  меня их нету(

     

    20 минуты назад, keng сказал:

    по-моему, тот же что и у меня - в начало функции записывается ассемблерная инструкция вида "jmp addr", где addr - адрес перехваченной функции в нашей dll.

    Вы через heap искали в первом уроке
    А можно по подробней о функции рассказать, зачем это условие нужно, цикл в конце с нопами какой то появляется

    Мне ваш пример нравился, там просто создавали d3d, находили d3d процесса, делали указатель d3d->d3d процесса все легко и понятно было, вот только почему то не везде этот пример работает( 
    я поэтому тему и создал что бы разобраться почему не работает =)

  12. Теперь все работает! Вы какой то другой метод используете. Можете вот эту функцию расписать, что и зачем делает:
     

    Скрытый текст
    
    void* DetourCreate(BYTE *src, const BYTE *dst, const int len)
    {
    	BYTE *jmp;
    	DWORD dwback, dwold;
    	DWORD jumpto, newjump;
    	VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);
    	if (src[0] == 0xE9)
    	{
    		jmp = (PBYTE)malloc(10);
    		VirtualProtect(jmp, 10, PAGE_EXECUTE_READWRITE, &dwold);
    		jumpto = (*(DWORD*)(src + 1)) + ((DWORD)src) + 5;
    		newjump = (jumpto - (DWORD)(jmp + 5));
    		jmp[0] = 0xE9;
    		*(DWORD*)(jmp + 1) = newjump;
    		jmp += 5;
    		jmp[0] = 0xE9;
    		*(DWORD*)(jmp + 1) = (DWORD)(src - jmp);
    	}
    	else
    	{
    		jmp = (PBYTE)malloc(5 + len);
    		VirtualProtect(jmp, 5 + len, PAGE_EXECUTE_READWRITE, &dwold);
    		memcpy(jmp, src, len);
    		jmp += len;
    		jmp[0] = 0xE9;
    		*(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5;
    	}
    	src[0] = 0xE9;
    	*(DWORD*)(src + 1) = (DWORD)(dst - src) - 5;
    	for (int i = 5; i < len; i++)
    		src[i] = 0x90;
    	VirtualProtect(src, len, dwback, &dwback);
    	return (jmp - len);
    }

     

    А тут где-нибудь спасибо можно поставить?

  13. 6 часов назад, keng сказал:

    Так, ок. У меня Win10 x64 и мой же код работает некорректно. Хук отрабатывает, но что-то не так с перехваченной функцией, которой я подменяю оригинальную Present(). Моя рушит стек при вызове. Буду разбираться, но это займет какое-то время.

    Если бы еще видео сделали бы по фиксу или лучше стрим какой нибудь было бы шикарно =)

  14. Скрытый текст
    
    #include <Windows.h>
    #include "Include\d3d9.h"
    #include "Include\d3dx9.h"
    #include <io.h>
    #include <stdio.h>
    
    #pragma comment(lib, "d3d9.lib")
    
    typedef IDirect3D9* (STDMETHODCALLTYPE *DIRECT3DCREATE9)(UINT);
    typedef HRESULT(WINAPI* tPresent)(LPDIRECT3DDEVICE9 pDevice, CONST RECT*, CONST RECT*, HWND, LPVOID);
    typedef HRESULT(WINAPI* tReset)(LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters);
    typedef DWORD(STDMETHODCALLTYPE *GETPROCESSHEAPS)(DWORD, PHANDLE);
    
    static DWORD vtableFrag9[] = { 0, 0, 0, 0 };
    static DWORD* presentPtr = 0;
    static DWORD* resetPtr = 0;
    static DWORD offsetPresent = 0;
    static DWORD offsetReset = 0;
    static tPresent g_D3D9_Present = 0;
    static tReset g_D3D9_Reset = 0;
    LPDIRECT3DDEVICE9 npDevice;
    
    bool indicator = 0;
    
    //DWORD*vtbl = 0;
    //DWORD table;
    //
    //BOOL bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
    //{
    //	for (; *szMask; ++szMask, ++pData, ++bMask)
    //		if (*szMask == 'x' && *pData != *bMask)
    //			return false;
    //	return (*szMask) == NULL;
    //}
    //DWORD FindPattern(DWORD dwAddress, DWORD dwLen, BYTE *bMask, char * szMask)
    //{
    //	for (DWORD i = 0; i < dwLen; i++)
    //		if (bCompare((BYTE*)(dwAddress + i), bMask, szMask))
    //			return (DWORD)(dwAddress + i);
    //
    //	return 0;
    //}
    
    void CreateConsole()
    {
    	int hConHandle = 0;
    	HANDLE lStdHandle = 0;
    	FILE *fp;
    	AllocConsole();
    	SetConsoleTitle("Generals console!");
    	lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    	hConHandle = _open_osfhandle(PtrToUlong(lStdHandle), 0);
    	fp = _fdopen(hConHandle, "w");
    	*stdout = *fp;
    	setvbuf(stdout, NULL, _IONBF, 0);
    }
    
    
    void DrawIndicator(LPVOID self)
    {
    	IDirect3DDevice9* dev = (IDirect3DDevice9*)self;
    	dev->BeginScene();
    	D3DRECT rec = { 10, 10, 30, 30 };
    	D3DCOLOR color = 0;
    	if (indicator)
    	{
    		color = D3DCOLOR_XRGB(0, 255, 0);
    	}
    	else
    	{
    		color = D3DCOLOR_XRGB(255, 0, 0);
    	}
    	dev->Clear(1, &rec, D3DCLEAR_TARGET, color, 1.0f, 0);
    	dev->EndScene();
    }
    
    HRESULT WINAPI hkPresent(LPDIRECT3DDEVICE9 pDevice, CONST RECT* src, CONST RECT* dest, HWND hWnd, LPVOID unused)
    {
    	while (!npDevice)
    	{
    		npDevice = pDevice;
    	}
    	DrawIndicator(pDevice);
    	return g_D3D9_Present(pDevice, src, dest, hWnd, unused);
    }
    
    HRESULT WINAPI hkReset(LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters)
    {
    	return g_D3D9_Reset(pDevice, pPresentationParameters);
    }
    
    BOOL SearchHeap(HANDLE heap)
    {
    	int vtableLenBytes = sizeof(DWORD) * 4;
    	PROCESS_HEAP_ENTRY mem;
    	mem.lpData = 0;
    	while (HeapWalk(heap, &mem))
    	{
    		if (mem.wFlags == PROCESS_HEAP_UNCOMMITTED_RANGE) continue;
    		DWORD* p = (DWORD*)mem.lpData;
    		for (int i = 0; i < (int)(mem.cbData / sizeof(DWORD)); i++)
    		{
    			if (memcmp(p, vtableFrag9, vtableLenBytes) == 0)
    			{
    				presentPtr = p + 11;
    				resetPtr = p + 10;
    				offsetPresent = *presentPtr;
    				offsetReset = *resetPtr;
    				g_D3D9_Present = (tPresent)((DWORD*)offsetPresent);
    				g_D3D9_Reset = (tReset)((DWORD*)offsetReset);
    				break;
    			}
    			p++;
    		}
    		if (presentPtr != 0) break;
    	}
    	return(presentPtr != 0);
    }
    
    void CheckAndHookPresent9()
    {
    	if (presentPtr != 0 && (*presentPtr) == (DWORD)hkPresent) return;
    	HANDLE heap = 0;
    	HMODULE hKern = GetModuleHandleA("kernel32.dll");
    	GETPROCESSHEAPS getProcessHeaps = (GETPROCESSHEAPS)GetProcAddress(hKern, "GetProcessHeaps");
    	if (getProcessHeaps != 0)
    	{
    		HANDLE heaps[1000];
    		int numHeaps = (getProcessHeaps)(1000, heaps);
    		for (int k = 0; k < numHeaps; k++)
    		{
    			heap = heaps[k];
    			if (SearchHeap(heap)) break;
    		}
    	}
    	else
    	{
    		heap = GetProcessHeap();
    		SearchHeap(heap);
    	}
    	HeapLock(heap);
    	if (presentPtr != 0)
    	{
    		(*presentPtr) = (DWORD)hkPresent;
    	}
    	if (resetPtr != 0)
    	{
    		(*resetPtr) = (DWORD)hkReset;
    	}
    	HeapUnlock(heap);
    }
    
    void CopyVMT9(DWORD* vtableFrag)
    {
    	HWND hWnd = CreateWindowA("STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0);
    	HMODULE hD3D9 = GetModuleHandleA("d3d9");
    	//DIRECT3DCREATE9 Direct3DCreate9 = (DIRECT3DCREATE9)GetProcAddress(hD3D9, "Direct3DCreate9"); lib add
    	IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION);
    	D3DDISPLAYMODE d3ddm;
    	d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
    	D3DPRESENT_PARAMETERS d3dpp;
    	ZeroMemory(&d3dpp, sizeof(d3dpp));
    	d3dpp.Windowed = 1;
    	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    	IDirect3DDevice9* d3dDevicee = 0;
    	d3d->CreateDevice(0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3dDevicee);
    
    	DWORD* vtablePtr = (DWORD*)(*((DWORD*)d3dDevicee));
    	for (int i = 0; i < 4; i++)
    	{
    		vtableFrag[i] = vtablePtr[i + 6]; //6ad21c70  6acdb5a0  6adaf540  6ad20760
    		
    	}
    	d3dDevicee->Release();
    	d3d->Release();
    	DestroyWindow(hWnd);
    }
    
    PBYTE HookVTableFunction(PDWORD* dwVTable, PBYTE dwHook, INT Index)
    {
    	DWORD dwOld = 0;
    	VirtualProtect((void*)((*dwVTable) + (Index * 4)), 4, PAGE_EXECUTE_READWRITE, &dwOld);
    
    	PBYTE pOrig = ((PBYTE)(*dwVTable)[Index]);
    	(*dwVTable)[Index] = (DWORD)dwHook;
    
    	VirtualProtect((void*)((*dwVTable) + (Index * 4)), 4, dwOld, &dwOld);
    	return pOrig;
    }
    
    bool hooked = 0;
    DWORD WINAPI TF(LPVOID lpParam)
    {
    	CopyVMT9(vtableFrag9);
    	CheckAndHookPresent9();
    	//DWORD hhD3D9 = (DWORD)LoadLibraryA("d3d9.dll");
    	//table = FindPattern(hhD3D9, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
    	//memcpy(&vtbl, (void*)(table + 2), 4);
    	//
    
    	while (!npDevice && !hooked)
    	{
    		Sleep(50);
    	}
    	hooked = !hooked;
    	
    	printf("npDevice: %x, g_D3D9_Present: %x, g_D3D9_Reset: %x\n",(DWORD*)npDevice, g_D3D9_Present, g_D3D9_Reset);
    	//printf("npDevice: %x, g_D3D9_Present: %x, g_D3D9_Reset: %x\n", (DWORD*)table, vtbl[17], vtbl[16]);
    	while (1)
    	{
    		Sleep(1000);
    		//printf("npDevice: %x, g_D3D9_Present: %x, g_D3D9_Reset: %x\n", (DWORD*)npDevice, g_D3D9_Present, g_D3D9_Reset);
    		HookVTableFunction((PDWORD*)npDevice, (PBYTE)hkReset, 16);
    		HookVTableFunction((PDWORD*)npDevice, (PBYTE)hkPresent, 17);
    	}
    	return 0;
    }
    
    DWORD WINAPI KeyboardHook(LPVOID lpParam)
    {
    	while (1)
    	{
    		if (GetAsyncKeyState(VK_F1))
    		{
    			indicator = !indicator;
    			Beep(500, 200);
    		}
    		Sleep(100);
    	}
    	return 0;
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    	{
    		CreateConsole();
    		CreateThread(0, 0, &TF, 0, 0, 0);
    		CreateThread(0, 0, &KeyboardHook, 0, 0, 0);
    	}
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return 1;
    }

     

    Вот так код у меня выглядит

  15. 41 минуты назад, keng сказал:

    PS: Простыни исходного кода лучше убирать под тег "спойлер".

    Я искал не нашел спойлер, похоже это скрытый текст

    Вот проект, и exe: http://rgho.st/8Cs76zJNp

    А вот как код в отладчике выглядит у вас и у меня:

    Скрытый текст

    6IaPnQju48gFkSmj0HFsgCu56kCkXh XtL5CQwF6hUUwFSZ2YZFFFCSthYlYW

    Изображения не работают, попробую так:

    https://monosnap.com/file/6IaPnQju48gFkSmj0HFsgCu56kCkXh

    https://monosnap.com/file/XtL5CQwF6hUUwFSZ2YZFFFCSthYlYW

    У вас функции подсвечиваются и вызов этих функций понятный call address. Естественно не везде такой вызов, но в туториале именно такой. А у меня в отладчике мало чего понятного + в asm я новичок(

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

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

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