如果确保将kernel32.dll加载到进程虚拟内存中,为什么我不能在不包含windows.h的情况下调用Sleep等函数? 以下摘录自vividmachine.com
5。那么,窗户呢?如何找到所需DLL函数的地址?这些地址不会因每次升级服务包而改变吗?
有很多方法可以找到您需要在shellcode中使用的函数的地址。有两种解决功能的方法;您可以在运行时找到所需的功能或使用硬编码的地址。本教程将主要讨论硬编码方法。唯一保证映射到shellcode地址空间的DLL是kernel32.dll。这个DLL将保存LoadLibrary和GetProcAddress,这两个函数需要获取可以映射到漏洞进程空间的任何函数地址。但是这种方法存在问题,地址偏移量将随着Windows的每个新版本(服务包,补丁等)而改变。因此,如果您使用此方法,则shellcode仅适用于特定版本的Windows。进一步的动态寻址将在本文末尾的“进一步阅读”部分中引用。
答案 0 :(得分:5)
您引用的文章侧重于获取函数的地址。你仍然需要函数的函数原型(它不会在版本之间发生变化),以便生成调用函数的代码 - 适当处理输入和输出参数,寄存器值和堆栈。
windows.h
标头提供了您希望调用C / C ++编译器的函数原型,以便调用该函数的代码(通过寄存器或堆栈传递参数) ,可以生成函数的返回值。
通过阅读windows.h
了解函数原型后,熟练的汇编程序员也可以编写汇编代码来调用Sleep
函数。与函数的地址一起,这些都是进行函数调用所需的全部内容。
答案 1 :(得分:2)
您仍然需要声明该函数才能调用它,并且您需要与kernel32.lib链接。头文件不是什么神奇的东西,它基本上只是很多函数声明。
答案 2 :(得分:1)
你可以使用一些黑魔法;)。有GetProcAddress
的许多自定义实现,这将允许你逃脱不需要windows.h
,但这不是全部并且结束所有并且可能最终由于内部窗口而导致问题变化。另一种方法是使用toolhlp枚举进程中的模块以获取kernel.dll的基础,然后将其PE用于EAT并获取GetProcAddress
的地址。从那里你只需要函数指针原型来正确调用地址(和任何结构defs需要),这不是太辛苦劳动密集(如果你有很多功能),在Windows XP下实际上这需要禁用DEP由于服务包差异,你需要windows.h
作为参考来获得这个,你只需要不包括它。
答案 3 :(得分:-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
我的游戏引擎中没有包含