解某 Node.js 加密程序

1,285 阅读4分钟

0x00 /**/

三月二十九日,晴,还没发工资,不知道毛哥心情如何,反正我心情不太好!


至于为什么要写这方面内容,我没有毛哥这么会拍脑袋,只是前几日正好偶遇而已。虽然我不是 netxfly,但是还是会贴一些代码的。毕竟作为已婚男人 100 块稿费还是蛮有诱惑力的。


0x01 require('havealook')

从官网下载安装程序进行安装,过程略。


程序会安装到 /usr/ChaosGroup/ 目录下,开放 30304 端口。


通过 curl 访问可以看到是基于 Express 的 WEB 程序,那一定是用 Node.js 运行的。

在程序目录中找到启动程序 vrol.bin,-h 看下,伪装的一点都不好。

既然是基于 Node.js + Express,代码肯定是 Javascript 写的,那是不是查看相关 js 文件就可以得到代码喽?其实我也是这么想的。但是如果真的这么简单我还拿什么骗稿费。:)


经过对目录内文件的一番查看和思考,有两点收获:

  1. 核心代码打包在 vrol.nar 中,用 vrol.bin 能解析执行;

  2. js 代码被加密,用 vrol.bin 能解析执行;

那就各个击破。


0x02 require('unnar')

最初我以为是通过 github.com/h2non/nar 这个程序打的包,可惜并不是,另辟他径。


用 Hex Fiend 打开 vrol.nar 文件后,从右边窗口中可以看出来文件的前半部分是 JSON 数据,后半部分是 js 代码,如下图:


复制前半部分 JSON 数据用一种友好的方式来看看。

{
    "files": {
        "bundles.js": {
            "size": 7500,
            "offset": "0"
        },
        "config.js": {
            "size": 5560,
            "offset": "7500"
        },
        ……
        "handlers": {
            "files": {
                "dongle.js": {
                    "size": 11128,
                    "offset": "19408"
                },
                ……
            }
        }
        ……
    }
}


很明显对不对?这就是所有文件的索引信息,通过偏移和大小就可以得到所有 js 文件。经过简单分析,整理下文件结构如下:

0-15 字节 -- 忽略就好
16-64038 字节 -- 文件索引信息,JSON 数据
64039-64040 字节 -- Null
64040-9354437 字节 -- 所有 js 文件代码


用一种粗暴的方式来提取 js 文件,上代码:

最终提取的文件结构和内容如下:

0x03 console.log('show me the code')

我们得到的是被加密后的代码,从前面图中可以看出,这些代码具有想同的格式

7caa5cf662ad45ccaa92d5c113b6e4a4 + base64 编码字符串


很像 AES 加密对不对,前面是 32 位加密密钥,后面是加密后的 base64 数据。但是试了所有的 AES 解密姿势都不行。看来要从 vrol.bin 程序里面找原因了。


在同事的帮忙下开始对 vrol.bin 进行逆向分析和动态调试。


在 IDA 中寻找解密相关函数,通过分析又有两点收获:

  1. 7caa5cf662ad45ccaa92d5c113b6e4a4 并不是什么解密密钥,只是标识该文件是加密文件,需要解密后执行;

  2. 的确是 AES 加密,但是密钥和 iv 在程序中生成;


两条路:

  1. 分析密钥和 iv 生成算法,逆向得出

  2. 动态调试得出密钥和 iv

很明显第二条路更快捷,通过之前 IDA 分析 key 和 iv 分别在寄存器 rdx 和 rcx 中,上 gdb:


得到 key 和 iv 就可以进行解密了,我们用明哥所说的世界上最好的 PHP 语言来写解密代码:


测试下

完美!


0x04 process.exit()

本文只是记录了一种 Node.js 代码保护和对抗的过程,行文略粗,请您见谅,也希望您从中有所收获。

其实想想,100 块也没有很大的诱惑力。

清明节这种节日就不祝大家快乐了。


注:本文为“小米安全中心”原创,转载请联系“小米安全中心”