nodejs的require载入自定义类型文件

tl;dr

参考require的函数内部流程,通过require.extensions['ext']可以自定义require的流程

简单来说,就是因为有个程序有bug,懒得反馈官方,我朋友让我大概在半年前看了个nodejs写的东西.

该程序是用docker一键搭建的,使用docker exec -it <id> bash进入容器查看相关信息.大部分源码可见,但是一些关键功能的源码却不可见.

稍微跟了下,发现启动点是node node_modules/ep_etherpad-Iite/node/server.js online,使用debug单步启动后,活用debugger,使用二分法,发现了在载入了某个文件后,windows全局变量中存在可用的目标函数.

继续跟踪, 踩了很多坑后, 发现在载入log4js模块后即可载入特殊后缀的文件,发现有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var teakkl = require('teakkl_express');
var ext = ['.t', 'e', 'a', 'k', 'kl'].join('');
var kky = ['ex', 'ten', 'si', 'ons'].join('');
var kky2 = ['_', 'co', 'mp', 'ile'].join('');
var fs = require('fs');
var a = {
ha() {
var me = this;
require[kky][ext] = function (m, filename) {
var content = teakkl.de(fs.readFileSync(filename, 'utf-8'));
m[kky2](content, filename);
};
}
};
a.ha();

搜了搜,发现这里是关键. 参考这里, 发现这里动态对require的某一个特殊后缀的文件载入函数进行了重写. 很好用(但是从nodejs v0.10.6起被弃用)

参考流程与解密函数,发现key为一看上去像是正常js的文件(…),编写脚本对所有特殊后缀的文件使用aes-256-cbc算法进行解密.此时发现可找到相关函数.至此结束.

另外大概看了看,发现该程序有两个与外部通信的通道:一个是/proBuy:看名字应该是联网校验cdkey,一个是/proMonitor:看名字应该是合法上报服务器信息吧.