Russian Qt Forum

Qt => Общие вопросы => Тема начата: qate от Октябрь 07, 2016, 15:53



Название: Обфускация строк бинарника
Отправлено: qate от Октябрь 07, 2016, 15:53
Применял ли кто обфускацию строковых констант бинарника ?
Чтобы любопытный пользователь не смог заглянуть и посмотреть строки, некоторые из которых могут содержать чтото важное.
Для целей защиты от дурака.


Название: Re: Обфускация строк бинарника
Отправлено: __Heaven__ от Октябрь 07, 2016, 16:12
Можно попробовать из алфавита набирать индексами нужное слово.
Можно в ресурсах хранить картинки и расшифровывать их в строки по цвету.
Можно штрихкоды коды хранить в ресурсах.


Название: Re: Обфускация строк бинарника
Отправлено: gil9red от Октябрь 07, 2016, 16:20
Можно сжимать строку получив байтовый массив (например, алгоритмом deflate)
Байтовый массив кодировать в base64 и хранить его как строку

Потом обратными получить исходную строку.



Кодировать/декодировать по какому-нибудь алгоритму шифрования. Ключ, где-то спрятать среди переменных.


Название: Re: Обфускация строк бинарника
Отправлено: qate от Октябрь 07, 2016, 22:29
не, иметь в коде не читаемую самому же себе строку неудобно совсем
я думаю использовать чтото из https://github.com/andrivet/ADVobfuscator
вот думаю какие проблемы могут быть


Название: Re: Обфускация строк бинарника
Отправлено: gil9red от Октябрь 07, 2016, 22:56
не, иметь в коде не читаемую самому же себе строку неудобно совсем
я думаю использовать чтото из https://github.com/andrivet/ADVobfuscator
вот думаю какие проблемы могут быть


Вы случаем не пароли / секретные ключи храните? :)


Название: Re: Обфускация строк бинарника
Отправлено: Igors от Октябрь 08, 2016, 09:47
не, иметь в коде не читаемую самому же себе строку неудобно совсем
Вообще-то строки должны храниться в ресурсах (не путать с Qt ресурсами)


Название: Re: Обфускация строк бинарника
Отправлено: Bepec от Октябрь 08, 2016, 09:51
Он имеет в виду строковые константы в коде. Которые в бинарник попадают в читаемом виде, вполне мб даже в ресурсы.

Тут нужно или обфусцировать весь бинарник после компиляции, либо писать свою "надстройку" типа moc. Готовых решений для такой задачи я не видел :)


Название: Re: Обфускация строк бинарника
Отправлено: qate от Октябрь 08, 2016, 10:24
Вы случаем не пароли / секретные ключи храните? :)

а где же их еще хранить ? )


Название: Re: Обфускация строк бинарника
Отправлено: kambala от Октябрь 08, 2016, 14:08
самое банальное — использовать шифр Цезаря


Название: Re: Обфускация строк бинарника
Отправлено: qate от Октябрь 08, 2016, 18:30
самое банальное — использовать шифр Цезаря

это ответ на вопрос о хранении пароля в бинарнике или обфускации строк ?


Название: Re: Обфускация строк бинарника
Отправлено: kambala от Октябрь 09, 2016, 01:18
обфускация :)


Название: Re: Обфускация строк бинарника
Отправлено: poru от Октябрь 10, 2016, 12:32
А что если самораспаковывающийся архив? Для дурака, с первого взгляда совсем не заметно и не понятно, да и распаковка будет не на диске, а в ОЗУ.


Название: Re: Обфускация строк бинарника
Отправлено: qate от Октябрь 10, 2016, 15:36
А что если самораспаковывающийся архив? Для дурака, с первого взгляда совсем не заметно и не понятно, да и распаковка будет не на диске, а в ОЗУ.

1. сторонний софт не охота тянуть, возиться с его багами
2. можно и командой распаковать, так что защиты никакой нет
3. это ничем не лучше обфускатора "на шаблонах"


Название: Re: Обфускация строк бинарника
Отправлено: Alex Custov от Октябрь 10, 2016, 16:12
Я использовал SimpleCrypt


Название: Re: Обфускация строк бинарника
Отправлено: AlexEx от Октябрь 21, 2016, 11:41
У меня сделано просто (в VS2008, но идея понятна), строковые константы вынесены в файл asm, где видны в читаемом виде:
Код:
.686
.model flat, C

DefXorSym EQU 71h

_STR    MACRO   string, xorSym
        IRPC    _x0,string
        DB    '&_x0' XOR xorSym
        ENDM
        DB    xorSym
        ENDM
 
PUBLIC regKey
PUBLIC regSubKey1
PUBLIC regSubKey2

.stack

.data

regKey LABEL BYTE
  _STR <Software\Microsoft\Windows\CurrentVersion\Policies\System>, DefXorSym
regSubKey1 LABEL BYTE
  _STR <DisableTaskMgr>, DefXorSym
regSubKey2 LABEL BYTE
  _STR <DisableRegistryTools>, DefXorSym

end
В файле cpp объявлено:
Код:
extern "C" char regKey[];
extern "C" char regSubKey1[];
extern "C" char regSubKey2[];
const unsigned long uXor = 0x71;
}
Функция декодирования примитивна: идти по массиву и xor'ить, пока не получим нулевой байт.
Допилить до Qt-овых особенностей уже нетрудно  :).


Название: Re: Обфускация строк бинарника
Отправлено: deMax от Октябрь 21, 2016, 13:49
Вы случаем не пароли / секретные ключи храните? :)
а где же их еще хранить ? )
Ну вообще-то нужно хэши хранить. Ну или хранить зашифрованными, с паролем пользователя... тут все от задачи зависит.


Название: Re: Обфускация строк бинарника
Отправлено: gil9red от Октябрь 21, 2016, 14:05
Вы случаем не пароли / секретные ключи храните? :)
а где же их еще хранить ? )
Ну вообще-то нужно хэши хранить. Ну или хранить зашифрованными, с паролем пользователя... тут все от задачи зависит.

Смотря с чем работаешь :)
Если к какому-то сервису обращаешься, то ему ведь передается пароль, а не хеш от пароля, а тот уже если правильный пароль хеширует и в базе сохраняет, а так отдать хеш пароля, чтобы сервис сделал хеш хеша пароля, чтобы потом ругаться :)


Название: Re: Обфускация строк бинарника
Отправлено: Akon от Октябрь 27, 2016, 11:19
У меня была задача - строка должна оставаться открытой (видимой) в бинарнике, например, это может быть информация об авторских правах, но стойкой к изменению, т.е. любопытный пользователь изменяет строку в HEX-редакторе, а она все равно предстает в программе в неизменном виде.

Для решения использовалось помехоустойчивое кодирование (коды Рида-Соломона). Вкратце, суть: вместо исходной строки
Код:
"хрен изменишь!" 
используется строка вида
Код:
"хрен изменишь!виьдил ывдуцщиму"
с проверочными символами в конце. В случае повреждения (изменения) символы исходной строки восстанавливаются из проверочных в результате декодирования.

Это так-называемая систематическая форма кодирования, в которой исходная информация используется в неизменном виде. Существует и несистематическая форма, в которой исходная информация в неизменном виде не присутствует, что можно использовать для целей сокрытия.

Существует несколько открытых и нет С/С++ либ для решения задач, связанных с помехоустойчивам кодированием.


Название: Re: Обфускация строк бинарника
Отправлено: gil9red от Октябрь 27, 2016, 11:29
У меня была задача - строка должна оставаться открытой (видимой) в бинарнике, например, это может быть информация об авторских правах, но стойкой к изменению, т.е. любопытный пользователь изменяет строку в HEX-редакторе, а она все равно предстает в программе в неизменном виде.

Для решения использовалось помехоустойчивое кодирование (коды Рида-Соломона). Вкратце, суть: вместо исходной строки
Код:
"хрен изменишь!" 
используется строка вида
Код:
"хрен изменишь!виьдил ывдуцщиму"
с проверочными символами в конце. В случае повреждения (изменения) символы исходной строки восстанавливаются из проверочных в результате декодирования.

Это если где-то в строке были изменены некоторые символы, а если заменить полностью строку?


Название: Re: Обфускация строк бинарника
Отправлено: deMax от Ноябрь 01, 2016, 08:33
Это если где-то в строке были изменены некоторые символы, а если заменить полностью строку?
Можно все строки заархивировать, и в случае нарушения crc востанавливать("архив" внутри исполняемого файла). Проще asprotect использовать.


Название: Re: Обфускация строк бинарника
Отправлено: Akon от Ноябрь 01, 2016, 09:56
Цитировать
Это если где-то в строке были изменены некоторые символы, а если заменить полностью строку?
Декодер поймет, что информация не восстановима. Проверочные символы (абракадабра в конце) воспринимаются как какой-то код, и их не патчат, поскольку хз что это такое (по крайней мере на первый взгляд). Более того, их можо разместить в другом месте посреди кода.