首页
社区
课程
招聘
未解决 [求助]关于C++类函数与类函数Hook的疑惑
发表于: 2024-1-6 19:07 2351

未解决 [求助]关于C++类函数与类函数Hook的疑惑

2024-1-6 19:07
2351

在《加密与解密》一书中,详细介绍了类函数的调用方式是先通过ecx传递this指针,这意味着其实每个类函数都有一个隐藏参数,为类指针,书中在介绍虚表hook的时候,说到因为thiscall的调用约定不能直接定义给函数,所以需要重新构建一个类来伪造thiscall调用,再去替换类函数指针。我有了这些疑惑,跪求解答!
1.对于虚函数 普通类函数 静态类函数都要有this指针的传递吗?静态类函数是不是不需要有this指针?
2.DxHook是对Dx虚表进行Hook达到进入绘制流程的目的,但是我注意到网上的dxhook源码并没有对上述提到的this指针问题进行处理,他们通过虚表找到ResizeBuffers等函数的地址,然后替换函数虚表指针,新函数就像这样:

1
2
3
4
5
6
7
8
9
10
11
12
HRESULT STDMETHODCALLTYPE Render::HookFn_ResizeBuffers(IDXGISwapChain* This, UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags) {
 
    if (g_pRender->g_pDevice) {
        g_pRender->g_pDevice->Release();
        g_pRender->g_pmainRenderTargetView->Release();
        ImGui_ImplDX11_Shutdown();
        g_pRender->g_pDevice = nullptr;
        g_pRender->NeedReinitialization = true;
    }
 
    return g_pRender->Original_ResizeBuffers(This, BufferCount, Width, Height, NewFormat, SwapChainFlags);
}

直接粗暴的在原函数最开始的位置增加了一个 类指针参数 我就产生了疑惑,难道这里不需要通过ecx来获取了吗?实践告诉我他确实是可行的,他不需要伪造thiscall也可以实现虚表hook并且成功获取了类指针。
一些使用MinHook库挂钩的例子也是这样简单粗暴,也是把第一个参数填成类指针没有通过ecx去获取,这是为什么呢????


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 7379
活跃值: (4086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
静态函数不需要this指针,directx是COM规范,使用的是stdcall,第一个参数this指针通过push压栈不是ecx赋值
2024-1-6 21:43
1
雪    币: 192
活跃值: (601)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
htpidk 静态函数不需要this指针,directx是COM规范,使用的是stdcall,第一个参数this指针通过push压栈不是ecx赋值
如果对类函数修饰为stdcall 类指针就成为第一个参数 不再通过ecx传递是这样吗?
那对于c#类的类函数 也是都采用stdcall方式 并且静态函数不使用类指针吗
2024-1-6 23:04
0
雪    币: 228
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
问题1跟逆向无关,this是表示对象的,类的对象内部方法会隐式传递this指针,静态方法当然不会有this,如果有这个this是谁?
2024-1-16 14:12
0
游客
登录 | 注册 方可回帖
返回
//