如何在不知道名称的情况下访问C结构的成员?

时间:2009-05-06 14:45:45

标签: c objective-c

我正在处理一个未记录的API,我正在尝试进行一些逆向工程 - 不要担心这不是恶意的,只是试图以创造性的方式实现用例。

我有一个指向C结构的指针。有没有办法让我通过检查这个结构有多少成员来确定?他们的价值?

我怀疑实际的会员名称不可用,但也许他们是?

6 个答案:

答案 0 :(得分:5)

你做不到。你所能做的只是检查记忆,并尝试猜测。

例如,指针值有时可以很容易找到,因为它们通常位于相同的“一般区域”中。如果你有一个struct的地址,那么在数字上查找“close”的值(平台的指针大小,通常是32位或64位)。

在您的平台上查找某些“常见”浮点数的位模式也可能值得研究,并寻找这些。在这里,当然,应用程序和/或域帮助的知识,也许有一些“应该”在那里的值,那些是那些自然要搜索的东西。

如果您有权访问接受和/或返回结构的API中的任何函数,您可能需要尝试调用它们并检查差异,这可以提供有关正在发生的事情的线索。

在这方面,你当然也可以逐步完成分配/创建结构的代码,看看它在哪里做了。

答案 1 :(得分:4)

不,没有办法仅仅从记忆中确定struct成员的“结构”。

答案 2 :(得分:3)

根据内存布局,您可以确定结构的结束位置,并且通过了解结构在更高级别上的作用,您可以猜测成员(谨防对齐)。但除非代码附带调试符号,否则知道名称是没有运气的。在那种情况下,这很容易。在使用结构的地方打破并在调试器中检查它。

编辑:
假设您确实找到了struct包含的成员,并且您也知道您的编译器使用相同的对齐方式,那么您可以在代码中定义结构的传真,并使用指向结构的指针指向实际结构的地址。然后,您可以在代码中轻松访问所有元素。

答案 3 :(得分:1)

不幸的是,您没有C或C ++中的类型信息。 C ++中提供了一些RTTI,它允许dynamic_cast检查向下转换的有效性。但它没有提供有关成员(名称或类型)的信息。

答案 4 :(得分:1)

我会说你想做什么,有更好的方法。

答案 5 :(得分:0)

在C中,我通常会创建一个包含所有成员名称,偏移量和大小的元结构。它看起来像这样:

#define MEMBER(name,str) { #name, offsetof(struct str, name), sizeof(*(&((struct str *)(0))->name) }
struct A { char *name, int offset; int size; } = {
MEMBER(name,A),
MEMBER(offset,A),
MEMBER(size,A)
};

然后,如果需要,可以使用创意投射,列出结构的所有成员。