← 返回文章列表

OA系统前端逆向工程

泛微OA系统Ecology 9的前端程序是经过编译、压缩后的JavaScript文件,为了深入研究其机制细节,我们对其做逆向工程,将压缩的JS代码还原为非压缩的JS代码,并对其进行分析、理解。

建立一个项目oa-frontend-reverse-engineering,将线上的JS文件下载下来,按相同的目录结构放在项目中。然后在本地用nginx做反向代理:如果一个JS文件在项目中,则取项目中的,否则取线上的。nginx配置如下:

server {
    listen 80;
    listen [::]:80;
    server_name oa-frontend-reverse-engineering;
    root  "<项目目录>";

    location / {
        # 如果本地存在文件,则取本地文件
        # 否则,通过反向代理,取OA系统上的文件
        try_files $uri $uri/ @reverse_proxy;
    }

    location @reverse_proxy {
        proxy_pass http://<OA系统的IP地址>$request_uri;
    }
}

浏览器通过http://oa-frontend-reverse-engineering/可以正常访问OA系统,其中部分JS文件取自本地,于是,我们不仅可以阅读代码,还可以通过实际执行、断点调试来深入理解细节。

注:后来Chrome系浏览器在DevTools的“源代码”功能中增加了“替换”功能,可以直接用本地JS文件替换指定的线上JS文件,这比做nginx反向代理更简便。

以下是阅读、还原压缩的JavaScript代码的方法和经验:

  1. 第一步:用代码格式化工具(例如VSCode)将压缩的JS代码格式化为缩进良好的版本。
  2. 写注释。
  3. 利用编辑器、IDE的重构功能,将变量改为有意义的名字。
  4. 利用编辑器、IDE的代码跟踪功能,跳转到相关的上下文。但JS代码由于动态性高,通常难以跳转,转而利用搜索功能,用函数名、特殊字符串等关键信息查找上下文。
  5. 在分析过程中,熟悉!0&&||、模块化等常见的编译结果模式,理解JS语法原理,还原为对应的正常写法。
  6. 断点调试,跟踪执行。
  7. 临时改写代码,将某些对象、函数暴露到window上,在控制台中查看、执行之。

还原出来的JS文件只允许用于分析,不允许替换线上的JS文件。