Node.jsのネイティブモジュールをフェイクしてみた
Node.jsのネイティブモジュールをフェイクしてみた:
Node.jsで使うことのできるモジュール
ちなみに,Node.js自体のバイナリは変更しない.
ここで,
自分の用意したモジュールを読み込むようにする.
フェイクされて読み込まれるモジュールはこんな感じ.
既にrequireは置き換わっているので,フェイクされたモジュール内で本物のモジュールを使うときは
Node.jsで使うことのできるモジュール
http fs とかを自分の好きなように置き換えられるようにしてみた.ちなみに,Node.js自体のバイナリは変更しない.
フェイク被害を受けてもらうプログラム
~/index.js
const http = require('http');
http.get('https://example.com/');
http.get() を本来の挙動ではないものにしてしまおう.
require を置き換える
require() で呼ばれる関数はどこ?自分の用意したモジュールを読み込むようにする.
~/require.js
const overwrapNames = [
'http',
];
module.constructor.prototype.require = function (id) {
if (typeof id !== 'string') {
throw new TypeError();
}
if (id === '') {
throw new TypeError();
}
if (overwrapNames.some(name => name === id)) {
return module.constructor._load(`${__dirname}/modules/${id}`, this, false);
}
return module.constructor._load(id, this, /* isMain */ false);
};
既にrequireは置き換わっているので,フェイクされたモジュール内で本物のモジュールを使うときは
module.constructor._load() を直接呼んで読み込む.~/modules/http.js
const http = module.constructor._load('http', module, false);
module.exports = {
...http,
get(...args) {
console.log('DUMMY!', ...args);
},
};
フェイク実行
$ node -r ./require.js ./index.js DUMMY! https://example.com/
コメント
コメントを投稿