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++的更多相关文章

  1. Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)

    经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...

  2. vc++窗口的创建过程(MFC消息机制的经典文章)

    一.什么是窗口类  在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC ...

  3. 安装VS2015可能出现的问题以及解决方法

    1.语言包问题 在官网上下载的版本是英文版,这就需要自己再去官网上下载一个中文安装包,很快的.不过需要2G内存.官网链接如下所示 https://www.microsoft.com/zh-CN/dow ...

  4. vc中关于 directx的配置,和dxsdk_extras(directshow)

      2009-11-10 0:28 此文章:自己编写 转载于<汤姆&杰瑞> DirectShow 1 -- 下载与VC配置 1 DirectX SDK9 Directshow sd ...

  5. vc有关 directx组态,和dxsdk_extras(directshow)

      2009-11-10 0:28 此文章:自己编写 转载于<汤姆&杰瑞> DirectShow 1 -- 下载与VC配置 1 DirectX SDK9 Directshow sd ...

  6. 使用VC++通过远程进程注入来实现HOOK指定进程的某个API

    前阵子读到一篇关于<HOOK API入门之Hook自己程序的MessageBoxW>的博客,博客地址:http://blog.csdn.net/friendan/article/detai ...

  7. VC++使用HOOK API 屏蔽PrintScreen键截屏以及QQ和微信默认热键截屏

    转载:http://blog.csdn.net/easysec/article/details/8833457 转载:http://www.vckbase.com/module/articleCont ...

  8. VC/MFC 编程技巧大总结

    1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐 ...

  9. CEGUI 0.7.7 VS2010+SP3 编译过程

    1 在官方网站http://www.cegui.org.uk/ 下载最新的CEGUI 源代码 版本是0.7.7 2 下载编译需要用到的依赖文件包 将解压后的文件夹 Dependencies 和CEGU ...

随机推荐

  1. (转)eclipse 创建maven web项目

    1.新建Maven项目 1.1 File -> New -> Other 1.2 选择Maven Project ,单击Next 1.3 保持默认即可,单击Next 1.4 选择Arche ...

  2. 【转载】JavaScript中的属性:如何遍历属性

    转载自:http://www.cnblogs.com/ziyunfei/archive/2012/11/03/2752905.html 在JavaScript中,遍历一个对象的属性往往没有在其他语言中 ...

  3. java虚拟机内存不足,“Could not create the Java Virtual Machine”问题解决方案

    在运行java程序时,遇到问题"Could not create the Java Virtual Machine."如下截图:

  4. XHR简介

    在XHR诞生前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,在XHR诞生后就可以完全通过JS代码异步实现这一过程.XHR的诞生也使最初的网页制作转换为开发交互应用,拉开了WEB2.0的序幕 ...

  5. LeetCode(38): 报数

    Easy! 题目描述: 报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作  &qu ...

  6. LeetCode(35):搜索插入位置

    Easy! 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1 ...

  7. LeetCode(31): 下一个排列

    Medium! 题目描述: (请仔细读题) 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列) ...

  8. PHP对Url中的汉字进行编码和解码

    有的新手朋友们对于url编码解码这个概念,或许有点陌生.但是如果这么说,当我们在浏览各大网页时,可能发现有的url里有一些特殊符号比如#号,&号,_号或者汉字等等,那么为了符合url的规范,存 ...

  9. python易错题之作用域

    name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2() //结果为 lzl 记 ...

  10. Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)

    a:数据库的相关知识: (1):一个表能否有多个主键:不能: (2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性: (3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即 ...