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