Проблемы с шифрованием кода dll в win32
От: Barm  
Дата: 09.07.16 10:56
Оценка:
Задача: сделать защиту программы (dll) путем шифрования участков кода. Экспериментируем в visual studio 2008.
Метод решения:
1. После компиляции участки кода из исполняемого файла (шифруемых процедур, которые прописаны как static) копируются в отдельные файлики, а их место затирается дребеденью.
2. После поставки программы заказчику ему пересылаются ключи (зашифрованные файлики), которые при исполнении программа берет с диска, расшифровывает, добавляет сама в себя и исполняется дальше.

Проблема. Все описанное прекрасно работает на x64, но при попытке переноса методы в x32 возникает проблема с тем, что содержимое static процедур в памяти при загрузке dll отличается от того, как они выглядят в самом файле dll на диске. Причем при каждой новой загрузке содержимое в памяти отличается от содержимого на диске в некоторых байтах .
Байты одни и те же. Т.е. содержимое основной массы байтов сохраняется, а небольшой массы байтов при загрузке меняется.

Варианты решения проблемы:
1. Для каждой шифруемой процедуры делать маску с байтами, содержимое которых при шифровке-расшифровке менять не нужно. — Это основной рабочий вариант, который я сейчас пытаюсь реализовать.
2. Может быть в настройках visual studio есть какие-то параметры, которые делают код процедур dll-ки неизменяющимся при загрузке в память?
шифрование кода защита программы
Re: Проблемы с шифрованием кода dll в win32
От: aloch Россия  
Дата: 10.07.16 08:17
Оценка: +5
Здравствуйте, Barm, Вы писал

Какой же гиммор вы создаете заказчикам и себе


Re: Проблемы с шифрованием кода dll в win32
От: ononim  
Дата: 10.07.16 10:21
Оценка: +1
B>Задача: сделать защиту программы (dll) путем шифрования участков кода. Экспериментируем в visual studio 2008.
B>Метод решения:
B>1. После компиляции участки кода из исполняемого файла (шифруемых процедур, которые прописаны как static) копируются в отдельные файлики, а их место затирается дребеденью.
B>2. После поставки программы заказчику ему пересылаются ключи (зашифрованные файлики), которые при исполнении программа берет с диска, расшифровывает, добавляет сама в себя и исполняется дальше.
B>Проблема. Все описанное прекрасно работает на x64, но при попытке переноса методы в x32 возникает проблема с тем, что содержимое static процедур в памяти при загрузке dll отличается от того, как они выглядят в самом файле dll на диске. Причем при каждой новой загрузке содержимое в памяти отличается от содержимого на диске в некоторых байтах .
B>Байты одни и те же. Т.е. содержимое основной массы байтов сохраняется, а небольшой массы байтов при загрузке меняется.
Дык это наверное указатели на функции в других длл и/или rebase фиксапы, которые лоадером резолвятся. Это просто можно и нужно учесть при шифровании — вся инфа про эту "небольшую массу байтов" имеется в PE заголовках.
Как много веселых ребят, и все делают велосипед...
Re: Проблемы с шифрованием кода dll в win32
От: bnk СССР http://unmanagedvisio.com/
Дата: 10.07.16 12:42
Оценка: +2
Здравствуйте, Barm, Вы писали:

B>2. Может быть в настройках visual studio есть какие-то параметры, которые делают код процедур dll-ки неизменяющимся при загрузке в память?


Попробуй выключить ASLR в настройках проекта.

Но вообще, в тращициях данного форума, попинаю
IMHO, ерундой занимаетесь, если уж так нужно, просто возьмите готовй протектор.
Re[2]: Проблемы с шифрованием кода dll в win32
От: Barm  
Дата: 11.07.16 12:56
Оценка:
Здравствуйте, ononim, Вы писали:

B>>Задача: сделать защиту программы (dll) путем шифрования участков кода. Экспериментируем в visual studio 2008.

B>>Метод решения:
B>>1. После компиляции участки кода из исполняемого файла (шифруемых процедур, которые прописаны как static) копируются в отдельные файлики, а их место затирается дребеденью.
B>>2. После поставки программы заказчику ему пересылаются ключи (зашифрованные файлики), которые при исполнении программа берет с диска, расшифровывает, добавляет сама в себя и исполняется дальше.
B>>Проблема. Все описанное прекрасно работает на x64, но при попытке переноса методы в x32 возникает проблема с тем, что содержимое static процедур в памяти при загрузке dll отличается от того, как они выглядят в самом файле dll на диске. Причем при каждой новой загрузке содержимое в памяти отличается от содержимого на диске в некоторых байтах .
B>>Байты одни и те же. Т.е. содержимое основной массы байтов сохраняется, а небольшой массы байтов при загрузке меняется.
O>Дык это наверное указатели на функции в других длл и/или rebase фиксапы, которые лоадером резолвятся. Это просто можно и нужно учесть при шифровании — вся инфа про эту "небольшую массу байтов" имеется в PE заголовках.

Интересно, что при компиляции под winx64 код процедуры в dll файле полностью соответствует тому, что в памяти (изменяемых байтов нет).
Причину наличия изменяемых байтов в win32 и неналичия оных в win64 искать не хочется. Пытаюсь тупо учесть их наличие и критические участки кода не трогать. Неделя мучений уже прошла. Если получиться — отпишусь.
Re[3]: Проблемы с шифрованием кода dll в win32
От: ononim  
Дата: 11.07.16 13:03
Оценка: +3
B>Интересно, что при компиляции под winx64 код процедуры в dll файле полностью соответствует тому, что в памяти (изменяемых байтов нет).
Потому что в win64 нету инструкции call ptr_64, а есть только call [rip + delta_32], так что в x64 компилятор вынужден ложить указатели на external функции куданить в данные. А 32хбитный компилятор может и так и прямым адресом из инструкции.

B>Причину наличия изменяемых байтов в win32 и неналичия оных в win64 искать не хочется. Пытаюсь тупо учесть их наличие и критические участки кода не трогать. Неделя мучений уже прошла. Если получиться — отпишусь.

Советую как следует изучить матчасть прежде чем делать такие проекты. Там еще много подводных граблей.
Как много веселых ребят, и все делают велосипед...
Re[2]: Проблемы с шифрованием кода dll в win32
От: Barm  
Дата: 11.07.16 13:04
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, Barm, Вы писали:


B>>2. Может быть в настройках visual studio есть какие-то параметры, которые делают код процедур dll-ки неизменяющимся при загрузке в память?


bnk>Попробуй выключить ASLR в настройках проекта.

Уже пробовал. Не помогает.

bnk>Но вообще, в тращициях данного форума, попинаю

bnk>IMHO, ерундой занимаетесь, если уж так нужно, просто возьмите готовый протектор.

Угу. Готовые протекторы имеют готовые методики взлома.
Мне нужен протектор:
1. Закачивающий ключи на клиента при оплате.
2. Привязка ключей к железу клиента.
3. Возможность простой перепривязки программы с одного рабочего места на другое (включая win64 и win32).

Программа планируется дешевой, трата ручного времени на привязку каждого клиента исключена.
Максимум, что делается вручную — забивается e-mail клиента в базу данных "оплачено".

Денег априори на службу поддержки-установки нет. .
Re[4]: Проблемы с шифрованием кода dll в win32
От: Barm  
Дата: 11.07.16 13:18
Оценка:
Здравствуйте, ononim, Вы писали:

B>>Интересно, что при компиляции под winx64 код процедуры в dll файле полностью соответствует тому, что в памяти (изменяемых байтов нет).

O>Потому что в win64 нету инструкции call ptr_64, а есть только call [rip + delta_32], так что в x64 компилятор вынужден ложить указатели на external функции куданить в данные. А 32хбитный компилятор может и так и прямым адресом из инструкции.

B>>Причину наличия изменяемых байтов в win32 и неналичия оных в win64 искать не хочется. Пытаюсь тупо учесть их наличие и критические участки кода не трогать. Неделя мучений уже прошла. Если получиться — отпишусь.

O>Советую как следует изучить матчасть прежде чем делать такие проекты. Там еще много подводных граблей.

Писал прогу около полутора лет. Писал сразу под win64. Рабочий экземпляр уже есть для x64. Граблей уже было море.

Осталось перенести на win32. И тут произошел этот затык. Можно делать защиту, шифруя при исполнении данные, но:
1. Мне опять все переделывать.
2. Шифровка данных приводит к торможению проги. Код один раз расшифровал и он быстры данные перелопачивает.

Хотя можно бонусом небольшую шифровку данных делать (шифруя ключом от сервера (имея данные по клиенту), а расшифровываешь ключом с данными об оборудовании, собранном на клиенте).
Re[3]: Проблемы с шифрованием кода dll в win32
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 11.07.16 13:28
Оценка:
Здравствуйте, Barm, Вы писали:

bnk>>Но вообще, в тращициях данного форума, попинаю

bnk>>IMHO, ерундой занимаетесь, если уж так нужно, просто возьмите готовый протектор.

B>Угу. Готовые протекторы имеют готовые методики взлома.


Ты сможешь лучше, чем сделано в VmProtect?


B>Мне нужен протектор:

B>1. Закачивающий ключи на клиента при оплате.

VmProtect (+vmpKit )

B>2. Привязка ключей к железу клиента.


VmProtect

B>3. Возможность простой перепривязки программы с одного рабочего места на другое (включая win64 и win32).


VmProtect

B>Программа планируется дешевой, трата ручного времени на привязку каждого клиента исключена.

B>Максимум, что делается вручную — забивается e-mail клиента в базу данных "оплачено".

VmProtect

B>Денег априори на службу поддержки-установки нет. .


VmProtect
Маньяк Робокряк колесит по городу
Re[4]: Проблемы с шифрованием кода dll в win32
От: b0r3d0m  
Дата: 11.07.16 13:54
Оценка: +1
M>VmProtect
Или Themida WinLicense. Рекомендую рассмотреть как альтернативу.
Re[5]: Проблемы с шифрованием кода dll в win32
От: wl. Россия  
Дата: 11.07.16 14:40
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

M>>VmProtect

B>Или Themida WinLicense. Рекомендую рассмотреть как альтернативу.

почему не Denuvo? Очень хорошая защита
Re[6]: Проблемы с шифрованием кода dll в win32
От: b0r3d0m  
Дата: 11.07.16 15:02
Оценка:
wl.>почему не Denuvo? Очень хорошая защита
Да просто лично использовал WinLicense, вот и посоветовал.
Re: Проблемы с шифрованием кода dll в win32
От: flаt  
Дата: 12.07.16 04:56
Оценка:
Здравствуйте, Barm, Вы писали:


B>Задача: сделать защиту программы (dll) путем шифрования участков кода.

Ух. Это привет из… 1999 года?

B>Метод решения:

B>1. После компиляции участки кода из исполняемого файла (шифруемых процедур, которые прописаны как static) копируются в отдельные файлики, а их место затирается дребеденью.
Почему не просто зашифровать на месте, зачем файлы? Или зашифровать dll, если уж хочется совсем не давать код для demo?

B>Байты одни и те же. Т.е. содержимое основной массы байтов сохраняется, а небольшой массы байтов при загрузке меняется.

За полтора года "проекта" про релоки не слышали?


B>2. Может быть в настройках visual studio есть какие-то параметры, которые делают код процедур dll-ки неизменяющимся при загрузке в память?

В gcc есть -fPIC.
Re[6]: Проблемы с шифрованием кода dll в win32
От: pva  
Дата: 12.07.16 16:17
Оценка:
Здравствуйте, wl., Вы писали:

wl.>почему не Denuvo? Очень хорошая защита

Это в виде шутки? Ее ж заломали недавно. Да и ценник у нее кусючий.
newbie
Re[7]: Проблемы с шифрованием кода dll в win32
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.07.16 19:24
Оценка:
Здравствуйте, pva, Вы писали:

pva>Это в виде шутки? Ее ж заломали недавно. Да и ценник у нее кусючий.

а vmprotect взломали, случаем не в курсе?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[8]: Проблемы с шифрованием кода dll в win32
От: b0r3d0m  
Дата: 12.07.16 19:32
Оценка:
X>а vmprotect взломали, случаем не в курсе?
Всех ломают.
Re[9]: Проблемы с шифрованием кода dll в win32
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.07.16 19:51
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>Всех ломают.

да, отднажды, лет через 200 — возможно. но меня интересует сейчас.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[10]: Проблемы с шифрованием кода dll в win32
От: b0r3d0m  
Дата: 12.07.16 21:23
Оценка:
X>да, отднажды, лет через 200 — возможно. но меня интересует сейчас.
На unpack.cn и прочих подобных ресурсах постоянно выкладывают анпакеры для всех популярных протекторов, включая VMProtect и WinLicense. В паблик, разумеется, обычно попадают анпакеры для предпоследних версий данных протекторов.
Re[11]: Проблемы с шифрованием кода dll в win32
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.07.16 22:12
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>На unpack.cn

похоже мертв.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[12]: Проблемы с шифрованием кода dll в win32
От: b0r3d0m  
Дата: 13.07.16 05:24
Оценка:
X>похоже мертв.
https://tuts4you.com/ тогда глянь.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.