← 返回文章列表

OA系统后端逆向工程

泛微OA系统Ecology 9的后端程序使用Java语言开发,为了深入研究其机制细节,我们对其做逆向工程,将class文件反编译为Java源代码,并对源代码进行分析、理解。

反编译

Ecology 9的class文件都存放在classbean目录中。从服务器上将classbean目录整体下载到本地,然后使用JetBrains IntelliJ IDEA附带的反编译器FernFlower,将classbean目录整体反编译到src目录:

java -cp '<IDEA安装目录>\plugins\java-decompiler\lib\java-decompiler.jar' org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true .\classbean\ .\src\

代码分析

反编译出来的源代码并不是原始代码,它的类名、属性名、方法名、字符串等都保留了意义,但所有的方法参数、局部变量都是形如var1var2的无意义形式,也没有任何注释。

我们建立一个Git仓库oa-backend-reverse-engineering,将反编译出来的源代码放入其中管理,因为我们会在阅读的过程中修改它。我们同时将WEB-INF/lib目录(OA系统的三方库)放入其中,使类库整体完整,以便IDE识别。

以下是阅读、分析反编译出来的Java源代码的方法和经验:

  1. 写注释,包括文档注释、行注释等。
  2. 利用IDE的重构功能,将局部变量改为有意义的名字。
  3. 利用IDE的代码跟踪功能,跳转到相关的上下文。
  4. 在浏览器DevTools中提取API路径的关键词,在IDE中搜索,定位到起始执行点。
  5. 对最常见的类,如BaseBeanRecordSet,做完整分析,加深理解。
  6. 对最常见的架构设计,如命令(command)设计模式,做架构分析,加深理解。

反编译出来的Java源代码只允许用于分析,不允许重新编译后替换线上的class文件。