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
Для истории: проблема решилась включением оптимизации на защищенной функции. Выключалась она с далёких времен, когда использовались маркеры (а не функции), которые вырезались оптимизатором. Сейчас выключение оптимизации оказалось ненужным.