2

例如,我有一个,我想保护源代码不被查看。想到的第一个方法是为私有函数创建公共包装器,如下所示

function executeMyCoolFunction(param1, param2, param3) {
  return executeMyCoolFunction_(param1, param2, param3);
}

通过这种方式,只有代码的公共部分是可见的。很好,但所有 Google 服务功能看起来都像function abs() {/* */}. 我很好奇,有没有像谷歌那样隐藏库源代码的方法?

编辑00:不要通过使用另一个库来“隐藏”库代码,即具有已知项目密钥的LibA 使用具有未知项目密钥的LibB。LibB 的公共函数代码可以获取甚至执行。代码是

function exploreLib_(lib, libName) {
  if (libName == null) {
    for (var name in this) {
      if (this[name] == lib) {
        libName = name;
      }
    }
  }
  var res = [];
  for (var entity in lib) {
    var obj = lib[entity];
    var code;
    if (obj["toSource"] != null) {
      code = obj.toSource();
    }
    else if (obj["toString"] != null) {
      code = obj.toString();
    }
    else {
      var nextLibCode = exploreLib_(obj, libName + "." + entity);
      res = res.concat(nextLibCode);
    }
    if (code != null) {
      res.push({ libraryName: libName, functionCode: code });
    }
  }
  return res;
}

function explorerLibPublicFunctionsCode() {
  var lstPublicFunctions = exploreLib_(LibA);
  var password = LibA.LibB.getPassword();
}
4

2 回答 2

0

编辑:更改了我的答案以反映异常的堆栈跟踪将包含库项目密钥的事实。

在此示例中,MyLibraryB 是 MyLibraryA 包含的库。两者都公开共享以供查看(访问控制),但只有 MyLibraryA 的项目密钥是已知的。攻击者似乎很难看到 MyLibraryB 中的代码:

//this function is in your MyLibraryA, and you share its project key
function executeMyCoolFunction(param1, param2, param3) {
  for (var i = 0; i < 1000000; i++) {
    debugger; //forces a breakpoint that the IDE cannot? step over
  }
  //... your code goes here
  //don't share MyLibraryB project key
  MyLibraryB.doSomething(args...); 
}

但根据@megabyte1024 的评论,如果您要在 MyLibraryB.doSomething() 中引发异常,则堆栈跟踪将包含 MyLibraryB 的项目密钥。

于 2012-08-11T22:40:48.667 回答
0

我不知道谷歌做了什么,但你可以做这样的事情(未经测试!只是一个想法):

函数声明:

var myApp = {
  foo: function { /**/ },
  bar: function { /**/ }
};

然后,在另一个地方,一个匿名函数写入 foo() 和 bar():

(function(a) {
  a['\u0066\u006F\u006F'] = function(){
    // here code for foo
  };
  a['\u0062\u0061\u0072'] = function(){
    // here code for bar
  };
})(myApp);

您可以打包或缩小以进一步混淆。

于 2012-08-11T23:33:34.370 回答