Page 2 of 2
Re: Как защитить значения глобальных констант?
Posted: Mon May 17, 2010 2:21 am
by Admin
Да и еще было бы хорошо, если в будущем функция VMProtectDecryptStringX будет еще и возвращать длину раскриптованой строки.
Не вижу никаких проблем с реализацией этого на стороне пользователя - после декрипта вызвать соответствующую функцию, возвращающую длину строки.
Re: Как защитить значения глобальных констант?
Posted: Mon May 17, 2010 4:00 pm
by Cyber
Не вижу никаких проблем с реализацией этого на стороне пользователя
Так оно сейчас и работает, но вдруг декриптованная строчка будет без завершающего нуля??? что тогда - exception ?
Re: Как защитить значения глобальных констант?
Posted: Mon May 17, 2010 4:03 pm
by Admin
Так оно сейчас и работает, но вдруг декриптованная строчка будет без завершающего нуля???
VMProtectDecryptStringX на входе "ждет" строчку с завершающим нулем, соответственно после декрипта он там тоже будет.
Re: Как защитить значения глобальных констант?
Posted: Mon May 17, 2010 4:31 pm
by Cyber
VMProtectDecryptStringX на входе "ждет" строчку с завершающим нулем, соответственно после декрипта он там тоже будет.
Функция ожидает константную строчку в момен компиляции и завершающий ноль будет в любом случае, а вот во время дикриптации - я за ноль уже не уверен!
+ если я буду "ДОСТОВЕРНО" знать длину строки которую вернула эта функция - я смог бы заполнить ее рандомным мусором. Делать предположение на то, что там будет ноль крайне не желательно.
Re: Как защитить значения глобальных констант?
Posted: Tue May 18, 2010 2:38 am
by Admin
Функция ожидает константную строчку в момен компиляции и завершающий ноль будет в любом случае, а вот во время дикриптации - я за ноль уже не уверен!
В момент декриптации происходит декриптация ВСЕЙ строки, включая завершающий ноль - иначе ваша программа перестанет нормально работать.
+ если я буду "ДОСТОВЕРНО" знать длину строки которую вернула эта функция - я смог бы заполнить ее рандомным мусором. Делать предположение на то, что там будет ноль крайне не желательно.
Зачем вы собрались заполнять строку рандомным мусором? Если только для того чтобы после использования убрать из памяти её декриптованный вариант, то вы столкнетесь сразу с несколькими проблемами:
1. При заполении памяти мусором при последующем вызове VMProtectDecryptStringX с той же самой строкой вы получите свой мусор, т.к. декрипт строки происходит только при первом вызове VMProtectDecryptStringX и указатель на память пишется в "глобальную" переменную, которая будет выступать результатом при повторном VMProtectDecryptStringX.
2. В режиме отладки (до компиляции в VMProtect) вы гарантировано получите Access Violation при записи по указателю, т.к. VMProtectDecryptStringX вернет вам тотже самый указатель, который вы передали в качестве параметра (строки). А все константные вещи компилер складывает в секцию без флага WRITABLE.
Re: Как защитить значения глобальных констант?
Posted: Tue May 18, 2010 5:32 am
by Cyber
В момент декриптации происходит декриптация ВСЕЙ строки, включая завершающий ноль - иначе ваша программа перестанет нормально работать.
Да я же не против, что ваш алгоритм гарантирует криптацию с завершающим нулем, но согласитесь, строка которую вернула функция - уже не константа которая была в момент компиляции!
1. При заполении памяти мусором при последующем вызове VMProtectDecryptStringX с той же самой строкой вы получите свой мусор, т.к. декрипт строки происходит только при первом вызове VMProtectDecryptStringX и указатель на память пишется в "глобальную" переменную, которая будет выступать результатом при повторном VMProtectDecryptStringX.
По большому счету VMProtectDecryptStringX нужен чтобы скрыть строку в бинарнике от чужих глаз. Я получу строчку, произведу с ней нужные манипуляции, и с точки зрения безопасности (по крайней мере до тех пор пока нет функции гарантированого уничтожения этой строки - аналог Free) я хотел бы избавится от нее, иначе смысл ее прятать - так как вплоть до момента завершения программу в адрессном пространстве процесса будет гулять открытый указатель на нее.
2. В режиме отладки (до компиляции в VMProtect) вы гарантировано получите Access Violation при записи по указателю, т.к. VMProtectDecryptStringX вернет вам тотже самый указатель, который вы передали в качестве параметра (строки). А все константные вещи компилер складывает в секцию без флага WRITABLE.
Это вообще не проблемма

Re: Как защитить значения глобальных констант?
Posted: Tue May 18, 2010 6:00 am
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;
В результате вам не надо будет замарачиваться с удалением этой строки из памяти приложения после работы с ней.
Re: Как защитить значения глобальных констант?
Posted: Tue May 18, 2010 12:48 pm
by Cyber
Еще одна трабла со стингами. При использовании типа протекта для стрингов: мутация - VMProtectDecryptStringA падает с завидной регулярностью. Бинарник не перекомпиливаю, а только перепротекчиваю... в 9 из 10 случаем - эксепшен! При использовании протекта в режиме: виртуаллизация 10 из 10 - все ок.
Прошу как то обратить на это внимание, т.к использовать виртуализацию вообще в проекте не хочется.
Re: Как защитить значения глобальных констант?
Posted: Tue May 18, 2010 12:55 pm
by Admin
Еще одна трабла со стингами. При использовании типа протекта для стрингов: мутация - VMProtectDecryptStringA падает с завидной регулярностью. Бинарник не перекомпиливаю, а только перепротекчиваю... в 9 из 10 случаем - эксепшен!
Присылайте тестовый проект - будем разбираться.
Re: Как защитить значения глобальных констант?
Posted: Wed May 19, 2010 9:42 am
by Cyber
Присылайте тестовый проект - будем разбираться.
На данном этапе выслать рабочий проект не могу, если воспроизведу на тестовом - то обязательно пришлю. Проблемму со стрингами решим своими силами, а с не парными маркерами поиграемся с настройками компиляции. Спасибо.