imgui绘制菜单,
永远的神干货盘点
作者:小阿栗
Imgui又称为亲爱的ImGui:它是与平台无关的C轻量级跨平台图形界面库,没有任何第三方依赖,可以将Imgui的源码直接加到项目中使用,也可以编译成dll,Imgui使用高级的(豪华的简写)或者计算机图形学进行界面渲染,Imgui主要用于游戏行业。
这里我们需要用到两个工具弯路-高手(微软的钩库)和imgui-master,主要讲D3D9HOOK。
我们先来创建一个动态链接库项目。步骤如下:
1.选择新建项目
2.选择Windows操作系统操作系统桌面-动态链接库(DLL)- D3D9HOOK,点击确定
3.删除框架. h以及pch.cpp文件。添加一个dllmain.h头文件
4.dllmain.cpp中要包含头文件添加#包括
配置5.1 选择属性
5.2 修改运行库以及幽灵缓解,选择应用
5.3 配置包括路径,点击"宏",搜索DX,根据地址找到文件位置,将$(DXSDK_DIR)包括填入,应用
5.4 搜索DX,将$(DXSDK_DIR)Lib填入,搜索$(platformTarget),将$(DXSDK _ DIR)lib \ $(平台目标)填入,应用
(图片注释:配置好会自动匹配x86/x64不需要再改)
5.5 新增d3d9.lib,d3dx9.lib这两个依赖项,应用
配置好环境后,编译钩库(编译x86和x64两个版本)X86:找到Visual Studio2017,打开“对比2017年的x86原生工具提示",然后激光唱片到路径里编译器进行编译
X64:找到Visual Studio2017,打开"适用于VS 2017的x64本机工具命令提示",然后激光唱片到路径里编译器进行编译
7.打开项目文件夹
8.新建一个目录绕路,将lib.x86、lib.x64和包括复制过来(将解放号.去掉方便后续识别)
9.新建筛选器,命名便道
10.在便道中添加现有项,选定两个头文件绕路h和德特弗
11.配置解放运动库
11.1选择属性
11.2 编辑包含目录,宏-包含目录-$(项目目录)弯路\包括,应用
11.3编辑附加库目录,宏-附加库目录-$(项目目录)弯路\ Lib \ $(平台目标),应用
11.4 编辑附加依赖项,添加detours.lib,应用
11.5 不使用预编译头
12.配置imgui
12.1在d3d 9挂钩目录下,新建imgui文件夹,将imgui-master中后端里imgui_impl_dx9.cpp、imgui_impl_dx9.h和imgui_impl_win32.cpp、imgui _ impl _ win32.h及主目录下所有。卡片打印处理机(卡片打印处理器的缩写)和h。都复制到imgui文件夹中
12.2新建筛选器,命名imgui
12.3在imgui中添加现有项,选定目录下所有文件
12.4.dllmain.h中包含导进来的所有头文件
13.主线程imgui窗口的实现
typedef HRESULT(WINAPI func reset)(idirect 3d device 9 pi direct 3d device 9,d3d present _ PARAMETERS * PP presentation PARAMETERS);
typedef HRESULT(WINAPI func end scene)(idirect 3d device 9 pidirect 3d device 9);
typedef LRESULT(WINAPI * FuncWndProc)(const HWND,UINT,WPARAM,LPARAM);
HWND g _ hWnd=NULL
idirect 3d 9 * g _ idirect 3d 9
D3DPRESENT _ PARAMETERS g _ d3dpp
idirect 3d设备9 * g _ pidirect 3d设备9;
FuncReset旧重置
旧场景
FuncWndProc OldWndProc
DWORD * dwDeviceVirtualTable=NULL;
extern LRESULT im GUI _ impl win 32 _ WndProcHandler(HWND HWND,UINT message,WPARAM wParam,LPARAM LPARAM);
LRESULT WINAPI GrkWndProc(HWND HWND,UINT message,WPARAM wParam,LPARAM lParam)
{
if(im GUI _ impl win 32 _ WndProcHandler(hWnd,message,wParam,lParam))
{
返回真实}
返回CallWindowProc(OldWndProc,hWnd,message,wParam,lParam);
}
VOID开始挂钩(PVOID * OldFunctionAddr,PVOID NewFunctionAddr)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
绕道tach(OldFunctionAddr,NewFunctionAddr);
DetourTransactionCommit();
}
VOID UnHook(p VOID * OldFunctionAddr,PVOID NewFunctionAddr)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(OldFunctionAddr,NewFunctionAddr);
DetourTransactionCommit();
}
HRESULT WINAPI grk reset(idirect 3d device 9 pi direct 3d device 9,D3DPRESENT _ PARAMETERS d3dpp)
{
UnHook((PVOID*)( OldReset),grk reset);
im GUI _ impl dx 9 _ invalidate device objects();
HRESULT bRet=pidirect 3d设备9-Reset(d3dpp);
im GUI _ imp ldx 9 _ CreateDeviceObjects();
StartHook((PVOID*)( OldReset),grk reset);
返回布雷特
}
hresult winapi grkenscene(I direct 3 DD vice 9 * pidgorict 3 DD vice 9)
{
unook(pvoid *)(oldends场景),grkendscene
静态bool bflag=true
中频(bFlag)
{
bflag=false imgui _ check version():img ui:create context();img uiio io=img ui:getio();我,我config flags=img config flags _ nomous change:我,我wantsaveinisettings=false我,我. ini filename=NULL:img ui:stylecolorsclasic();imfontconfig imfconfigimfConfig .font dataownedbyatlas=false imgui _ impl win 32 _ Init(g _ hWnd):img ui _ impl dx9 _ Init(pi direct 3d device 9);oldwndproc=(WNDPROC)setwindowlongptr(g _ hwnd,GWL_WNDPROC,(long _ ptr)grkwndproc);}
hresult hret=pi direct 3d device 9-end scene();
img ui _ impl dx9 _ new frame();
img ui _ impl win32 _ new frame();
img ui:new frame();
img ui:setnextwindowpos(imec 2(0,0),imguicond _ firstuseever
img ui:setnextwindowsize(imec 2(300,300));
ImGui:Begin( GrkTools
img ui:end();
img ui:end frame();
img ui:render();
img ui _ impl dx9 _ render raw data(img ui:getdrawdata());
startbook(pvoid *)(oldends场景),grkendscene
返回hret
}
dword windowthread回调(lpvoid lpbuffer)
{
g _ hwnd=findwindowa(直接3 dwindwcclass,null);
g _ idirect 3d 9=direct 3 DC create 9(d3d _ SDK _ version);
memset( g_d3dpp、0、sizeof(g _ d3dpp));
页:1。窗口=真
页:1。swap effect=D3 dswapeeffect _ discard;
页:1。后台缓冲格式=d3dfmt _ unknown
页:1。enableautodepthstencil=true
页:1。autodepthstencilformat=d3d fmt _ d16:
hresult hret=g _ I direct 3d 9-创建设备(D3 dadapter _ default、D3DDEVTYPE_HAL、g_hWnd、D3 DC create _ software _ vertex ponding、g_d3dpp、g _ pidgirict 3d device 9);
dwdevicevirtualtable=(dword)(dword *)g _ pi direct 3 DD vice 9;
old reset=(func reset)dwdevicevirtualtable[16];
oldendscene=(funcendsc)dwdevicevirtualtable[42];
start book(pvoid *)(old reset,grk reset);
startbook(pvoid *)(oldends场景),grkendscene
返回0;
}
bool API entry dllman(hm module hm module,
S7-1200可编程控制器,
LPVOID已保留
)
{
开关(来电原因)
{
DLL_PROCESS_ATTACH案例:
CreateThread(NULL,NULL)(LP thread _ start _ routine)窗口线程回调,NULL,NULL,NULL;打断;打断;动态链接库_线程_附加案例:
打断;打断;动态链接库_线程_分离案例:
打断;打断;DLL_PROCESS_DETACH案例:
打断;打断;
}
返回真实的
}
14.测试
第14.1条打开文件夹,把动态链接库D3D9HOOK.dll粘贴到桌面上
页:1打开挑起来,启动代码注入器,将动态链接库D3D9HOOK.dll进行注入
测试成功:在挑一个左上角出现窗口
这样,就手动创建了一个基础的imgui的框架
来自51吨重博客作者极安御信安全研究院的原创作品,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。