通过代理 DLL 查找 COM 函数定义的指南是什么?

逆向工程 调试 电脑
2021-06-19 16:04:59

我已经成功地反转了一个使用 COM 接口的 DLL 文件,并找到了类 ID (CLSID) 和接口 ID (IID)。在 Visual Studio 调试内存中,它显示S_OKCoCreateInstance()该 COM 接口的所有函数指针。我看到了这个问题,但它使用 IDA 来反转 DLL。

我关注了一篇文章文章显示了使用 Visual Studio 调试模式查找方法定义。我有 CLSID 和 IID,从中我可以得到接口指针。

所以,我的问题是如何找到(未记录的)函数定义?是否有任何简单的通用指南可以遵循?如果有人使用 Visual Studio 展示一个过程会很容易,而使用 IDA 进行逆向则要复杂一些。


更新:根据答案,我在 IDA 中反转了 DLL,但程序集显示了

off_180002230   dq offset off_1800023D0 ; DATA XREF: .rdata:off_180002480↓o
                dq offset ILxssUserSession
                dq offset IUnknown_QueryInterface_Proxy
                dq offset IUnknown_AddRef_Proxy
                dq offset IUnknown_Release_Proxy
                dq offset ObjectStublessClient3
                dq offset ObjectStublessClient4
                dq offset ObjectStublessClient5
                dq offset ObjectStublessClient6
                dq offset ObjectStublessClient7
                dq offset ObjectStublessClient8
                dq offset ObjectStublessClient9
                dq offset ObjectStublessClient10
                dq offset ObjectStublessClient11
                dq offset ObjectStublessClient12
                dq offset ObjectStublessClient13
                dq offset ObjectStublessClient14
unk_1800022B8   db  22h ; "             ; DATA XREF: .rdata:0000000180002DE0↓o

如何将这些偏移量与实际函数指针相关联?当前 DLL 是代理存根 DLL,实际功能在另一个 DLL 中实现/定义。我也看到了这个问题,它表明要遵循函数指针。

1个回答

嗯,一般来说,您遵循 DllGetClassObject 中的代码流并找到根据 clsid 和 iid 创建 COM 类的代码。由于 COM 方法是 C++ 类的虚拟方法,您将能够找到每个 COM 类的 VTBL,并从那里确定它有多少方法。然后反转每个方法以了解它有多少个参数以及哪些是参数类型。