获取虚拟成员的地址返回错误的地址

时间:2020-07-24 16:37:26

标签: c++ hook directx-11

我正在尝试通过引用对象的vtable来获取特定方法的地址。

这是专门针对DirectX 11的。我正在尝试访问ID3D11Device的vtable,以便获取CreateInputLayout()方法的地址,以便对其进行挂钩。为此,我首先使用D3D11CreateDeviceAndSwapChain()函数创建一个设备。创建设备后,我尝试获取设备的基地址,然后取消引用其vtable。这样,只要知道偏移量,就可以获取所需的任何方法地址。根据一些研究,我找到了D3D11的偏移量表。

但是,问题是无论我使用哪个索引(偏移量),ogCreateInputLayout都会返回对该设备的引用。我已经调试了它,它总是返回ID3D11CreateDevice(),这不是理想的方法。

有趣的是,如果我使用ID3D11DeviceContext而不是设备尝试此代码,它将始终返回正确的方法(基于索引)。

我不确定为什么会这样。我已经研究了好几天了,我没有任何假设。创建交换链和设备的调用成功完成,没有错误。

HRESULT __stdcall hkCreateInputLayout(const D3D11_INPUT_ELEMENT_DESC* pInputElementDescs,
    UINT NumElements, const void* pShaderBytecodeWithInputSignature, SIZE_T BytecodeLength, 
    ID3D11InputLayout** ppInputLayout);
using fnCreateInputLayout = HRESULT(__stdcall*)(const D3D11_INPUT_ELEMENT_DESC* pInputElementDescs, 
    UINT NumElements, const void* pShaderBytecodeWithInputSignature, SIZE_T BytecodeLength, 
    ID3D11InputLayout** ppInputLayout);
void* ogCreateInputLayout; //Pointer to original CreateInputLayout Function
DWORD_PTR* pDeviceVTable = NULL;

D3D_FEATURE_LEVEL featLevel;
DXGI_SWAP_CHAIN_DESC sd{ 0 };
sd.BufferCount = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.Height = 800;
sd.BufferDesc.Width = 600;
sd.BufferDesc.RefreshRate = { 60, 1 };
sd.OutputWindow = GetForegroundWindow();
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
HRESULT hr = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_REFERENCE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &sd, &pSwapchain, &pDevice, &featLevel, nullptr);
if (FAILED(hr))
    return false;

//Get CreateInputLayout Address
pDeviceVTable = (DWORD_PTR*)pDevice;
pDeviceVTable = (DWORD_PTR*)pDeviceVTable[0];
ogCreateInputLayout = (fnCreateInputLayout)pDeviceVTable[11];
std::cout << "pDeviceVTable Addr: " << std::hex << pDeviceVTable << std::endl;
std::cout << "fnCreateInputLayout Addr: " << std::hex << ogCreateInputLayout << std::endl;

0 个答案:

没有答案
相关问题