请问下如何在用c++写的addons中获取调用它的node文件所在的名称与路径?
发布于 5 年前 作者 wldlzt 2336 次浏览 来自 问答

如题。最近公司给了个任务,要尽可能地加密node.js,因为部分系统要放在友商的服务器上运行,不想代码泄露,我把node中核心的业务代码加密后放进c++里,通过调用时输出,并通过判断调用它的node文件的md5值强制调用的node文件不可修改,否则启动报错。但遇到一个关键问题是,如何在c++里判断哪个node文件调用了它,如果能做到这一步就完美了。当然如果实在做不到,我只能在启动时强制清除所有node进程,只保留我自己的node项目进程…希望大家给我提一点思路…

14 回复

考虑使用 pkg 打包成二进制

@GopherJ 等好久终于有人回了,谢谢先…这个pkg是如何命中我要解决的问题的?我贴子的意思是,如何在c++的代码中,自动获取调用它的node文件的路径…

@GopherJ 啊,还是说这个pkg是把整个项目打包??

不好意思我可能没认真看你的需求,如果我没理解错的话你只需要加密nodejs放到友商服务器上,那你完全可以将整个项目打包成二进制,有 assets 的话需要注意处理。

@GopherJ 似乎可行,但我们也要频繁升级,这样就麻烦了…

升级是指? 我的一个小项目目前是通过一个脚本编译成二进制发布

const ora = require('ora');
const os = require('os');
const chalk = require('chalk');
const { exec } = require('pkg');

const os_map = {
    'linux'  : 'linux',
    'win32'  : 'win',
    'darwin' : 'osx'
};
const node_version = 8;
const platform = os.platform();

const spinner = ora('Compiling...').start();

const compile = async (target) => {
    return await exec([
        'dist/index.js',
        '--target',
        `node${node_version}-${target}-x64`,
        '--out-dir',
        `../bin/${target}-x64`
    ]);
};

compile(process.env.TARGET_OS || os_map[platform])
    .then(_ => {
        spinner.stop();
        process.stdout.write(chalk.cyan('\n    Build complete!'));
    })
    .catch(_ => {
        spinner.stop();
});

您可以参考下

@GopherJ 先谢谢,我的升级是指直接替换系统里的业务路由,因系统的业务路由有版本上的区分,若某个版本有问题或新增业务处理流程,就需要在修复后直接替换。我想问下是否您这个解决方安案,可是否以把一个项目分成多个二进制包装并关联起来运行?

@GopherJ 您好,我试了下似乎可行,我想再了解一下,经过pkg处理的文件,有没办法再还原出代码的?

调用时传参数 __filename, webpack压损混淆js

来自酷炫的 CNodeMD

@zswnew 您好,现在怕的是有人非法传参,没调用__filename,这而是直接写死了其它参数值.混淆倒有的

node怎么做,c++就做一次模拟就好了。

#include <nan.h>
#include<stdio.h>

const char* ToCString(const v8::String::Utf8Value& value) {
  return *value ? *value : "<string conversion failed>";
}

void getFilePath(const Nan::FunctionCallbackInfo<v8::Value>& info)
{
  v8::Local<v8::Object> global = Nan::GetCurrentContext()->Global();
  v8::Local<v8::Object> process = global->Get(v8::String::NewFromUtf8(info.GetIsolate(), "process", v8::NewStringType::kNormal).ToLocalChecked())->ToObject();
  v8::Local<v8::Object> mainModule = process->Get(v8::String::NewFromUtf8(info.GetIsolate(), "mainModule", v8::NewStringType::kNormal).ToLocalChecked())->ToObject();
  v8::Local<v8::String> filename = mainModule->Get(v8::String::NewFromUtf8(info.GetIsolate(), "filename", v8::NewStringType::kNormal).ToLocalChecked())->ToString();
  v8::String::Utf8Value filename_str(info.GetIsolate(), filename);
  printf("%s\r\n",ToCString(filename_str));
  info.GetReturnValue().Set(filename);
}

但作为js开发者,我还是更建议使用wasm,更方便更高效更多环境支持更未来。 作为js团队,我不可能让团队每一个人都了解V8底层和过多的C++,这对团队效率来说损耗太大了。

@zy445566 非常非常感谢~~~,你讲的也很在理…目前的话,底层方面倒是只有我一个人在做这些事,忝为技术经理,但学习劲头已经不如很多年轻的同事了,只能硬着头皮赶一赶;团队成员还是以JS的技术栈为主,但无奈的是,自身纵观与把控全局的能力提升太难,现在也就只能遇到一个技术要点就寻求一下帮助,不想这样,但已是能力所限了…再次感谢

@wldlzt 惭愧,我也是运气好,恰好知道这一点。别的方向上也是要大量提问的,但有的时候反倒缺少这样的勇气,真的很惭愧。楼主能这样,我是打心底里佩服的。

@zy445566 客气了~~~~

回到顶部