Hook Directx + CEGUI VC++
void CtestwmDlg::OnBnClickedButton1()
{
CStringA lpszFile;
m_file.GetWindowText(lpszFile);
if (lpszFile.IsEmpty())
lpszFile = GetExeDirA()+"\\element\\elementclient.exe";
LPCSTR lpDir = GetDirA(lpszFile);
LPSTR lpwParam = " game:cpw";
CStringA lpDll;
LPCSTR dll[] = {
"CEGUIBase.dll",
"DirectX81GUIRenderer.dll",
"CEGUIExpatParser.dll",
"CEGUIFalagardWRBase.dll",
"wmsdk.dll" //自己的,要最后注入,不然失败
};
STARTUPINFO si= {};
si.cb = sizeof si;
si.dwFlags = STARTF_USECOUNTCHARS;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
CreateProcess(lpszFile,lpwParam,,,FALSE,CREATE_SUSPENDED,,lpDir,&si,&pi);
ResumeThread(pi.hThread);
for (int i = ;i < ;i++)
{
lpDll.Format("%s\\%s",GetExeDirA(),dll);
injectionDll(pi.hProcess,lpDll);
}
injectionDll 函数
void injectionDll(HANDLE hProcess,LPCSTR lpDll)
{
DWORD dwSize = strlen(lpDll) + ;
LPVOID lpBuf = VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,lpBuf,LPVOID(lpDll),dwSize,NULL);
LPVOID lpFun = LoadLibraryA;
ASSERT(lpFun);
HANDLE hThread = CreateRemoteThread(hProcess,NULL,,(LPTHREAD_START_ROUTINE)lpFun,lpBuf,,);
WaitForSingleObject(hThread,INFINITE);
VirtualFreeEx(hProcess,lpBuf,dwSize,MEM_DECOMMIT);
CloseHandle(hThread);
}
}
DLL代码
#include "Main.h"
#include "Game.h"
#include "IDirect3D8.h" DWORD WINAPI ThreadProc(LPVOID lpParameter);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); typedef IDirect3D8 * (WINAPI * lpDirect3DCreate8)(UINT SDKVersion);
lpDirect3DCreate8 pDirect3DCreate8;
IDirect3D8 * WINAPI myDirect3DCreate8(UINT SDKVersion); CGame * Game;
HMODULE phModule;
MyIDirect3D8 * NewIDirect3D8; BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
phModule = hModule;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL,,ThreadProc,NULL,,NULL);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
} DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
HMODULE hD3D8 = GetModuleHandle(L"d3d8.dll"); while (hD3D8 == )
{
Sleep();
hD3D8 = GetModuleHandle(L"d3d8.dll");
} LPVOID lpFunC = GetProcAddress(hD3D8,"Direct3DCreate8"); DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)lpFunC,myDirect3DCreate8);
DetourTransactionCommit();
pDirect3DCreate8= (lpDirect3DCreate8)lpFunC; return ;
} IDirect3D8 * WINAPI myDirect3DCreate8(UINT SDKVersion)
{
static int doing;
doing++;
IDirect3D8 * tmp = pDirect3DCreate8(SDKVersion);
if (doing == ) //2=窗口模式 3=全屏模式
{
NewIDirect3D8 = new MyIDirect3D8(tmp);
tmp= (IDirect3D8*)NewIDirect3D8;
}
return tmp;
} HRESULT APIENTRY MyIDirect3D8::CreateDevice(UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice8** ppReturnedDeviceInterface)
{ HRESULT hr=lpD3D->CreateDevice(Adapter,DeviceType,hFocusWindow,BehaviorFlags,
pPresentationParameters,&lpD3DD8bak); lpD3DD8=new MyIDirect3DDevice8(lpD3DD8bak); *ppReturnedDeviceInterface = (IDirect3DDevice8*)lpD3DD8; Game=new CGame(lpD3DD8,phModule);
Game->hWnd=hFocusWindow;
Game->WndProc=(WNDPROC)SetWindowLong(hFocusWindow,GWL_WNDPROC,(LONG)&WndProc);
Game->init(); return hr;
}
我用VS2010+VC9 + GEGUI 0.62 + Detours 编译通过
Hook Directx + CEGUI VC++的更多相关文章
- Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)
经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...
- vc++窗口的创建过程(MFC消息机制的经典文章)
一.什么是窗口类 在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC ...
- 安装VS2015可能出现的问题以及解决方法
1.语言包问题 在官网上下载的版本是英文版,这就需要自己再去官网上下载一个中文安装包,很快的.不过需要2G内存.官网链接如下所示 https://www.microsoft.com/zh-CN/dow ...
- vc中关于 directx的配置,和dxsdk_extras(directshow)
2009-11-10 0:28 此文章:自己编写 转载于<汤姆&杰瑞> DirectShow 1 -- 下载与VC配置 1 DirectX SDK9 Directshow sd ...
- vc有关 directx组态,和dxsdk_extras(directshow)
2009-11-10 0:28 此文章:自己编写 转载于<汤姆&杰瑞> DirectShow 1 -- 下载与VC配置 1 DirectX SDK9 Directshow sd ...
- 使用VC++通过远程进程注入来实现HOOK指定进程的某个API
前阵子读到一篇关于<HOOK API入门之Hook自己程序的MessageBoxW>的博客,博客地址:http://blog.csdn.net/friendan/article/detai ...
- VC++使用HOOK API 屏蔽PrintScreen键截屏以及QQ和微信默认热键截屏
转载:http://blog.csdn.net/easysec/article/details/8833457 转载:http://www.vckbase.com/module/articleCont ...
- VC/MFC 编程技巧大总结
1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐 ...
- CEGUI 0.7.7 VS2010+SP3 编译过程
1 在官方网站http://www.cegui.org.uk/ 下载最新的CEGUI 源代码 版本是0.7.7 2 下载编译需要用到的依赖文件包 将解压后的文件夹 Dependencies 和CEGU ...
随机推荐
- (转)eclipse 创建maven web项目
1.新建Maven项目 1.1 File -> New -> Other 1.2 选择Maven Project ,单击Next 1.3 保持默认即可,单击Next 1.4 选择Arche ...
- 【转载】JavaScript中的属性:如何遍历属性
转载自:http://www.cnblogs.com/ziyunfei/archive/2012/11/03/2752905.html 在JavaScript中,遍历一个对象的属性往往没有在其他语言中 ...
- java虚拟机内存不足,“Could not create the Java Virtual Machine”问题解决方案
在运行java程序时,遇到问题"Could not create the Java Virtual Machine."如下截图:
- XHR简介
在XHR诞生前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,在XHR诞生后就可以完全通过JS代码异步实现这一过程.XHR的诞生也使最初的网页制作转换为开发交互应用,拉开了WEB2.0的序幕 ...
- LeetCode(38): 报数
Easy! 题目描述: 报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作 &qu ...
- LeetCode(35):搜索插入位置
Easy! 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1 ...
- LeetCode(31): 下一个排列
Medium! 题目描述: (请仔细读题) 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列) ...
- PHP对Url中的汉字进行编码和解码
有的新手朋友们对于url编码解码这个概念,或许有点陌生.但是如果这么说,当我们在浏览各大网页时,可能发现有的url里有一些特殊符号比如#号,&号,_号或者汉字等等,那么为了符合url的规范,存 ...
- python易错题之作用域
name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2() //结果为 lzl 记 ...
- Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)
a:数据库的相关知识: (1):一个表能否有多个主键:不能: (2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性: (3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即 ...