【问题标题】:How do I reverse engineer a compiler?如何对编译器进行逆向工程?
【发布时间】:2012-01-16 09:57:42
【问题描述】:

我有一个编译器,可以为未记录的 VM 编译为未记录的字节码。我希望能够编译到同一个 VM,但我不确定如何去做。我如何学习做到这一点?有没有人发表过他们做同样事情的日志或日志?

编辑:我没有提到这是 LEGO Mindstorms 的 RobotC 3.0 compiler。在任何人提出其他建议之前,我对 nXc 和类似项目都了如指掌,但由于我正在帮助 FIRST FTC 机器人团队,该团队只能使用 RobotC 或 LabView。

至于那些建议我针对编译器语言的人,我还没有这样做,因为我希望编译器未公开的硬件的某些功能将被固件公开,并且因为我想做比 RobotC 允许的更多的自定义内存管理。

【问题讨论】:

  • 编译器只是另一个程序,可以这样调试。
  • 这可能需要几个月的时间。让你的编译器以你已有的编译器的输入语言为目标怎么样?

标签: compiler-construction reverse-engineering


【解决方案1】:

我倾向于反汇编编译器。如果它是用 .NET(C#、VB.NET 等)或 Java 编写的,那么有些反编译器会为您提供与原始源代码非常接近的非常(除非它被混淆了)。即使它是 C++ 并且您只能获得汇编,库调用也可能为您指明正确的方向。

如果字节码很小,另一种选择是从“Hello world”程序开始,编译它,稍作改动,编译,然后比较两个字节码结果。

如果您可以发布有关特定编译器/VM 的更多信息,也许其他人有这方面的经验。

编辑:鉴于这是一个商业产品,通过反编译对其进行逆向工程可能会违反其许可协议。 RE'ing 字节码可能不会(我不是律师)。不过,这听起来像你在 Catch-22 中。如果你成功了,你就没有使用 RobotC 或 LabView。如果比赛只指定代码必须在 RobotC VM 上运行,它可能是可行的。但是请记住,一旦您重新编写了字节码,您仍然必须编写自己的编译器,然后任何人都可以编写任何软件。如果您这样做是为了好玩,那就太好了;否则可能不可行。

我确实找到了一个基于硕士论文的有趣链接:Software Reverse Engineering

【讨论】:

  • 是的,我们只需要使用固件 (VM),而不是实际的编译器。我是 PL 人,所以编译器对我来说就像是第二天性,只要我对字节码有某种规范。
【解决方案2】:

您可以在这里查看大量资源:

http://en.wikipedia.org/wiki/Lego_Mindstorms_NXT_2.0

【讨论】:

  • 我不相信你理解我的问题——这些资源都不适用,因为 RobotC 使用自定义固件,而且我仅限于使用 RobotC(LabView 在这里真的不是一个选项)。
  • 不幸的是,“RobotC ... 需要自定义固件才能运行。”顺便说一句,关于定位输入语言的好建议 - 我建议将该评论移至您的答案中。虽然这对 OP 没有帮助,但它可能会帮助处于类似情况的其他人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2011-05-09
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多