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

zorinchel

Стажёры
  • Постов

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

  • Посещение

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

  1. Есть код, который выводит текст поверх приложения

    Спойлер
    
    #include <d3d9.h>
    #include <d3dx9.h>
    #include <d3dx9core.h>
    #pragma comment(lib,"d3d9.lib")
    #pragma comment(lib, "winmm")
    #pragma comment(lib, "D3dx9.lib")
     
    typedef HRESULT(__stdcall* PRESENT9)(IDirect3DDevice9* pDevice, const RECT*, const RECT*, HWND, void*);
     
     
    PRESENT9 g_D3D9_Present = 0;
    BYTE g_codeFragment_p9[5] = { 0, 0, 0, 0, 0 };
    BYTE g_jmp_p9[5] = { 0, 0, 0, 0, 0 };
    DWORD present9 = 0;
    bool indicator = 0;
    D3DRECT rec = { 10, 10, 160, 240 }; //menu size
    ID3DXFont* m_font = 0;
    RECT fontRect = { 10, 15, 120, 120 };
    D3DCOLOR fontColor = 0;
    D3DCOLOR bkgColor = 0;
     
     
    void DrawIndicator(void* pDevice)
    {
        IDirect3DDevice9* dev = (IDirect3DDevice9*)pDevice; //get the actual D3D-device
        dev->BeginScene();
     
        if (indicator)
     
        {
            HDC hdc = GetDC(0);
            RECT rect = { 20, 20, 200, 200 };
            SetTextColor(hdc, RGB(255, 0, 0));
            SetBkMode(hdc, TRANSPARENT);
            SetBkColor(hdc, RGB(0, 255, 0, 0));
            DrawText(hdc, L"Directx Hook", -1, &rect, DT_LEFT);
     
        }
        
     
     
        dev->EndScene();
    }
     
    //get the VMT and the hooking functions offsets
    void GetDevice9Methods()
    {
        IDirect3D9* d3d9_ptr;
        IDirect3DDevice9* pDevice;
        DWORD* vtablePtr;
        D3DPRESENT_PARAMETERS d3dpp;
        static HMODULE d3d9_handle = 0;
        HWND hWnd = CreateWindowExA(0, "STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0);
        d3d9_handle = LoadLibraryA("d3d9.dll");
        d3d9_ptr = Direct3DCreate9(D3D_SDK_VERSION);
        ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.Windowed = 1;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        IDirect3D9_CreateDevice(d3d9_ptr, 0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
        vtablePtr = (DWORD*)(*((DWORD*)pDevice));
        present9 = vtablePtr[17] - (DWORD)d3d9_handle;
        IDirect3DDevice9_Release(pDevice);
        IDirect3D9_Release(d3d9_ptr);
        FreeLibrary(d3d9_handle);
        CloseHandle(hWnd);
    }
     
    HRESULT HookedPresent9(IDirect3DDevice9* pDevice, const RECT* src, const RECT* dest, HWND hWnd, void* unused)
    {
        BYTE* codeDest = (BYTE*)g_D3D9_Present; //restore the original Present() bytes
        codeDest[0] = g_codeFragment_p9[0];
        *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p9 + 1));
        DrawIndicator(pDevice); //draw the menu
        DWORD res = g_D3D9_Present(pDevice, src, dest, hWnd, unused); //place the hook back
        codeDest[0] = g_jmp_p9[0];
        *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p9 + 1));
        return res;
    }
     
    void HookDevice9Methods()
    {
        DWORD g_savedProtection_p9 = 0;
        HMODULE hD3D9 = GetModuleHandleA("d3d9.dll"); //get the actual d3d9.dll address
        g_D3D9_Present = (PRESENT9)((DWORD)hD3D9 + present9); //calculate the actual Present() address
        g_jmp_p9[0] = 0xE9; //fill the codecave array ("jmp hooked_present")    
        DWORD addr = (DWORD)HookedPresent9 - (DWORD)g_D3D9_Present - 5; //calculate the hooked Present() address
        memcpy(g_jmp_p9 + 1, &addr, sizeof(DWORD)); //write it into the cave
        memcpy(g_codeFragment_p9, g_D3D9_Present, 5); //save the first 5 (jmp + addr) bytes of the original Present() 
        VirtualProtect(g_D3D9_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p9); //make the code writable\executable
        memcpy(g_D3D9_Present, g_jmp_p9, 5); //write the codecave in the beginning of the original Present()
    }
     
    //hooking thread main function
    DWORD WINAPI TF(LPVOID)
    {
        GetDevice9Methods(); //get the VMT and the offsets
        HookDevice9Methods(); //actually, hook the needed functions 
        return 0;
    }
     
    //hotkeys thread main function
    DWORD WINAPI KeyboardHook(LPVOID)
    {
        while (1)
        {
            if (GetAsyncKeyState(VK_F4))
            {
                indicator = !indicator;
                Beep(500, 200);
     
            }
            Sleep(100);
        }
        return 0;
    }
     
    int _stdcall DllMain(HINSTANCE hInst, DWORD ul_reason_for_call, void* lpReserved)
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH: //if we are attached into the game's process
     
     
            CreateThread(0, 0, TF, 0, 0, 0); //start D3D-hooking thread
            CreateThread(0, 0, KeyboardHook, 0, 0, 0); //start hotkeys thread
        }
        return 1;
    }

     

    вот этот участок выводит текст

    Спойлер
    
    if (indicator)
     
        {
            HDC hdc = GetDC(0);
            RECT rect = { 20, 20, 200, 200 };
            SetTextColor(hdc, RGB(255, 0, 0));
            SetBkMode(hdc, TRANSPARENT);
            SetBkColor(hdc, RGB(0, 255, 0, 0));
            DrawText(hdc, L"Directx Hook", -1, &rect, DT_LEFT);
     
        }

     

     

    выглядит это вот так

    directx hook

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

  2. В 14.11.2014 в 21:12, Xipho сказал:

    Вот такой алгоритм, если вкратце. Читай про указанные функции, и применяй на практике.

    а таким образом можно вывести не текст, а например окно другой программы?

  3. Привет!

    Может кто-нибудь подскажет как нормально вывести окно одной игры поверх другой, а то у меня получается совсем не то что нужно

    Спойлер
    
    #include <iostream>
    #include <windows.h>
    #include <string>
    #include <conio.h>
    #include <fstream>
    #include <iomanip>
    #include <stdio.h>
    #include <io.h>
    #include <fcntl.h>
    #include <mmsystem.h>
    #include <tlhelp32.h>
    #pragma comment(lib, "winmm")
    
    using namespace std; 
     
    DWORD WINAPI GtaSA_thread (LPVOID);
     
     
     
    DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved)
     
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
            CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL);
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return true;
    }
     
    
    
    DWORD WINAPI GtaSA_thread(LPVOID)
    
    {
    
    	{
    
    
    
    		for (;; Sleep(1000))
    		{
    			if (GetAsyncKeyState(VK_NUMPAD0) & 0x8000)
    
    			{
    				ShellExecute(NULL, "open", "c:\\GSR_1.5\\GAMES\\MK4\\MK4.exe", NULL, NULL, SW_SHOWMAXIMIZED);
    
    			}
    
    
    		}
    
    
    	}
    }

     

     

    вот что получилось в итоге 

     

  4. Спасибо конечно за ответы, но как-бы прошло более года =) Я разобрался во всем через месяц

    тогда объясни, как получать значения указателей, потом читать их как адрес, например: 0xBA1300 базовый адрес, значение в этом адресе 0xCF0000, плюс смещение 0x384 получаем адрес 0xCF0384 в нем значение 0xCA0002, в этом адресе значение 188, как до него добраться? 

  5. Немного бреда(но работать должно):

    DWORD WINAPI GtaSA_thread (LPVOID){while(true){INT value = *(DWORD*)(*(DWORD*)(*(DWORD*)(0xBA18FC)+0x384)+0x00);if(value==188){DWORD*var = (DWORD*)(0x6CC3B2);DWORD*var2 = (DWORD*)(0x6C9103);DWORD*var3 = (DWORD*)(0x406AF3);DWORD*var4 = (DWORD*)(0x6c9690);DWORD*var5 = (DWORD*)(0x6C9F1C);DWORD*var6 = (DWORD*)(0x6C8F10);*var -= 0x2c0000;*var2 -= 0x2c0000;*var3 -= 0x2c0000;*var4 -= 0x2c0000;*var5 -= 0x2c0000;*var6 -= 0x2c0000;}Sleep(500);}return 0;}

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

    NullAlex: Читай FAQ по тегам. И цитировать большие сообщения полностью - необязательно.

  6. Насколько я понял, тебе нужно взять из базового указателя значение, прибавить к нему смещение, считать из полученного значения следующий адрес, прибавить к нему смещение, и так далее.

    DWORD WINAPI GtaSA_thread (LPVOID){	DWORD* pl = (DWORD *)0xBA18FC;    DWORD value  = *pl; 	 CreateConsole ();  		{		 for (;;Sleep (1000))           		printf ("   ID = %p", *pl);	return 0;	 	}

    *p1 равно нужному адресу, а как дальше прочитать этот адрес и прибавить смещение?

  7. Если ты инжектишь эту длл-ку в адресное пространство игры, то на кой тебе сдались ReadProcessMemory и WriteProcessMemory?

    так тоже не получается

    DWORD WINAPI GtaSA_thread (LPVOID){		    DWORD Cp1 = *(DWORD*)(0xBA18FC);    DWORD Cp2 = *(DWORD*)(Cp1 + 0x384);	}

     

    так тоже не получается

    DWORD WINAPI GtaSA_thread (LPVOID){		    DWORD Cp1 = *(DWORD*)(0xBA18FC);    DWORD Cp2 = *(DWORD*)(Cp1 + 0x384);	}

    и так тоже

    DWORD p1 = ((DWORD)0xBA18FC);DWORD p2 = *(DWORD *)(p1 + 0x384);

    так мы к адресу 0xBA18FC прибавляем, а мне нужно к значению в адресе (которое тоже адрес), в общем я уже запутался 

  8. цепочка указателей в таблице

    9736d2b10812.jpg

    код такой

    на консоль выводятся p4 = 00000000, то есть не то что нужно, как мне в p4 получить нужное значение и сравнить его с 188, 

    NullAlex: Тег спойлера не просто так придуман. Читай правила и FAQ.

    #include <iostream>#include <windows.h>#include <string>#include <conio.h>#include <fstream>#include <iomanip>#include <stdio.h>#include <io.h>#include <fcntl.h>#include <mmsystem.h>#pragma comment(lib, "winmm")using namespace std;  DWORD WINAPI GtaSA_thread (LPVOID);   DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) {    switch (ul_reason_for_call)    {    case DLL_PROCESS_ATTACH:        CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL);    case DLL_THREAD_ATTACH:    case DLL_THREAD_DETACH:    case DLL_PROCESS_DETACH:        break;    }    return true;} void CreateConsole (){int hConHandle = 0;HANDLE lStdHandle = 0;FILE *fp = 0;AllocConsole ();SetConsoleTitle ("ID   ");lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE);hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT);fp = _fdopen (hConHandle, "w");*stdout = *fp;setvbuf (stdout, NULL, _IONBF, 0);}DWORD WINAPI GtaSA_thread (LPVOID){		DWORD base = 0xBA18FC;	DWORD p1 = 0;	DWORD p2 = 0;	DWORD p3 = 0;	DWORD p4 = 0;	DWORD old_prot = 0;	VirtualProtectEx(GtaSA_thread, (LPVOID)base, sizeof(base), PAGE_EXECUTE_READWRITE, &old_prot); 	ReadProcessMemory(GtaSA_thread, (LPVOID)base, &p1, sizeof(base), NULL);//прочитали, записали в p1	p2 = p1 + 0x384;// прибавили смещение	ReadProcessMemory(GtaSA_thread, (LPVOID)p2, &p3, sizeof(p2), NULL);//прочитали адрес p2, записали в p3	p3 = p2 + 0x00;	ReadProcessMemory(GtaSA_thread, (LPVOID)p3, &p4, sizeof(p3), NULL);	 	if (p4 == 188)	{// если равно, то	 DWORD*var =  (DWORD*)(0x6CC3B2);	 DWORD*var2 = (DWORD*)(0x6C9103);         DWORD*var3 = (DWORD*)(0x406AF3);	 DWORD*var4 = (DWORD*)(0x6c9690);	 DWORD*var5 = (DWORD*)(0x6C9F1C);	 DWORD*var6 = (DWORD*)(0x6C8F10);		*var  -= 0x2c0000;	*var2 -= 0x2c0000;	*var3 -= 0x2c0000;	*var4 -= 0x2c0000;	*var5 -= 0x2c0000;	*var6 -= 0x2c0000;	WriteProcessMemory(GtaSA_thread, (void*)var, var, sizeof(4), NULL);WriteProcessMemory(GtaSA_thread, (void*)var2, var2, sizeof(4), NULL);WriteProcessMemory(GtaSA_thread, (void*)var3, var3, sizeof(4), NULL);WriteProcessMemory(GtaSA_thread, (void*)var4, var4, sizeof(4), NULL);WriteProcessMemory(GtaSA_thread, (void*)var5, var5, sizeof(4), NULL);WriteProcessMemory(GtaSA_thread, (void*)var6, var6, sizeof(4), NULL);	}	 CreateConsole ();     		{		 for (;;Sleep (1000))           		printf ("   ID = %p", p4);	return 0;	 	}	            }
×
×
  • Создать...

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

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