Краш при использовании системы лицензирования

Issues related to VMProtect
lach
Posts: 30
Joined: Sat Mar 23, 2019 1:18 pm

Re: Краш при использовании системы лицензирования

Post by lach »

Чтобы не приходилось возиться с экспортами, vmprotect по хорошему должен уметь делать demangling
Определить что для символа стоит использовать librustc_demangle вместо того что сейчас vmprotect использует сейчас можно по одному из двух признаков:

Префикс: _Z (по аналогии с C++, однако там возможный синтаксис шире чем встречается в C++)
Суффикс: 17hXXXXXXXXXXXXXXXXE (X-hexadecimal number, ::h... суффикс в Rust означает какому пакету принадлежит функция)
После которого опционально следует .llvm.XXX... (X - uppercase hex / _ / @)
- legacy схема mangling rust, библиотека что я прислал собрана с ней

Префикс: _R
Суффикс .llvm.XXX... тут тоже может присутствовать (Он добавляется когда включена параллельная компиляция кода)
- v0 схема mangling rust (https://doc.rust-lang.org/beta/rustc/sy ... bol-format)

IDA PRO по умолчанию применяет эту библиотеку для Rust кода:
https://docs.hex-rays.com/user-guide/pl ... gling-name
Admin
Site Admin
Posts: 2703
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Краш при использовании системы лицензирования

Post by Admin »

lach wrote: Thu Jun 12, 2025 2:10 pm Определить что для символа стоит использовать librustc_demangle вместо того что сейчас vmprotect использует сейчас можно по одному из двух признаков
На самом деле немного не так. Он пересекается с GNU_V3, поэтому деманглинг от GCC частично обрабатывает символы от Rust:
https://github.com/gcc-mirror/gcc/blob/ ... dem.c#L164

P.S. Добавлено в 2377.
lach
Posts: 30
Joined: Sat Mar 23, 2019 1:18 pm

Re: Краш при использовании системы лицензирования

Post by lach »

> На самом деле немного не так. Он пересекается с GNU_V3, поэтому деманглинг от GCC частично обрабатывает символы от Rust:

Это я понимаю, под признаками я имел в виду как отличить идентификаторы что gnu v3 demangler будет неправильно переваривать - у Rust всегда последний компонент это ::h0000000000000000, но вы и сами разобрались судя по всему

Красота какая, теперь в Rust при желании можно не декларативно через код выбирать функции для защиты, спасибо!
Post Reply