繁体   English   中英

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

[英]How would you access a C structure's members without knowing the name?

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

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

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

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

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

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

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

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

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

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

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

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

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

在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)
};

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM