0

我在一个名为stub. 我必须确定命名空间的确切起始地址和结束地址,至少是内存中命名空间的大小(将这些函数复制到另一个进程中)。虽然这在 Visual C++ 2008 中通过添加一个

void stub_end() { }

在命名空间的末尾并使用

size_t size = reinterpret_cast<ULONG_PTR>(stub_end) - reinterpret_cast<ULONG_PTR>(stub_start);

来确定存根的大小。

这是因为 Visual C++ 保留了 .cpp 文件中的函数顺序,但在 Visual C++ 2010 中似乎不再如此。

如何使用编译指示指令、编译器/链接器工具或类似工具找出函数或整个命名空间/存根的大小?

4

3 回答 3

1

如今,随着安全性的新推动(堆随机化、布局随机化等),我认为这将变得更加困难。您可能最终不得不单独复制每个功能。

于 2009-12-23T15:20:51.997 回答
0

您可以尝试将每个函数放在不同的部分,使用 VC++ 等效 GCC 的属性((section ("name"))) http://www.delorie.com/gnu/docs/gcc/gcc_62.html然后使用您的技术,或者您可以将每个函数放在不同的源文件中。

于 2009-12-23T16:07:25.193 回答
0

C++ 语言不保证查找名称空间的地址或大小。也就是说,冒险使用汇编语言和链接器指令。

许多汇编语言都有用于将代码放置在特定地址的操作码或助记符。这允许设置标签以指示存储区域的开始。一些链接器具有用于获取段起始地址和大小的变量。这些将是用户定义的逻辑地址。

总之,使用您的程序集和链接器工具来定义命名空间开始和长度的公共符号或可选的段结束。在您的 C++ 程序中,以extern.

于 2009-12-23T18:08:39.520 回答