Page 1 of 1
Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Mon Oct 16, 2017 1:58 pm
by sys_dev
Здравствуйте. Используем VMProtect v.3.1.2 (build 830) на macOS Sierra (10.12.6) для защиты аддона для Node.js в паре с Electron.
После защиты простейшего аддона типа "Hello World", он перестал загружаться в JavaScript. Тестовый пример в аттаче (необходима установка Node.js v7.10.0, а также интернет для выкачивания npm-модулей).
Информация о системе:
Code: Select all
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:
Code: Select all
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
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Mon Oct 16, 2017 2:09 pm
by sys_dev
На всякий случай вот отдельно архив с собранным модулем (до защиты) и конфигурацией защиты.
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Mon Oct 16, 2017 2:25 pm
by Admin
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Mon Oct 16, 2017 2:31 pm
by sys_dev
Не уверен, вывод следующий:
Code: Select all
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)
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Mon Oct 16, 2017 3:23 pm
by Admin
У меня нет идей что означает
Code: Select all
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:
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Mon Oct 16, 2017 3:51 pm
by Admin
Проверяйте
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Mon Oct 16, 2017 4:01 pm
by sys_dev
Admin wrote:Проверяйте
Ошибка уже информативнее:
Code: Select all
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
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Tue Oct 17, 2017 3:27 am
by Admin
Проверяйте:
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Tue Oct 17, 2017 6:39 am
by sys_dev
Admin wrote:Проверяйте:
А вот этот прошёл тест.
Code: Select all
HelloWorld
Hello, World, from C++!
✓ Prints hello
1 passing (19ms)
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Wed Dec 06, 2017 12:54 pm
by sys_dev
Новое падение. Падает на break внутри цикла внутри защищенного кода.
Пример функции, на которой падает.
Code: Select all
#pragma clang optimize off
std::string generateHelloWorld()
{
std::string result;
VMProtectBeginVirtualization( "" );
std::array< unsigned char, 15 > pass;
memcpy( pass.data(), "Hello, World! ", pass.size() );
int length = pass.size();
for( ; length > 0; --length )
{
char c = (char)pass[ length - 1 ];
if( c != ' ' )
{
break;
}
}
result = std::string( (const char*)pass.data(), length );
VMProtectEnd();
return result;
}
#pragma clang optimize on
Та же самая функция, собранная не как addon, а просто command line утилитой не падает.
Если заменить break на bool переменную и проверять её в условии цикла, то тоже не падает.
Флаги компиляции использовались такие:
Code: Select all
-std=c++1z -fpermissive -ffunction-sections -fdata-sections -pthread -msse3 -fno-operator-names -fnon-call-exceptions -fvisibility=hidden -Wno-deprecated-register -m64 -O2 -fno-omit-frame-pointer -fno-strict-aliasing -DNDEBUG
Приложил полный тестовый кейс (требует Node.js) и собранные бинарники (защищённый и просто с маркерами).
Часть crash-report (полный во вложениях):
Code: Select all
Crashed Thread: 0 CrBrowserMain Dispatch queue: com.apple.main-thread
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Trace/BPT trap: 5
Termination Reason: Namespace SIGNAL, Code 0x5
Terminating Process: exc handler [0]
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Thu Dec 07, 2017 7:31 am
by Admin
Проблема в том, что компилятор внутри маркера сделал безусловный переход на тело другой функции и этот код стал телом маркера:
Code: Select all
0000000000000AE8 sub eax, 02
0000000000000AEB jz 0000000000000AFF
0000000000000AED jmp 0000000000000BD3
...
0000000000000BD3 nop cs:[rax+rax+00000000]
0000000000000BE0 push rbp ← helloWorld(v8::FunctionCallbackInfo<v8::Value> const&)
0000000000000BE1 mov rbp, rsp
Соответственно при вызове helloWorld(v8::FunctionCallbackInfo<v8::Value> const&) возникает EXC_BREAKPOINT, т.к. место от оригинального маркера (включая и helloWorld(...)) залито "int 03"
P.S. Судя по дизасму исходник generateHelloWorld выглядит совсем не так.
P.P.S. А вообще в чем прикол для маковых/линуксовых бинарников использовать маркеры если для защиты можно использовать названия символов?
Re: Node.js native addon and VMProtect v3.1.2 (macOS)
Posted: Fri Mar 16, 2018 9:53 am
by sys_dev
Для истории: проблема решилась включением оптимизации на защищенной функции. Выключалась она с далёких времен, когда использовались маркеры (а не функции), которые вырезались оптимизатором. Сейчас выключение оптимизации оказалось ненужным.