1

如果 kernel32.dll 保证加载到进程虚拟内存中,为什么我不能在不包含 windows.h 的情况下调用 Sleep 等函数?以下是来自vividmachine.com的摘录

5. 那么,窗户呢?如何找到我需要的 DLL 函数的地址?这些地址不会随着每次服务包升级而改变吗?

有多种方法可以找到您需要在 shellcode 中使用的函数的地址。寻址函数有两种方法;您可以在运行时找到所需的功能或使用硬编码地址。本教程将主要讨论硬编码方法。唯一保证映射到 shellcode 地址空间的 DLL 是 kernel32.dll。此 DLL 将保存 LoadLibrary 和 GetProcAddress,这两个函数需要获取可映射到漏洞利用进程空间的任何函数地址。但是这种方法存在一个问题,地址偏移量会随着 Windows 的每个新版本(服务包、补丁等)而改变。因此,如果您使用这种方法,您的 shellcode 将仅适用于特定版本的 Windows。

4

4 回答 4

5

您引用的文章侧重于获取函数的地址。您仍然需要函数的函数原型(不会随版本更改),以便生成调用函数的代码 - 并适当处理输入和输出参数、寄存器值和堆栈。

windows.h文件提供了您希望调用 C/C++ 编译器的函数原型,以便可以生成调用函数的代码(通过寄存器或堆栈传递参数,并获取函数的返回值)。

在通过阅读了解函数原型之后windows.h,熟练的汇编程序员也可能会编写汇编代码来调用Sleep函数。连同函数的地址,这些就是进行函数调用所需的全部内容。

于 2011-06-04T11:38:13.677 回答
2

用一些黑魔法你可以;)。已经有许多自定义实现GetProcAddress,这将允许您摆脱不需要windows.h,但这并不是全部,并且可能由于内部窗口更改而最终出现问题。另一种方法是使用 toolhlp 枚举进程中的模块以获取 kernel.dll 的基础,然后为 EAT 挖掘其 PE 并获取 .dll 的地址GetProcAddress。从那里你只需要函数指针原型来正确调用地址(以及需要的任何结构定义),这不是太费力(如果你有很多函数),事实上在 windows xp 下这是禁用 DEP 所必需的,因为服务包差异,你需要windows.h作为参考来获得它,你只是不需要包含它。

于 2011-06-04T12:03:49.880 回答
2

您仍然需要声明该函数才能调用它,并且您需要与 kernel32.lib 链接。头文件没什么神奇的,它基本上只是很多函数声明。

于 2011-06-04T15:50:58.310 回答
-1

我可以使用 1 行程序集,然后使用一些辅助函数通过硬编码不同成员的正确偏移量来遍历 PEB 文件。

你必须从这里开始:

static void* 
JMIM_ASM_GetBaseAddr_PEB_x64()
{
    void* base_address = 0;
    unsigned long long var_out = 0;

    __asm__(
        " movq %%gs:0x60, %[sym_out]  ; \n\t"
        :[sym_out] "=r"  (var_out) //:OUTPUTS
    );

    //: printf("[var_out]:%d\n", (int)var_out);

    base_address=(void*)var_out;
    return( base_address );
}

然后在可执行文件上使用 windbg 来检查您机器上的数据结构。您需要的许多值都很难找到,而且只有随机黑客才会真正记录下来。您会发现自己在许多恶意软件编写网站上寻找答案。

dt nt!_PEB -r @$peb

在 windbg 中获取有关 PEB 文件的信息非常有用。

在我的游戏引擎中有一个完整的工作实现。只需查看:/DEP/PEB2020 即可获取代码。

https://github.com/KanjiCoder/AAC2020

I don't include <windows.h> in my game engine. Yet I use "GetProcAddress" and "LoadLibraryA". Might be in-advisable to do this. But my thought was the more moving parts, the more that can go wrong. So figured I'd take the "#define WIN32_LEAN_AND_MEAN" to it's absurd conclusion and not include <windows.h> at all.

于 2021-02-21T08:03:38.880 回答