【发布时间】:2019-03-13 19:33:09
【问题描述】:
我知道这种做法违背了不透明数据类型的全部观点,但出于逆向工程的目的,人们如何着手研究不透明数据类型?
【问题讨论】:
-
C 没有任何自省——一旦代码被编译,之后你所能做的就是非常痛苦的逆向工程。编译前比较容易:在相关源码中找到定义。
-
您可以在系统上的标头中查看是否可以找到
fpos_t的定义。如果做不到这一点,你必须希望你在一个开源系统上,并查看你平台上 C 库的开源代码。没有简单、可靠的方法可以从目标代码中查看真正不透明类型的定义。 (不过,有些不透明类型并不像其他类型那样不透明。您可能会发现更多关于FILE的信息,而不是您对不透明类型的预期。) -
@JonathanLeffler 不过,我并不完全理解;要使
fpos_t工作,完整的定义必须在某个地方,否则它只是一个无用的绰号,程序将无法运行。老实说,我有点讨厌人们这样做。我了解隐藏不必要的细节或限制访问以防止人们搞砸任何事情的用途,但我觉得我们正朝着迫使人们只在高水平上操作的方向前进。 -
参见File Streams 上的 POSIX。它说: 每个面向宽的流都有一个关联的
mbstate_t对象,该对象存储流的当前解析状态。对fgetpos()的成功调用应将这个mbstate_t对象的值的表示存储为fpos_t对象的值的一部分。稍后使用相同存储的fpos_t值成功调用fsetpos()将恢复关联的mbstate_t对象的值以及受控流中的位置。
标签: c reverse-engineering information-hiding opaque-pointers