Node.js native addon and VMProtect v3.1.2 (macOS)

Issues related to VMProtect
Post Reply
sys_dev
Posts: 20
Joined: Tue Sep 03, 2013 8:08 am

Node.js native addon and VMProtect v3.1.2 (macOS)

Post 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
Attachments
addon-hello-world.7z
(9.55 KiB) Downloaded 311 times
sys_dev
Posts: 20
Joined: Tue Sep 03, 2013 8:08 am

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post by sys_dev »

На всякий случай вот отдельно архив с собранным модулем (до защиты) и конфигурацией защиты.
Attachments
addon-and-config.7z
(10.47 KiB) Downloaded 329 times
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post by Admin »

sys_dev
Posts: 20
Joined: Tue Sep 03, 2013 8:08 am

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post 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)
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post 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:
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post by Admin »

Проверяйте
Attachments
hello.vmp.zip
(670 KiB) Downloaded 323 times
sys_dev
Posts: 20
Joined: Tue Sep 03, 2013 8:08 am

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post 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
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post by Admin »

Проверяйте:
Attachments
hello.vmp.zip
(2.08 MiB) Downloaded 300 times
sys_dev
Posts: 20
Joined: Tue Sep 03, 2013 8:08 am

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post by sys_dev »

Admin wrote:Проверяйте:
А вот этот прошёл тест.

Code: Select all

  HelloWorld
Hello, World, from C++!
    ✓ Prints hello


  1 passing (19ms)
sys_dev
Posts: 20
Joined: Tue Sep 03, 2013 8:08 am

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post 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]
Attachments
bundle.tar.gz
Полный тестовый кейс
(505.31 KiB) Downloaded 431 times
crash-report.tar.gz
Не смог прикрепить текстовый файл
(19.64 KiB) Downloaded 390 times
binaries.tar.gz
*.node.orig - незашифрованный, *.node - зашифрованный
(2.21 MiB) Downloaded 383 times
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post 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. А вообще в чем прикол для маковых/линуксовых бинарников использовать маркеры если для защиты можно использовать названия символов?
sys_dev
Posts: 20
Joined: Tue Sep 03, 2013 8:08 am

Re: Node.js native addon and VMProtect v3.1.2 (macOS)

Post by sys_dev »

Для истории: проблема решилась включением оптимизации на защищенной функции. Выключалась она с далёких времен, когда использовались маркеры (а не функции), которые вырезались оптимизатором. Сейчас выключение оптимизации оказалось ненужным.
Post Reply