我正在试验webAssembly,并试图找出一种方法来验证webAssembly模块使用的JS方法的完整性。
出于讨论的目的,让我们假设二进制模块不可破解(我知道情况并非如此(,但 JS 方面是。
给定以下 C 代码:
#include <emscripten.h>
//js method to validate
void validateMe();
int validateMethods(){
// check validateMe integrity.
// return 1 if validation succeeded.
}
EMSCRIPTEN_KEEPALIVE
void doStuff(){
if (validateMethods()){
// do stuff
}
}
我想从 JS 端调用doStuff()
,只有当完整性检查成功时,doStuff()
才会运行。 我想做某种完整性检查,类似于子资源,检查方法的toString表示。但是,如果我想获取当前(内存中(JS方法到String,我将不得不调用JS,这可能会受到损害。
问:我能否以某种方式以不同的方式获取 toString?任何其他办法也将不胜感激。
更新:深入挖掘后,阅读本文,似乎除了共享数组之外没有办法访问JS内存。因此,任何验证技术都将不胜感激。
更新 2(目标(:我的最终目标是确保 WASM 部分只能与特定的 JS 一起使用,或者至少使其更难与操纵的 JS 进行交互。
小提琴示例:下面的小提琴是一个朴素的函数验证,逐个比较函数字符的 toString。如果更改 validateMe 函数,验证将失败。我正在尝试"防弹"它。
JS是一种动态语言,你可以覆盖(几乎(所有内容。您可以将函数的主体作为字符串获取并对其进行哈希处理以生成它的"快照",然后检查此快照,但可以独立覆盖其中一个内部函数。
var getA = function() { return 1; };
var myFunc = function() {
var a = getA();
return a * 2;
};
WebAssembly.instantiate(wasmBytes, { myFunc });
// ... later on ...
getA = function() { return 5; };
不,它不能。当然,虽然您可以验证某些源代码的完整性,但这并不能为您带来任何真正的安全性。无论您做什么,都无法阻止第三方的计算机运行,修改和做他们喜欢的任何事情。
现在,你可以让它变得更难(混淆、内存加密、自重写代码、解释器/虚拟机......以及所有这些技巧(,但通常情况下,让它变得足够困难以变得有些有用是不平凡的(例如,参见 Denuvo 和这篇 Reddit 帖子,VMProtect,您是否曾经使用过代码虚拟化器或 vmprotect 来防止逆向工程?等(并且, 随着时间的推移或足够的受欢迎程度,无论如何都会被绕过。
保护应用程序的唯一方法是在服务器端运行它;这更昂贵,并且会给您带来其他问题。
请注意,如果您的目标是尝试保护源代码而不是应用程序本身(换句话说,避免其他人读取/复制代码(,那么将(通过优化(像 C 这样的语言编译到 WebAssembly 中可能是一个公平的选择(并且您希望尽可能多地在其中编写您的应用程序(。即使解决方案没有隐藏应用程序的工作方式,它也可以有效地使阅读/重用原始代码/设计变得更加困难 - 它只是一种混淆形式。
但是,这个问题的重点是防止恶意方绕过保护和/或操纵行为/数据,为此,通过编译到 WebAssembly 进行一些混淆不会为您带来任何安全性。