简答
这是绝对可能的,但准确性和可读性是完全不同的事情。需要澄清一点:逆向工程不是反编译。
长答案
逆向工程通常是您将某些东西(实际上是任何东西)拆开以查看其工作原理的过程。 反汇编是当您获取二进制格式的文件并将机器代码解释为汇编代码时。 反编译是将汇编代码解释为更高级别的语言。
我相信你的问题是真的,为什么不能自动反编译程序? 那么它可以!
有几种不同的Java 反编译器。由于其架构独立性,Java 字节码是完全可逆的。变得棘手的是反编译像 C 这样的语言 。Hex Rays确实提供了 C 反编译器,但 C 是一种复杂的语言。有 10 种不同的方法可以完成相同的任务。可以在 20 行内完成的事情,可以在 3 行或 10 行内完成。正是对语言的解释使得反编译 C 的自动化变得困难。
当然,您可以将 C 反编译为最简单的指令。然后你会得到类似**(*var1) = 3;
或(*bytecode)(param1)
可以调用函数指针的行。更糟糕的是,您必须记住,这些仍然只是一种解释。我怎么强调都不过分。如果解释有误怎么办?这是您在反汇编级别必须担心的事情,但对于一条指令,至少 5-6 个字节有合理数量的结果。现在您必须解释 15-20 个字节才能找出函数调用或 for 循环。如果有反逆向工程技术,那么它会使解释变得更加困难。
上下文起着巨大的作用。char *
函数指针、指针和 a之间有什么区别uint32
?绝对没有,除了它使用的上下文。编译器优化可能使用__fastcall
而不是__stdcall
. 这意味着现在您必须解释函数的参数将在哪里;在堆栈上还是在寄存器中?内联函数、宏、#defines 都将成为更大的子例程的一部分。没有真正的方法来解释这些类型的上下文。