首页
社区
课程
招聘
vc劫持d3d9,游戏运行没反应不知哪错了
发表于: 2012-2-23 01:44 7755

vc劫持d3d9,游戏运行没反应不知哪错了

2012-2-23 01:44
7755
// d3d3.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 头文件
#include <Windows.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
#pragma comment(linker, "/EXPORT:CheckFullscreen=_AheadLib_CheckFullscreen,@1")
#pragma comment(linker, "/EXPORT:Direct3DShaderValidatorCreate9=_AheadLib_Direct3DShaderValidatorCreate9,@2")
#pragma comment(linker, "/EXPORT:PSGPError=_AheadLib_PSGPError,@3")
#pragma comment(linker, "/EXPORT:PSGPSampleTexture=_AheadLib_PSGPSampleTexture,@4")
#pragma comment(linker, "/EXPORT:D3DPERF_BeginEvent=_AheadLib_D3DPERF_BeginEvent,@5")
#pragma comment(linker, "/EXPORT:D3DPERF_EndEvent=_AheadLib_D3DPERF_EndEvent,@6")
#pragma comment(linker, "/EXPORT:D3DPERF_GetStatus=_AheadLib_D3DPERF_GetStatus,@7")
#pragma comment(linker, "/EXPORT:D3DPERF_QueryRepeatFrame=_AheadLib_D3DPERF_QueryRepeatFrame,@8")
#pragma comment(linker, "/EXPORT:D3DPERF_SetMarker=_AheadLib_D3DPERF_SetMarker,@9")
#pragma comment(linker, "/EXPORT:D3DPERF_SetOptions=_AheadLib_D3DPERF_SetOptions,@10")
#pragma comment(linker, "/EXPORT:D3DPERF_SetRegion=_AheadLib_D3DPERF_SetRegion,@11")
#pragma comment(linker, "/EXPORT:DebugSetLevel=_AheadLib_DebugSetLevel,@12")
#pragma comment(linker, "/EXPORT:DebugSetMute=_AheadLib_DebugSetMute,@13")
#pragma comment(linker, "/EXPORT:Direct3DCreate9=_AheadLib_Direct3DCreate9,@14")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 宏定义
#define EXTERNC extern "C"
#define NAKED __declspec(naked)
#define EXPORT __declspec(dllexport)

#define ALCPP EXPORT NAKED
#define ALSTD EXTERNC EXPORT NAKED void __stdcall
#define ALCFAST EXTERNC EXPORT NAKED void __fastcall
#define ALCDECL EXTERNC NAKED void __cdecl
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// AheadLib 命名空间
namespace AheadLib
{
        HMODULE m_hModule = NULL;        // 原始模块句柄
        DWORD m_dwReturn[14] = {0};        // 原始函数返回地址

        // 加载原始模块
        inline BOOL WINAPI Load()
        {
                TCHAR tzPath[MAX_PATH];
                TCHAR tzTemp[MAX_PATH * 2];

                lstrcpy(tzPath, TEXT("d3d9.dll"));
                m_hModule = LoadLibrary(tzPath);
                if (m_hModule == NULL)
                {
                        wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
                        MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
                }

                return (m_hModule != NULL);       
        }
               
        // 释放原始模块
        inline VOID WINAPI Free()
        {
                if (m_hModule)
                {
                        FreeLibrary(m_hModule);
                }
        }

        // 获取原始函数地址
        FARPROC WINAPI GetAddress(PCSTR pszProcName)
        {
                FARPROC fpAddress;
                CHAR szProcName[16];
                TCHAR tzTemp[MAX_PATH];

                fpAddress = GetProcAddress(m_hModule, pszProcName);
                if (fpAddress == NULL)
                {
                        if (HIWORD(pszProcName) == 0)
                        {
                                wsprintf(szProcName, "%d", pszProcName);
                                pszProcName = szProcName;
                        }

                        wsprintf(tzTemp, TEXT("无法找到函数 %hs,程序无法正常运行。"), pszProcName);
                        MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
                        ExitProcess(-2);
                }

                return fpAddress;
        }
}
using namespace AheadLib;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
        if (dwReason == DLL_PROCESS_ATTACH)
        {
                DisableThreadLibraryCalls(hModule);

                return Load();
        }
        else if (dwReason == DLL_PROCESS_DETACH)
        {
                Free();
        }

        return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_CheckFullscreen(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[0 * TYPE long];

        // 调用原始函数
        GetAddress("CheckFullscreen")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[0 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_Direct3DShaderValidatorCreate9(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[1 * TYPE long];

        // 调用原始函数
        GetAddress("Direct3DShaderValidatorCreate9")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[1 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_PSGPError(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[2 * TYPE long];

        // 调用原始函数
        GetAddress("PSGPError")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[2 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_PSGPSampleTexture(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[3 * TYPE long];

        // 调用原始函数
        GetAddress("PSGPSampleTexture")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[3 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_D3DPERF_BeginEvent(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[4 * TYPE long];

        // 调用原始函数
        GetAddress("D3DPERF_BeginEvent")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[4 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_D3DPERF_EndEvent(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[5 * TYPE long];

        // 调用原始函数
        GetAddress("D3DPERF_EndEvent")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[5 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_D3DPERF_GetStatus(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[6 * TYPE long];

        // 调用原始函数
        GetAddress("D3DPERF_GetStatus")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[6 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_D3DPERF_QueryRepeatFrame(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[7 * TYPE long];

        // 调用原始函数
        GetAddress("D3DPERF_QueryRepeatFrame")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[7 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_D3DPERF_SetMarker(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[8 * TYPE long];

        // 调用原始函数
        GetAddress("D3DPERF_SetMarker")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[8 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_D3DPERF_SetOptions(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[9 * TYPE long];

        // 调用原始函数
        GetAddress("D3DPERF_SetOptions")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[9 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_D3DPERF_SetRegion(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[10 * TYPE long];

        // 调用原始函数
        GetAddress("D3DPERF_SetRegion")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[10 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_DebugSetLevel(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[11 * TYPE long];

        // 调用原始函数
        GetAddress("DebugSetLevel")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[11 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_DebugSetMute(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[12 * TYPE long];

        // 调用原始函数
        GetAddress("DebugSetMute")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[12 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_Direct3DCreate9(void)
{
        // 保存返回地址
        __asm POP m_dwReturn[13 * TYPE long];

        // 调用原始函数
        GetAddress("Direct3DCreate9")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[13 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
哪位帮改下程序能劫持就行?
2012-2-23 01:45
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
dll name 是d3d9么
没细看代码
劫持个函数看看 CreateDevice d3d初始化必执行的函数
2012-2-23 03:39
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
之前写过D3D透视挂
大概是这样  源码删了 具体忘了

HINSTANCE  hD3D9 =LoadLibrary("d3d9.dll");
LPVOID pDirect3DCreate9 = GetProcAddress(hD3D9,"Direct3DCreate9");
//Inline Hook Direct3DCreate9函数
__asm
    {
        mov ebx,pDirect3DCreate9
        mov byte ptr [ebx],0xe9
        mov dword ptr [ebx+1],MyDirect3DCreate9
    }
__declspec(naked)void RealDirect3DCreate9()
{
        __asm {
        push ebp
        mov ebp,esp
        jmp pDirect3DCreate9 +5
        }
}
IDirect3D9  * __stdcall  MyDirect3DCreate9(UINT SDKVersion)
{
        IDirect3D9*(__stdcall*_Direct3DCreate9)(UINT SDKVersion)=(IDirect3D9*(__stdcall*)(UINT SDKVersion))RealDirect3DCreate9;
        return _Direct3DCreate9(SDKVersion);
}
还要导出个函数 Direct3DCreate9
这样游戏应该不会掉 可以做其他坏事了~
废话多一句
你劫持d3d9.dll游戏加载了你的dll没找到d3d初始化要调用的函数 所以直接退出了进程
2012-2-23 03:41
0
雪    币: 107
活跃值: (399)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
强力UP......

欢迎楼下的继续爆料....
2012-2-23 08:45
0
游客
登录 | 注册 方可回帖
返回
//