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

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

2024-1-6 19:07
2119

在《加密与解密》一书中,详细介绍了类函数的调用方式是先通过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去获取,这是为什么呢????


[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

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