如何逆向工程经Zeit PKG打包的Node.js应用并检测恶意软件?
逆向分析Zeit PKG打包应用的新手指南
作为经常帮人排查这类打包应用安全性的开发者,我会从新手能上手的步骤一步步给你讲,不用怕太复杂,咱们慢慢来:
第一步:先做静态预分析(不用运行程序)
先别急着启动程序,先收集基础信息,判断大致结构:
- 用
file命令(Linux/macOS)或者文件属性窗口(Windows)确认它的平台类型,比如是ELF、PE还是Mach-O文件,这能帮你选后续的工具。 - 用
strings命令扫一遍可执行文件,看看能不能找到明文的字符串,比如域名、文件路径、函数名,有时候能发现可疑线索(比如奇怪的境外域名、加密相关的关键词)。 - 可以用PEview(Windows)、otool(macOS)或者readelf(Linux)查看文件的节区和导入表,有没有调用可疑的系统API,比如网络请求、文件写入、进程创建相关的接口。
第二步:提取PKG打包的内部资源
PKG打包的应用本质是把Node.js二进制、代码快照和依赖打包成一个单文件,咱们先把里面的内容拆出来:
- 用专门的PKG提取工具
pkg-extract,先通过npm install -g pkg-extract安装,然后运行pkg-extract path/to/your/app,它会自动把里面的Node二进制、V8快照文件(通常叫snapshot_blob.bin)和其他资源提取到指定目录。 - 如果工具不好用,也可以手动找偏移:用十六进制编辑器(比如HxD、010 Editor)打开文件,搜索
NODE_JS或者SNAPSHOT_BLOB这类标记,找到快照的起始和结束位置,手动导出成单独的文件。
第三步:解析V8快照里的代码
这是最关键的一步,因为你的代码被V8快照混淆了,普通反编译工具直接用不了:
- 用
v8-snapshot-extractor这类工具,把提取到的snapshot_blob.bin和对应的Node.js二进制(从PKG里拆出来的那个)放到同一目录,然后运行工具,它会加载快照并导出里面的JavaScript代码。 - 注意:还原出来的代码大概率是混淆过的(比如变量名被改成a、b、c这类无意义字符),这时候可以用
js-beautify这类工具格式化代码,方便阅读。重点排查可疑逻辑:比如偷偷发送数据到陌生域名、修改系统文件、执行shell命令之类的行为。
第四步:动态分析(必须在隔离环境里运行)
静态分析不够的话,就得运行起来看行为,但绝对不能在日常使用的电脑上直接运行:
- 用虚拟机(比如VirtualBox、VMware)装一个干净的系统(比如Ubuntu、Windows),把应用拷贝进去测试。
- 用监控工具追踪它的行为:
- 网络监控:用Wireshark或者tcpdump抓包,看它有没有和陌生IP/域名通信。
- 文件监控:用Process Monitor(Windows)或者inotifywait(Linux)看它读写了哪些文件,有没有修改系统关键路径的内容。
- 进程监控:看它有没有创建子进程,或者调用可疑的系统命令。
- 调试器(比如gdb、x64dbg)对新手门槛较高,先从上面的监控工具入手就足够了。
新手必记的安全提醒
- 绝对不要在非隔离环境运行可疑程序,哪怕你觉得只是“看看”,恶意软件可能一启动就触发破坏行为。
- 如果还原后的代码太复杂看不懂,可以重点搜索关键词:
fetch、axios、child_process、fs.writeFile、exec这些,都是可能涉及恶意行为的API。
内容的提问来源于stack exchange,提问作者Nai Maen
相关产品推荐
相关产品推荐

