gpt4 book ai didi

c++ - 如何从注入(inject)进程的内存空间重建数据结构?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:24 25 4
gpt4 key购买 nike

我已经得到了我制作的这个 DLL。它被注入(inject)到另一个进程。在另一个过程中,我使用以下函数从它的内存空间中进行搜索:


void MyDump(const void *m, unsigned int n)
{
const char *p = reinterpret_cast(m);

for (unsigned int i = 0; i < n; ++i) {
// Do something with p[i]...
}
}

现在我的问题。如果目标进程使用数据结构,假设

struct S
{
unsigned char a;
unsigned char b;
unsigned char c;
};

它在进程的内存中总是以相同的方式呈现吗?我的意思是,如果 S.a = 2(始终遵循 b = 3,c = 4),结构是否在进程的内存空间中以连续的行呈现,例如

Offset
---------------------
0x0000 | <b>0x02</b> <b>0x03</b> <b>0x04</b>

或者这些变量可以放在不同的地方吗,比如

Offset
---------------------
0x0000 | 0x00 <b>0x02</b> 0x00
0x03fc | 0x00 <b>0x03 0x04</b>

如果是后者,如何从内存中的各个点重构数据结构?

非常感谢,
nhaa123

最佳答案

如果您的受害者是用 C 或 C++ 编写的,并且使用的数据类型确实如此简单,那么您总是会发现它们是内存中的单个字节 block 。

但是一旦你有了像 std::string 这样的 C++ 类型,这个观察就不再成立了。对于初学者来说,确切的布局在 C++ 编译器之间会有所不同,甚至是同一编译器的不同版本。 std::string 的字节可能不在连续数组中,但有时它们是。如果将它们一分为二,找到后半部分可能无法帮助您找到前半部分。

不要投入更复杂的环境,例如运行 Java 应用程序的 JIT'ting JVM。你在内存中遇到的类型非常非常复杂;人们可以写一本关于解码它们的书。

关于c++ - 如何从注入(inject)进程的内存空间重建数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1398274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com