缺少符号 RtlGetFrame、RtlPushFrame、RtlPopFrame

逆向工程 视窗 登录 符号
2021-06-14 18:52:03

我想使用ProcessHacker项目中列出的一些未记录的符号取自这里:

https://github.com/processhacker/processhacker/blob/master/phnt/include/ntpebteb.h#L241 https://github.com/processhacker/processhacker/blob/master/phnt/include/ntrtl.h#L7156

但是,我不知道它们属于哪个dll...

在项目自述页面中,据说我只需要最新的 Windows SDK,但编译后我得到:

Severity    Code    Description Project File    Line    Suppression State

Error   LNK2019 unresolved external symbol "__declspec(dllimport) struct 
_TEB_ACTIVE_FRAME * __cdecl RtlGetFrame(void)" (__imp_?
RtlGetFrame@@YAPEAU_TEB_ACTIVE_FRAME@@XZ) referenced in function "public: static
 struct _TEB_ACTIVE_FRAME * __cdecl _RTL_FRAME::get(struct 
_TEB_ACTIVE_FRAME_CONTEXT const *)" (?
get@_RTL_FRAME@@SAPEAU_TEB_ACTIVE_FRAME@@PEBU_TEB_ACTIVE_FRAME_CONTEXT@@@Z) 
TestReentrancy  C:\projects\2.3\unit_tests\InjectionTest\Project1\main.obj  1   

也许有人可以告诉我如何调整我的项目配置以使其正常工作?谢谢 !

1个回答

这些函数是从ntdll.dll文件中导出的要与这些函数链接,请添加#pragma comment (lib, "ntdll.lib")源文件。或者在 Visual Studio 中,首先检查活动的配置和平台。然后在 Project > Properties > Linker > Input > Additional Dependencies 中添加库。例如,像这样%(AdditionalDependencies); ntdll.lib对于 mingw、cygwin、msys2 等工具链(使用 GCC),-lntdll在命令中使用选项。

或者也可以直接在源代码中编写函数,而无需从 ntdll 中导入函数。这些函数使用线程信息块 (TEB) 中的成员,如下所示:

PTEB_ACTIVE_FRAME RtlGetFrame()
{
    return NtCurrentTeb()->ActiveFrame;
}

void RtlPushFrame(PTEB_ACTIVE_FRAME Frame)
{
    struct _TEB *Teb;

    Teb = NtCurrentTeb();
    Frame->Previous = Teb->ActiveFrame;
    Teb->ActiveFrame = Frame;
}

void RtlPopFrame(PTEB_ACTIVE_FRAME Frame)
{
NtCurrentTeb()->ActiveFrame = Frame->Previous;
}