【发布时间】:2019-11-20 14:19:54
【问题描述】:
我正在尝试获取 KeGetProcessorNumberFromIndex 的地址,但编译器不断生成调用 KeGetProcessorNumberFromIndex 的函数,我得到了这个生成函数的地址。我可以解析 PE 导出,但我想知道是否有办法阻止我正在使用 Visual Studio 的这种行为。我试图禁用所有优化,但这并没有改变任何东西。
uintptr_t addr = (uintptr_t)KeGetProcessorNumberFromIndex; // gets address of KeGetProcessorNumberFromIndex_0
KeGetProcessorNumberFromIndex_0 proc near
jmp cs:__imp_KeGetProcessorNumberFromIndex
KeGetProcessorNumberFromIndex_0 endp
【问题讨论】:
-
您需要禁用
/INCREMENTAL链接器选项 - 您所看到的 - 这是 jump thunk 或者您可以从 asm 代码中执行此操作 - 声明extern __imp_KeGetProcessorNumberFromIndex:QWORD并从__imp_KeGetProcessorNumberFromIndex。您可以在 x64 的情况下执行此操作并直接从 c++ - 声明 extern "C" { extern void* __imp_KeGetProcessorNumberFromIndex; } 并按原样使用它。但是 x86 名称会出现问题 -__imp__KeGetProcessorNumberFromIndex@8 -
这是无效的 c++ 名称(@符号)
-
oo。现在查看 wdm.h - 这个函数声明时没有
__declspec(dllimport)属性。正是这在函数上产生了 jmp thunk。
标签: c++ winapi assembly visual-c++ kernel