Как защитить значения глобальных констант?

Issues related to VMProtect
Admin
Site Admin
Posts: 2586
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

Да и еще было бы хорошо, если в будущем функция VMProtectDecryptStringX будет еще и возвращать длину раскриптованой строки.
Не вижу никаких проблем с реализацией этого на стороне пользователя - после декрипта вызвать соответствующую функцию, возвращающую длину строки.
Cyber
Posts: 48
Joined: Mon Feb 08, 2010 3:29 pm

Re: Как защитить значения глобальных констант?

Post by Cyber »

Не вижу никаких проблем с реализацией этого на стороне пользователя
Так оно сейчас и работает, но вдруг декриптованная строчка будет без завершающего нуля??? что тогда - exception ?
Admin
Site Admin
Posts: 2586
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

Так оно сейчас и работает, но вдруг декриптованная строчка будет без завершающего нуля???
VMProtectDecryptStringX на входе "ждет" строчку с завершающим нулем, соответственно после декрипта он там тоже будет.
Cyber
Posts: 48
Joined: Mon Feb 08, 2010 3:29 pm

Re: Как защитить значения глобальных констант?

Post by Cyber »

VMProtectDecryptStringX на входе "ждет" строчку с завершающим нулем, соответственно после декрипта он там тоже будет.
Функция ожидает константную строчку в момен компиляции и завершающий ноль будет в любом случае, а вот во время дикриптации - я за ноль уже не уверен!

+ если я буду "ДОСТОВЕРНО" знать длину строки которую вернула эта функция - я смог бы заполнить ее рандомным мусором. Делать предположение на то, что там будет ноль крайне не желательно.
Admin
Site Admin
Posts: 2586
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

Функция ожидает константную строчку в момен компиляции и завершающий ноль будет в любом случае, а вот во время дикриптации - я за ноль уже не уверен!
В момент декриптации происходит декриптация ВСЕЙ строки, включая завершающий ноль - иначе ваша программа перестанет нормально работать.
+ если я буду "ДОСТОВЕРНО" знать длину строки которую вернула эта функция - я смог бы заполнить ее рандомным мусором. Делать предположение на то, что там будет ноль крайне не желательно.
Зачем вы собрались заполнять строку рандомным мусором? Если только для того чтобы после использования убрать из памяти её декриптованный вариант, то вы столкнетесь сразу с несколькими проблемами:
1. При заполении памяти мусором при последующем вызове VMProtectDecryptStringX с той же самой строкой вы получите свой мусор, т.к. декрипт строки происходит только при первом вызове VMProtectDecryptStringX и указатель на память пишется в "глобальную" переменную, которая будет выступать результатом при повторном VMProtectDecryptStringX.
2. В режиме отладки (до компиляции в VMProtect) вы гарантировано получите Access Violation при записи по указателю, т.к. VMProtectDecryptStringX вернет вам тотже самый указатель, который вы передали в качестве параметра (строки). А все константные вещи компилер складывает в секцию без флага WRITABLE.
Cyber
Posts: 48
Joined: Mon Feb 08, 2010 3:29 pm

Re: Как защитить значения глобальных констант?

Post by Cyber »

В момент декриптации происходит декриптация ВСЕЙ строки, включая завершающий ноль - иначе ваша программа перестанет нормально работать.
Да я же не против, что ваш алгоритм гарантирует криптацию с завершающим нулем, но согласитесь, строка которую вернула функция - уже не константа которая была в момент компиляции!
1. При заполении памяти мусором при последующем вызове VMProtectDecryptStringX с той же самой строкой вы получите свой мусор, т.к. декрипт строки происходит только при первом вызове VMProtectDecryptStringX и указатель на память пишется в "глобальную" переменную, которая будет выступать результатом при повторном VMProtectDecryptStringX.


По большому счету VMProtectDecryptStringX нужен чтобы скрыть строку в бинарнике от чужих глаз. Я получу строчку, произведу с ней нужные манипуляции, и с точки зрения безопасности (по крайней мере до тех пор пока нет функции гарантированого уничтожения этой строки - аналог Free) я хотел бы избавится от нее, иначе смысл ее прятать - так как вплоть до момента завершения программу в адрессном пространстве процесса будет гулять открытый указатель на нее.
2. В режиме отладки (до компиляции в VMProtect) вы гарантировано получите Access Violation при записи по указателю, т.к. VMProtectDecryptStringX вернет вам тотже самый указатель, который вы передали в качестве параметра (строки). А все константные вещи компилер складывает в секцию без флага WRITABLE.
Это вообще не проблемма :)
Admin
Site Admin
Posts: 2586
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

но согласитесь, строка которую вернула функция - уже не константа которая была в момент компиляции!
Совершенно непонятно почему вы думаете, что функция возвращает совсем не то что было на момент компиляции :)) Согласитесь, что если бы она возвращала не то (в том числе и без завершающего нуля), то ваша программа работала бы неправильно после компиляции в VMProtect.
По большому счету VMProtectDecryptStringX нужен чтобы скрыть строку в бинарнике от чужих глаз. Я получу строчку, произведу с ней нужные манипуляции, и с точки зрения безопасности (по крайней мере до тех пор пока нет функции гарантированого уничтожения этой строки - аналог Free) я хотел бы избавится от нее, иначе смысл ее прятать - так как вплоть до момента завершения программу в адрессном пространстве процесса будет гулять открытый указатель на нее.
Если у вас нет возможности подождать реализацию VMProtectFreeString, то я бы предложил вам более простой вариант (но правда не очень удобный) с созданием строки на стеке:

Code: Select all

var S: array [0..9] of Byte;
...
S[0]:='A';
S[1]:='b';
S[2]:='c';
...
S[9]:=#0;
В результате вам не надо будет замарачиваться с удалением этой строки из памяти приложения после работы с ней.
Cyber
Posts: 48
Joined: Mon Feb 08, 2010 3:29 pm

Re: Как защитить значения глобальных констант?

Post by Cyber »

Еще одна трабла со стингами. При использовании типа протекта для стрингов: мутация - VMProtectDecryptStringA падает с завидной регулярностью. Бинарник не перекомпиливаю, а только перепротекчиваю... в 9 из 10 случаем - эксепшен! При использовании протекта в режиме: виртуаллизация 10 из 10 - все ок.

Прошу как то обратить на это внимание, т.к использовать виртуализацию вообще в проекте не хочется.
Admin
Site Admin
Posts: 2586
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

Еще одна трабла со стингами. При использовании типа протекта для стрингов: мутация - VMProtectDecryptStringA падает с завидной регулярностью. Бинарник не перекомпиливаю, а только перепротекчиваю... в 9 из 10 случаем - эксепшен!
Присылайте тестовый проект - будем разбираться.
Cyber
Posts: 48
Joined: Mon Feb 08, 2010 3:29 pm

Re: Как защитить значения глобальных констант?

Post by Cyber »

Присылайте тестовый проект - будем разбираться.
На данном этапе выслать рабочий проект не могу, если воспроизведу на тестовом - то обязательно пришлю. Проблемму со стрингами решим своими силами, а с не парными маркерами поиграемся с настройками компиляции. Спасибо.
Post Reply