| | | | |
Технология шифрования исполняемого кода | Полный текст материала
Цитата или краткий комментарий: «... До сих пор не было приведено "технологичных" решений, позволяющих относительно легко вводить необходимый код в исходные тексты программ и устанавливать защиту на компилированные модули. Оно и понятно: установка защиты -искусство, в общем случае, чем легче ее устанавливать, тем легче она ломается, и зачастую защита программ - ручная работа ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 6 | 100% | | | | Ничего особенно нового и интересного | [2] | 0 | 0% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 6 | | | Все понятно, материал читается легко | [1] | 5 | 100% | | | | Есть неясности в изложении | [2] | 0 | 0% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 5 |
[Шифрование, контрольная сумма, хэш] [Контроль целостности кода]
Отслеживать это обсуждение
Всего сообщений: 728-08-2003 11:29Шифрование программ под NT
Давно не пользовался NT, поэтому и не было возможности проверить работоспособность. Как оказалось, в kernel32.dll от NT нет функций для работы TLHelp32. Поэтому программа-энкодер под NT работать не будет.
Но шифрованную программу можно заставить работать.
Все, что ей надо - это получить значение ModuleSize. Эта функция используется в генерируемых include-файлах для поиска маркера (от начала модуля), и задает максимальное значение сканируемых байт для StrPosLen. Если программа начнет сканировать за пределами модуля, то возможно получение access violation (из-за доступа в нераспределенную память). Поэтому получение ModuleSize - необходимая осторожность.
Но так ли нужна эта предосторожность? Мы ведь наверняка знаем, что маркер в коде присутствует, и его удастся найти (по крайней мере, для
"зарегистрированных" версий программы). Поэтому под NT в качестве ModuleSize можно использовать константу, достаточно большую, чтобы в нее поместился любой модуль программы. Ну, скажем, 4 гб, то есть $FFFFFFFF :).
Изменим функцию ModuleSize, добавив в конце интересный else:
function ModuleSize(hInst:DWORD):DWORD;
var MODULEENTRY32:tMODULEENTRY32;
Snapshot:DWORD;
PID:DWord;
begin
result:=0;
MODULEENTRY32.dwSize:=SizeOf(MODULEENTRY32);
PID:=GetCurrentProcessId;
Snapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);
if Snapshot<>0 then begin
if Module32First(Snapshot,MODULEENTRY32) then
repeat
if MODULEENTRY32.hModule=hInst then begin
result:=MODULEENTRY32.modBaseSize;
Break;
end;
until not Module32Next(Snapshot,MODULEENTRY32);
CloseHandle(Snapshot);
end
else
result:=$FFFFFFFF;
end;
Что получаем в результате? Под Win9x, 2000, XT зашифрованная программа будет вести себя по-прежнему.
Под NT "зарегистрированные" копии программы будут работать нормально, а "незарегистрированные" скорее всего будут выдавать access violation по адресу imagebase+размер модуля. Если хочется более корректной работы, то придется более точно определять константу - размер модуля, или, например, читать ее из ini-файла. |
|
24-06-2003 13:27 Обнаружена небольшая ошибка, приводящая к большим "потерям" системных ресурсов. В модулях для CreateToolhelp32Snapshot нет соответствующего CloseHandle
Исправленный RntUtil.pas отправлен администрации. Там же исправлена одна проблема при работе под win2000. |
|
24-06-2003 13:22>Насколько я понял, от снятия дампа здесь защиты нет
- Все что относится к пятому $INCLUDE и есть защита от снятия дампа (предварительно сохраненный исходный код возвращается на место). Это не абсолютная защита, но, по крайней мере, если в программе будет несколько защищенных участков, то полный расшифрованный дамп придется собирать из кусочков, полученных в разные моменты работы программы.
Кроме того, кое-какие меры можно предпринять и в "третьем" $INCLUDE (внутри защищенного кода) - здесь это не показано, дан только скелет, но реальный генератор может добавить туда контролирующий код, шифрующийся вместе с "полезным" кодом и "невидимый" при дизассемблировании |
|
23-06-2003 17:06Насколько я понял, от снятия дампа здесь защиты нет.
P.S Обнаружена небольшая ошибка, приводящая к большим "потерям" системных ресурсов. В модулях для CreateToolhelp32Snapshot нет соответствующего CloseHandle (заметил после того, как программа на сервере всю ночь работала, причем расшифровка и зашифровка происходили регулярно в Idle режиме) |
|
26-04-2003 19:32Доброго времени суток всем! Как олл смотрит на проблему защиты от срыва дампа памяти после расшифровки кусков кода? Сорри, я не сильно вчитывался в статью, как в off-line выйду - просмотрю более плотно. Указанная технология позволяет защититься от срыва памяти? Afaik самые стойкие защиты копирования "отдавались" именно так. Как это побороть? Динамическое шифрование? Так ИМХО очень сильно скажется на производительности системы, или я не прав? |
|
26-04-2003 16:07Помоему, первая нормальная статья (с практической точки зрения). |
|
08-04-2003 17:52Хорошая статья и пример.
Самое интересно, что когда я занимался проблемой шифрования кода в своей программе и пришел практически к изложеному в данной статье способу. Только для шифрования я использовал алгоритм Blowfish, а ключ для шифровки и дешифровки образовывал из постоянной составляющей и результатом одностороней хеш-функцией по алгоритму MD5 некоторого участка кода моей программы. Например: процедуры проверки ключа на наличие его в блэк-листе :-). |
|
|
|