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. Oracle ____Undo

    什么是回滚和撤销 update emp set sal=4000 where empno=7788 语句执行过程 1 检查empno=7788记录是否在buffer cache ,如果不存在,则读取到 ...

  2. Python源码学习(一)

    考虑到性能的要求,我在工作中用的最多的是c/c++,然而,工作中又经常会有一些验证性的工作,这些工作对性能的要求并不高,反而对完成的效率要求更高,对于这样的工作,用一种开发效率高的语言是合理的想法,鉴 ...

  3. WPF 绑定 验证

    <TextBox Grid.Column="1" Margin="1" Text="{Binding Name, ValidatesOnExce ...

  4. 向集合中添加自定义类型--建议在自定义类型的时候要重写equals方法

    package com.bjpowernode.t01list; import java.util.ArrayList; /* * 向集合中添加自定义类型 */public class TestLis ...

  5. pika的阻塞式使用

    [root@cloudplatform ELK]# cat startIncHouTai.py import os # 杀掉内存中的进程 cmd='pgrep -f PutDataToKafkaInc ...

  6. eclipse错误GC overhead limit exceeded

    1.eclipse以外关闭后打开错误如下图: 2.具体详情: 3.An internal error occurred during: "Building workspace". ...

  7. Lemur编写索引器

    http://blog.sciencenet.cn/blog-273829-312138.html http://sourceforge.net/p/lemur/wiki/Home/ http://q ...

  8. 【noip模拟赛9】123法典

    描述 很久很久以前,有个叫123的国家,这个国家的国王很喜欢颁布各种法令,并把这些法令记录在一部<123法典>中.最近这部法典终于被发掘了出来,专家们经过研究发现法典中的法令是按颁布的时间 ...

  9. 8.Django-form组件

    1.form组件的校验功能 文件formsdemo models from django.db import models # Create your models here. class UserI ...

  10. Mybatis动态公用sql

    <select id="collPageCount" parameterType="java.util.Map" resultType="lon ...