我一直在考虑将我现有的一些固件恢复原状。固件的一个特征是它使用许多预处理器宏进行编译。现在,据我所知,这些都不包含在二进制文件中,因此反编译器无法帮助解决这些问题。有什么办法可以恢复这些?有一种已知的技术可以推断它们的存在吗?

评论

尽管答案似乎是权威的“否”,但我不认为为什么不能编写这样的翻译系统至少要费劲。从本质上讲,这可以看作是文本替换,这种替换有时是可逆的。如果我的宏替换了“ abc”->“ x”和“ def”->“ x”,那么当我看到“ x”时,它可能是“ abc”或“ def”或仅仅是“ x”。坏。但是实际上,它以另一种方式起作用,即更大,更独特的字符串通常位于右侧。因此,我想可能会检测到某些情况。

当我写这篇文章时,我从启发式的角度思考了更多,例如,如果您看到一段代码似乎以与编译器处理宏的方式一致的方式被复制了。回想起来,这将是很难/不可能的。

#1 楼

不能。反编译器可以在其其他功能之上包括特殊的模式匹配启发式算法,以检测宏,但总的来说,宏只是由编译器以与其他代码相同的方式处理的代码。可能会对它们进行外观转换的优化,例如恒定传播,消除死代码,消除常见子表达式,循环不变代码运动等,这意味着它们可能不会以易于巩固的句法模式表现出来,被匹配。您的选择基本上是为反编译器编写一个post-pass(例如Hex-Rays插件)或手动识别宏。

评论


您也可能会忘记条件编译。

–锑
2013年6月1日2:47

#2 楼

否。宏是您已命名的代码段。在编译时,编译器遇到宏时,它只是将其替换为背后的代码,然后继续进行编译。