c语法LONG(NTAPI名称)(type1,type2 ...);

时间:2011-06-27 13:20:07

标签: c grammar

我正在阅读在Windows XP中获取source code的铃声0权限

在该代码中,

有2行

LONG (NTAPI *NtSystemDebugControl)     (int,void*,DWORD,void*,DWORD,DWORD*);
*(DWORD*)   &NtSystemDebugControl =(DWORD)GetProcAddress(LoadLibrary("ntdll"),"NtSystemDebugControl");

这是我第一次看到这样的语法

两条线的含义是什么?

2 个答案:

答案 0 :(得分:3)

第一行创建一个函数指针,第二行以相当可怕的方式初始化函数指针(它将在64位机器上失败,尽管在这种情况下这可能是微不足道的。)

如果你问GetProcAddress我建议在MSDN阅读相关内容。{/ p>

答案 1 :(得分:0)

ULONG_PTR,这是有原因的。在DWORD与x64和x86兼容的情况下,它对于成功至关重要。使用它:) x64的替代方法是DWORD64类型转换。 GetProcAddress返回NtSystemDebugControl

ntdll的偏移量

在堆栈上查看时与ntdll.dll!NtSystemDebugControl关联的地址现在指向typedef中定义的函数指针。

从这里起,您可以启动指针:

NtSystemDebugControl My_NtSystemDebugControl;
if (My_NtSystemDebugControl != NULL) {
    My_NtSystemDebugControl(...);
}

基本上这样做是在运行时解析api而不需要在编译时链接它。如果您的应用程序在CFF Explorer中查看,则IAT (Import-Address-Table)只会包含GetProcAddressLoadLibrary。但NtSystemDebugControl因为在运行时被解决而不会出现。

这样做的好处是,它阻碍了许多反病毒的启发式分析,它使你的二进制文件更小,因为你在编译时没有连接大量无用的库,它给你带来了很多通过仅定义您需要的功能而不是整个库来实现更大的灵活性!

此外,您应该尝试使用GetModuleHandle("ntdll"),并在进入!= NULL之前将结果与LoadLibrary("ntdll")进行比较,因为它的侵入性要小得多!