最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

圖形編程丨圖形繪制基礎(chǔ)imgui篇—D3D9 HOOK 創(chuàng)建內(nèi)部Imgui窗口

2022-06-09 20:15 作者:rkvir逆向工程學(xué)院  | 我要投稿

作者:小阿栗

Imgui又稱為Dear ImGui,它是與平臺(tái)無關(guān)的C++輕量級(jí)跨平臺(tái)圖形界面庫,沒有任何第三方依賴,可以將Imgui的源碼直接加到項(xiàng)目中使用,也可以編譯成dll, Imgui使用DX或者OpenGL進(jìn)行界面渲染,Imgui主要用于游戲行業(yè)。

這里我們需要用到兩個(gè)工具Detours-master(微軟的hook庫)和imgui-master,主要講D3D9HOOK。


我們先來創(chuàng)建一個(gè)DLL項(xiàng)目。步驟如下:

1.選擇新建項(xiàng)目


2.選擇Windows桌面->動(dòng)態(tài)鏈接庫(DLL)->D3D9HOOK,點(diǎn)擊確定


3.刪除framework.h、pch.h以及pch.cpp文件。添加一個(gè)dllmain.h頭文件


4.dllmain.cpp中要包含頭文件添加#include <Windows.h>



5. 配置

5.1 選擇屬性



5.2 修改運(yùn)行庫以及Spectre緩解,選擇應(yīng)用



5.3 配置include路徑,點(diǎn)擊“宏”,搜索DX,根據(jù)地址找到文件位置,將 $(DXSDK_DIR)include填入,應(yīng)用



5.4 搜索DX,將$(DXSDK_DIR)Lib填入,搜索$(platformTarget),將$(DXSDK_DIR)lib\$(platformTarget)填入,應(yīng)用

(圖片注釋:配置好會(huì)自動(dòng)匹配x86/x64不需要再改)



5.5 新增d3d9.lib,d3dx9.lib這兩個(gè)依賴項(xiàng),應(yīng)用


6. 配置好環(huán)境后,編譯HOOK庫(編譯x86和x64兩個(gè)版本)

X86:找到Visual Studio2017,打開“x86 Native Tools Prompt for VS 2017”,然后cd到路徑里nmake進(jìn)行編譯



X64:找到Visual Studio2017,打開“適用于VS 2017的 x64 本機(jī)工具命令提示”,然后cd到路徑里nmake進(jìn)行編譯


7.打開項(xiàng)目文件夾



8.新建一個(gè)目錄Detours,將lib.x86、lib.x64和include復(fù)制過來(將lib.去掉方便后續(xù)識(shí)別)



9.新建篩選器,命名Detours



10.在Detours中添加現(xiàn)有項(xiàng),選定兩個(gè)頭文件detours.h和detver.h



11.配置lib庫

11.1選擇屬性



11.2 編輯包含目錄,宏-包含目錄-$(ProjectDir)Detours\include,應(yīng)用



11.3編輯附加庫目錄,宏-附加庫目錄-$(ProjectDir)Detours\Lib\$(platformTarget),應(yīng)用



11.4 編輯附加依賴項(xiàng),添加detours.lib,應(yīng)用


11.5 不使用預(yù)編譯頭


12.配置imgui

12.1在D3D9HOOK目錄下,新建imgui文件夾,將imgui-master中backends里imgui_impl_dx9.cpp、imgui_impl_dx9.h和imgui_impl_win32.cpp、imgui_impl_win32.h;及主目錄下所有.cpp和.h都復(fù)制到imgui文件夾中


12.2新建篩選器,命名imgui



12.3在imgui中添加現(xiàn)有項(xiàng),選定目錄下所有文件



12.4.dllmain.h中包含導(dǎo)進(jìn)來的所有頭文件



13.主線程imgui窗口的實(shí)現(xiàn)

typedef HRESULT (WINAPI * FuncReset)(IDirect3DDevice9 *pIDirect3DDevice9,D3DPRESENT_PARAMETERS *pPresentationParameters);

typedef?HRESULT (WINAPI *??FuncEndScene)(IDirect3DDevice9 *pIDirect3DDevice9);

typedef LRESULT(WINAPI * FuncWndProc)(const HWND, UINT, WPARAM, LPARAM);


HWND g_hWnd = NULL;

IDirect3D9 * g_IDirect3D9;

D3DPRESENT_PARAMETERS g_d3dpp;

IDirect3DDevice9* g_pIDirect3DDevice9;


FuncReset OldReset;

FuncEndScene OldEndScene;

FuncWndProc OldWndProc;


DWORD * dwDeviceVirtualTable = NULL;


extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


LRESULT WINAPI GrkWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

if (ImGui_ImplWin32_WndProcHandler(hWnd, message, wParam, lParam))

{

????return TRUE;

}

return CallWindowProc(OldWndProc, hWnd, message, wParam, lParam);

}


VOID StartHook(PVOID * OldFunctionAddr, PVOID NewFunctionAddr)

{

DetourTransactionBegin();

DetourUpdateThread(GetCurrentThread());

DetourAttach(OldFunctionAddr, NewFunctionAddr);

DetourTransactionCommit();

}


VOID UnHook(PVOID * OldFunctionAddr, PVOID NewFunctionAddr)

{

DetourTransactionBegin();

DetourUpdateThread(GetCurrentThread());

DetourDetach(OldFunctionAddr, NewFunctionAddr);

DetourTransactionCommit();

}


HRESULT WINAPI GrkReset(IDirect3DDevice9 *pIDirect3DDevice9, D3DPRESENT_PARAMETERS *d3dpp)

{

UnHook((PVOID*)(&OldReset), GrkReset);

ImGui_ImplDX9_InvalidateDeviceObjects();

HRESULT bRet = pIDirect3DDevice9->Reset(d3dpp);

ImGui_ImplDX9_CreateDeviceObjects();

StartHook((PVOID*)(&OldReset), GrkReset);

return bRet;

}


HRESULT WINAPI GrkEndScene(IDirect3DDevice9 *pIDirect3DDevice9)

{

UnHook((PVOID*)(&OldEndScene), GrkEndScene);

static bool bFlag = TRUE;

if (bFlag)

{

????bFlag = FALSE;

????IMGUI_CHECKVERSION();

????ImGui::CreateContext();

????ImGuiIO & io = ImGui::GetIO();

????io.ConfigFlags = ImGuiConfigFlags_NoMouseCursorChange;

????io.WantSaveIniSettings = false;

????io.IniFilename = NULL;

????ImGui::StyleColorsClassic();

????ImFontConfig imfConfig;

????imfConfig.FontDataOwnedByAtlas = false;

????ImGui_ImplWin32_Init(g_hWnd);

????ImGui_ImplDX9_Init(pIDirect3DDevice9);

????OldWndProc = (WNDPROC)SetWindowLongPtr(g_hWnd, GWL_WNDPROC, (LONG_PTR)GrkWndProc);

}

HRESULT hRet = pIDirect3DDevice9->EndScene();


ImGui_ImplDX9_NewFrame();

ImGui_ImplWin32_NewFrame();

ImGui::NewFrame();

ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_FirstUseEver);

ImGui::SetNextWindowSize(ImVec2(300, 300));

ImGui::Begin("GrkTools");

ImGui::End();

ImGui::EndFrame();

ImGui::Render();

ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());


StartHook((PVOID*)(&OldEndScene), GrkEndScene);

return hRet;

}


DWORD WindowThreadCallBack(LPVOID lpBuffer)

{

g_hWnd = FindWindowA("Direct3DWindowClass", NULL);

g_IDirect3D9 = Direct3DCreate9(D3D_SDK_VERSION);

memset(&g_d3dpp, 0, sizeof(g_d3dpp));

g_d3dpp.Windowed = TRUE;

g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

g_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

g_d3dpp.EnableAutoDepthStencil = TRUE;

g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;


HRESULT hRet = g_IDirect3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &g_d3dpp, &g_pIDirect3DDevice9);


dwDeviceVirtualTable = (DWORD *)*(DWORD *)g_pIDirect3DDevice9;

OldReset = (FuncReset)dwDeviceVirtualTable[16];

OldEndScene = (FuncEndScene)dwDeviceVirtualTable[42];


StartHook((PVOID*)(&OldReset), GrkReset);

StartHook((PVOID*)(&OldEndScene), GrkEndScene);


return 0;

}


BOOL APIENTRY DllMain( HMODULE hModule,

DWORD??ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

????CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)WindowThreadCallBack, NULL, NULL, NULL);

????break;

case DLL_THREAD_ATTACH:

????break;

case DLL_THREAD_DETACH:

????break;

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}


14.測(cè)試

14.1打開文件夾,把動(dòng)態(tài)鏈接庫D3D9HOOK.dll粘貼到桌面上


14.2打開pick,啟動(dòng)代碼注入器,將動(dòng)態(tài)鏈接庫D3D9HOOK.dll進(jìn)行注入

測(cè)試成功:在pick左上角出現(xiàn)窗口<span

這樣,就手動(dòng)創(chuàng)建了一個(gè)基礎(chǔ)的imgui的框架<span

圖形編程丨圖形繪制基礎(chǔ)imgui篇—D3D9 HOOK 創(chuàng)建內(nèi)部Imgui窗口的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
盐亭县| 分宜县| 山阴县| 手游| 彩票| 庆城县| 疏勒县| 印江| 泸水县| 砚山县| 龙川县| 乌海市| 万荣县| 朝阳县| 乐亭县| 湟中县| 沐川县| 吕梁市| 敦煌市| 茶陵县| 徐闻县| 长乐市| 明光市| 崇仁县| 桐柏县| 饶阳县| 普安县| 扬州市| 饶河县| 霍邱县| 桐庐县| 临江市| 龙陵县| 翁牛特旗| 凤翔县| 淮阳县| 高阳县| 泗水县| 泾阳县| 鹤庆县| 育儿|