// 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期)