Здравствуйте. Используем VMProtect v.3.1.2 (build 830) на macOS Sierra (10.12.6) для защиты аддона для Node.js в паре с Electron.
После защиты простейшего аддона типа “Hello World”, он перестал загружаться в JavaScript. Тестовый пример в аттаче (необходима установка Node.js v7.10.0, а также интернет для выкачивания npm-модулей).
Информация о системе:
Darwin 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64
clang:
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
dlopen(/Users/bamboo/Develop/lab/test/addon-hello-world/hello.node, 1): Library not loaded:
Referenced from: /Users/bamboo/Develop/lab/test/addon-hello-world/hello.node
Reason: no suitable image found. Did find:
/usr/local/lib/: not a file
/usr/local/lib: not a file
/usr/lib/: not a file
/usr/lib: not a file
Error: dlopen(/Users/bamboo/Develop/lab/test/addon-hello-world/hello.node, 1): Library not loaded:
Referenced from: /Users/bamboo/Develop/lab/test/addon-hello-world/hello.node
Reason: no suitable image found. Did find:
/usr/local/lib/: not a file
/usr/local/lib: not a file
/usr/lib/: not a file
/usr/lib: not a file
at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:173:20)
at Object.Module._extensions..node (module.js:598:18)
at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:173:20)
at Module.load (module.js:488:32)
at tryModuleLoad (module.js:447:12)
at Function.Module._load (module.js:439:3)
at Module.require (module.js:498:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/bamboo/Develop/lab/test/addon-hello-world/test.js:1:175)
at Object.<anonymous> (/Users/bamboo/Develop/lab/test/addon-hello-world/test.js:10:3)
at Module._compile (module.js:571:32)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:488:32)
at tryModuleLoad (module.js:447:12)
at Function.Module._load (module.js:439:3)
at Module.require (module.js:498:17)
at require (internal/module.js:20:19)
at /Users/bamboo/Develop/lab/test/addon-hello-world/node_modules/mocha/lib/mocha.js:231:27
at Array.forEach (native)
at Mocha.loadFiles (/Users/bamboo/Develop/lab/test/addon-hello-world/node_modules/mocha/lib/mocha.js:228:14)
at Mocha.run (/Users/bamboo/Develop/lab/test/addon-hello-world/node_modules/mocha/lib/mocha.js:514:10)
at Object.run (/Users/bamboo/Develop/lab/test/addon-hello-world/node_modules/electron-mocha/mocha.js:61:30)
at App.app.on (/Users/bamboo/Develop/lab/test/addon-hello-world/node_modules/electron-mocha/index.js:54:13)
at emitTwo (events.js:111:20)
at App.emit (events.js:194:7)
dlopen(/Users/bamboo/Develop/lab/test/addon-hello-world/hello.node, 1): Library not loaded:
Referenced from: /Users/bamboo/Develop/lab/test/addon-hello-world/hello.node
Reason: no suitable image found. Did find:
dlopen(/Users/bamboo/Develop/lab/test/addon-hello-world/hello.node, 1): bad mach-o binary, library ordinal (4) too big (max 3) for symbol _CFRelease in /Users/bamboo/Develop/lab/test/addon-hello-world/hello.node in /Users/bamboo/Develop/lab/test/addon-hello-world/hello.node
Та же самая функция, собранная не как addon, а просто command line утилитой не падает.
Если заменить break на bool переменную и проверять её в условии цикла, то тоже не падает.
Соответственно при вызове helloWorld(v8::FunctionCallbackInfov8::Value const&) возникает EXC_BREAKPOINT, т.к. место от оригинального маркера (включая и helloWorld(…)) залито “int 03”
P.S. Судя по дизасму исходник generateHelloWorld выглядит совсем не так.
P.P.S. А вообще в чем прикол для маковых/линуксовых бинарников использовать маркеры если для защиты можно использовать названия символов?
Для истории: проблема решилась включением оптимизации на защищенной функции. Выключалась она с далёких времен, когда использовались маркеры (а не функции), которые вырезались оптимизатором. Сейчас выключение оптимизации оказалось ненужным.