Сейчас на форуме: tyns777, zds, JustLife (+3 невидимых)

 eXeL@B —› Программирование —› Идентификация "своей" DLL, и загрузка DLL из памяти.
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 20 декабря 2009 23:12
· Личное сообщение · #1

Приветствую!
У меня есть два странных вопроса:
1. Есль некий софт, который использует плагины в DLL. Нужно как-то отличать "свои" плагины от "чужих". Если ли какие-нибудь варианты, но так, чтобы эту проверку нельзя было обойти?
Мне в голову приходит только один: шифровать библиотеку по алгоритму RSA и в проге расшифровывать и загружать из памяти. Тогда никто левый не сможет зашифровать DLL, потому что не будет знать ключ.
В связи с этим второй вопрос:
2. Киньте плиз в меня статьей или тутором как загрузить DLL из образа в памяти.

Пояснение (знаю что тут не любят такие темы:s5:
- Это НЕ троян, и НЕ малварь.
- Это НЕ прот или что-то подобное.
- Прога совершенно бесплатна для конечного пользователя.

Для чего вводится такое ограничение: Прога работает с личными данными пользователей, и мне очень не хочется чтобы пользователь скачал где-то в инете плагин хакера Васи, который уведет у него все пароли. Потому что в этом случае виноват окажется все равно разработчик))



Ранг: 6.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 декабря 2009 23:37
· Личное сообщение · #2

Подпишите "свои" плагины цифровой подписью и проверяйте её на валидность.



Ранг: 61.4 (постоянный), 1thx
Активность: 0.020
Статус: Участник

Создано: 20 декабря 2009 23:58
· Личное сообщение · #3

а сохранить расшифрованную версию в temp нельзя?




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 21 декабря 2009 00:01
· Личное сообщение · #4

не совсем понятно, длл должна быть зашифрована или просто подписана? если достаточно подписи, то шифровать не придется



Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 00:51 · Поправил: Azur1d
· Личное сообщение · #5

Kalmar пишет:
Подпишите "свои" плагины цифровой подписью и проверяйте её на валидность.

[wl] пишет:
просто подписана?

Спасибо, я думал над этим, но в этом случае достоточно будет поправить один джамп в проге и она начнет хавать любые плагины.


[wl] пишет:
длл должна быть зашифрована

Это как вариант, просто мне в голову не пришли другие методы, отвечающие заданным требованиям.

n0name пишет:
а сохранить расшифрованную версию в temp нельзя?

Не вариант, потому что тогда можно будет подсунуть в темп любой плаг.



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 01:02
· Личное сообщение · #6

Azur1d пишет:
Спасибо, я думал над этим, но в этом случае достоточно будет поправить один джамп в проге и она начнет хавать любые плагины.

Если по условиям задачи требуется защита от вредоносного ПО работающего на одном уровне привилегий с тобой, то задача не имеет решения.
Как вам уже сказали, для гарантии аутентичности плугинов их нужно подписывать ЭЦП. А распаковывать перед загрузкой следует туда, куда атакующий не имеет доступа. Если таких мест нет, то увы, ничего нельзя сделать.

Чтобы знать что и как делать, сначала составьте модель угроз. Т.е. опишите формальным языком что и от кого вы хотите защищать, какими возможностями может обладать атакующий, и.т.п. Без этого вам врядли посоветуют что-то дельное.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 01:10 · Поправил: Azur1d
· Личное сообщение · #7

ntldr пишет:
Если по условиям задачи требуется защита от вредоносного ПО работающего на одном уровне привилегий с тобой, то задача не имеет решения.

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

ntldr пишет:
для гарантии аутентичности плугинов их нужно подписывать ЭЦП

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

ntldr пишет:
А распаковывать перед загрузкой следует туда, куда атакующий не имеет доступа. Если таких мест нет, то увы, ничего нельзя сделать.

Лично я в винде таких мест не знаю, а вы?



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 01:17
· Личное сообщение · #8

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

Я считаю что программа должна делать то, что она должна делать. Если она не позиционируется как замена системы безопасности ОС, то гемор поимеете только вы и ваши пользователи. Кому надо - тот всёравно взломает.

Azur1d пишет:
То что я предлагаю, и есть своеобразная подпись, только шифруется не хэш, а весь плаг.

Весь плаг шифруется RSA? В таком случае поздравляю, вы допустили фатальную ошибку в применении этого алгоритма, и ваш секретный ключ легко вычисляется по публичному ключу и шифртексту.
Чтобы писать самому реализацию какой-либо криптографии, особенно асиммитричной, нужно идеально знать её матчасть. Не знаете матчасти - используйте распространенную библиотеку, или на худой конец CryptoAPI.


Azur1d пишет:
Если использовать "классическую" подпись, то где-то в теле программы все равно останется один джамп после проверки подписи, поправив который атакующий получит возмжность загрузить плаг с левой подписью.

Повторяю: если атакующий может модифицировать код вашей программы, то сливай воду и суши вёсла. Он может просто вырезать нахрен всю криптографию и загрузить обычную DLL.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 01:19
· Личное сообщение · #9

Azur1d пишет:
Лично я в винде таких мест не знаю, а вы?

Всё что в пределах %HOMEPATH% доступно только текущему пользователю, и ещё администраторам. Но если ваш враг администратор, то увы, вы заранее проиграли.

К тому-же я не услышал от чего именно вы хотите защититься. Если постановка задачи стоит как "хочу чтобы никто, даже администратор, не мог прицепить к моему процессу свою DLL", то учтите что атакующему достаточно кинуть в папку с вашей программой DLL с именем одной из системных, и система её загрузит до исполнения вашего кода. С этим вы ничего не можете поделать.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 01:23
· Личное сообщение · #10

ntldr, спасибо за советы!

ntldr пишет:
Весь плаг шифруется RSA? В таком случае поздравляю, вы допустили фатальную ошибку в применении этого алгоритма, и ваш секретный ключ легко вычисляется по публичному ключу и шифртексту.

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

ntldr пишет:
Он может просто вырезать нахрен всю криптографию и загрузить обычную DLL.

Может конечно, но тогда перестанут работать нормальные плаги и пользователь это заметит.

ntldr пишет:
если атакующий может модифицировать код вашей программы, то сливай воду и суши вёсла

Я это прекрасно понимаю, поэтому не стоит задача защитить на 100%. Стоит задача макимально усложнить взломщику задачу.



Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 01:25
· Личное сообщение · #11

ntldr, возможно вы меня неправильно поняли - я не пытаюсь доказать крутость этой идеи, я просто высказал то что мне пришло на ум и спросил как можно сделать тоже самое другими средствами.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 21 декабря 2009 01:26 · Поправил: mak
· Личное сообщение · #12

А нельзя проверять просто сигнатуру принадлежности к данной программе , сделать процедуруинициализации плагина с загрузкой конфигурации , сделать Длл Врапер определенных функций , и потом все это дело дружно накрыть вм протекцией как в проге , так и в дллке ?!

Добавлено - а там уже и крипто , но можно не сложное а подобие крипто под вм протекцию ...

ntldr Весьма академичный подход =) по постановке задачи

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 01:30
· Личное сообщение · #13

Azur1d пишет:
Тогда так: плагин не шифруется, прога его загружает, забирает из него некий хедер, расшифровывает его, из него извлекает симметричный ключ и им расшифровывает код.

Прошу вас - не занимайтесь самодеятельностью. Шифровать симмитричный ключ - это правильный подход, но и это не так уж просто сделать правильно. Есть такие вещи как low exponent attack, схемы дополнения симметричного ключа, и прочее, что обязательно надо знать, иначе будет дыра. Используйте библиотеки, там уже всё сделали за вас.

Azur1d пишет:
Может конечно, но тогда перестанут работать нормальные плаги и пользователь это заметит.

Да ладно, что ему мешает пропатчить так, чтобы шифрованные плаги расшифровывались, а не шифрованные нет. Это всего на 5 минут дольше.


Azur1d пишет:
Я это прекрасно понимаю, поэтому не стоит задача защитить на 100%. Стоит задача макимально усложнить взломщику задачу.

Ещё раз повторяю (для танкистов): опишите взломщика и формализуйте задачу. И полностью читайте мой предыдущий пост, т.к. если я угадал с постановкой задачи, то вас сразу ждет жесточайший облом.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 01:35
· Личное сообщение · #14

Дам пример адекватной постановки задачи и её решения:

ТЗ: Гарантировать защиту от случайной установки пользователем неавторизованных плугинов. Гарантировать невозможность модификации программы со стороны других пользователей, за исключением администраторов.
Решение: Использовать ЭЦП на основе Authenticode, либо собственный формат подписи на основе CryptoAPI или OpenSSL. Устанавливаемые плугины и конфиги хранить в %homedir%, запрещать установку программы в общедоступные для записи папки.

Когда дело касается безопасности, то должен иметь место строгий системный подход, а защиты обоснование которых сводится к "авось враг не догадается, а если догадается то забьёт" - свидетельство дилетантизма автора, и доверия к нему и его ПО не добавляют.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 01:41
· Личное сообщение · #15

ntldr пишет:
Используйте библиотеки, там уже всё сделали за вас.

Библиотеки криптоалгоритмов видел. Библиотеки, позволяющие опознать "свой-чужой" плагин не видел. Если ткнете носом, буду очень благодарен.

ntldr пишет:
Ещё раз повторяю (для танкистов): опишите взломщика и формализуйте задачу

Задача: Максимально затруднить взломщику увод паролей из памяти.
Взломщик не ограниченин в средствах реализации, но вычислительные мощности взломщика сильно ограничены (фактически три-четыре мощных компа).
Если не указал еще какие-то данные - скажите какие.



Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 01:45
· Личное сообщение · #16

Azur1d пишет:
Задача: Максимально затруднить взломщику увод паролей из памяти.

Для этого он может просто найти их в памяти и скопировать. Методов защиты от этого я не знаю.
Либо он может загрузить свой плаг, который получит доступ к паролям. От этого я и пытаюсь защититься.



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 01:55
· Личное сообщение · #17

Azur1d пишет:
Библиотеки криптоалгоритмов видел. Библиотеки, позволяющие опознать "свой-чужой" плагин не видел. Если ткнете носом, буду очень благодарен.

В аттаче исходники опознающие оригинальные апдейты MS по Authenticode подписи. Для вашего случая достаточно заменить в них строку "Microsoft Code Signing PCA" на имя своего сертификата.

Azur1d пишет:
Если не указал еще какие-то данные - скажите какие.

Имеет ли злоумышленник возможность запускать на атакуемой системе свои программы с администраторскими привилегиями? Если да, то разработка защиты принесет больше вреда, чем пользы, ибо всеравно не поможет. Если же стоит задача защититься от левых плугинов которые пользователь САМ попытается установить путем копирования DLL в папку с плугинами вашей программы, то это возможно.

44ec_20.12.2009_CRACKLAB.rU.tgz - check.c

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 01:57
· Личное сообщение · #18

ntldr пишет:
В аттаче исходники опознающие оригинальные апдейты MS по Authenticode подписи.

Большое спасибо!

ntldr пишет:
Если же стоит задача защититься от левых плугинов которые пользователь САМ попытается установить путем копирования DLL в папку с плугинами вашей программы, то это возможно.

Да! Да!!! Именно от этого и ТОЛЬКО от этого нужно защищаться. потому что я и сам понимаю, что
ntldr пишет:
Если да, то разработка защиты принесет больше вреда, чем пользы, ибо всеравно не поможет




Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 01:59
· Личное сообщение · #19

ntldr, спасибо огромное, вы открыли мне глаза.
Если других методов нет, то вопрос можно считать решенным, если есть - буду рад выслушать.



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 21 декабря 2009 07:10
· Личное сообщение · #20

Всеми любимый антивирус касперского использует ЭЦП для своих модулей.

-----
Shalom ebanats!




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 09:20
· Личное сообщение · #21

Стоит добавить, что если пользователю ОЧЕНЬ захочется установить себе левый плаг, то технически невозможно это запретить, поскольку тогда наша задача из области криптографии переходит в область DRM (которые, как известно, не могут быть надежны).

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 21 декабря 2009 09:53
· Личное сообщение · #22

Azur1d пишет:
Киньте плиз в меня статьей или тутором как загрузить DLL из образа в памяти


hxxp://www.rsdn.ru/article/baseserv/peloader.xml

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 85.5 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 21 декабря 2009 11:24
· Личное сообщение · #23

ntldr пишет:
Он может просто вырезать нахрен всю криптографию и загрузить обычную DLL.

если приложение локальное, если длл не криптована и если хватит квалификации - да, сможет (ну или кто поможет ), и что это ему даст?
Azur1d как девелопер не будет столь наивным что бы оставить процесс загрузки длл на самотек добавит decrypt любым алго кода любой функции dll и все.



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 11:36
· Личное сообщение · #24

DMD пишет:
и что это ему даст?

Даст возможность установить левый плуг наплевав на запреты автора. Если цель, с которой автор делает эту защиту не совпадает с желаниями пользователей, и программа хоть кому-то нужна, то её быстро взломают.

DMD пишет:
Azur1d как девелопер не будет столь наивным что бы оставить процесс загрузки длл на самотек добавит decrypt любым алго кода любой функции dll и все.

Да ладно тебе. Я думаю тут все прекрасно знают, что ухищрения из серии "безопасность через неизвестность" ещё никому не помогли. Если подобную защиту на сломают, то это значит лишь одно - она никому нафиг не сдалась.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 284.8 (наставник), 6thx
Активность: 0.150
Статус: Участник

Создано: 21 декабря 2009 11:44
· Личное сообщение · #25

Azur1d
возможно стоит завести white list плагинов которые прога будет загружать + проверка ЭЦП. и этого будет достаточно + содержимое списка будет закрипчено и проверка будет происходить не один раз, а в нескольких местах, но тогда еще придется контролировать соответсвие стандартных виндовых библиотек оригинальным.



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 11:56
· Личное сообщение · #26

RSI пишет:
но тогда еще придется контролировать соответсвие стандартных виндовых библиотек оригинальным.

А это лишнее. Повторяю в десятый раз: если злоумышленник может запускать программы с администраторскими привилегиями, модифицировать системные библиотеки или имеет физический доступ к системе на которой исполняется ваша программа, то сливай воду и суши вёсла. Все попытки защититься от такого атакующего идут не в плюс, а в минус к потребительским качествам софта, т.к. ничего кроме проблем не приносят.
Поэтому исходить надо из предположения, что атакующий это НЕ пользователь программы, а какое-то третье лицо, которое может лишь выкладывать левые плуги на левых сайтах или имеет ОГРАНИЧЕННЫЙ доступ к атакуемой системе. В таких рамках задача имеет решение.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 12:02
· Личное сообщение · #27

ntldr пишет:
Стоит добавить, что если пользователю ОЧЕНЬ захочется установить себе левый плаг, то технически невозможно это запретить

Если юзер САМ захочет загрузить левый плуг, то это его личное горе. А если юзер скачает "новый JIMM с золотыми смайликами" который втихушку установит ему этот плаг - вот это уже моя проблема.

ntldr пишет:
Если цель, с которой автор делает эту защиту не совпадает с желаниями пользователей, и программа хоть кому-то нужна, то её быстро взломают

Программа бесплатная, плаги бесплатные - обычному юзеру ломать ничего не нужно.

RSI пишет:
возможно стоит завести white list плагинов

Плаги выходят чаще чем обновляется прога, каждый раз просить пользователя скачать новую версию?



Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 декабря 2009 12:03
· Личное сообщение · #28

ntldr пишет:
Поэтому исходить надо из предположения, что атакующий это НЕ пользователь программы, а какое-то третье лицо, которое может лишь выкладывать левые плуги на левых сайтах или имеет ОГРАНИЧЕННЫЙ доступ к атакуемой системе

Атакующий может либо выложить плуг, либо установить его с помощью трояна.



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 декабря 2009 12:07
· Личное сообщение · #29

Azur1d пишет:
А если юзер скачает "новый JIMM с золотыми смайликами" который втихушку установит ему этот плаг - вот это уже моя проблема.

Есть ли у этой проблемы решение - зависит от того, в каком виде пользователь скачает этот самый "новый JIMM". Если в виде DLL, которую он вручную скопирует в папку с плугами, то вы можете проверить и не загружать эту DLL. Если в виде EXE инсталлятора, то вы бессильны что-либо сделать, т.к. вы не контролируете запуск этого EXE, и он может патчить систему, вашу программу, и.т.д. Такой случай - это проблема пользователей и антивирусных компаний.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 85.5 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 21 декабря 2009 12:26 · Поправил: DMD
· Личное сообщение · #30

ntldr пишет:
Даст возможность установить левый плуг наплевав на запреты автора.

не думаю что все будет так просто, но спорить нет смысла (см ниже)

Azur1d пишет:
Программа бесплатная, плаги бесплатные - обычному юзеру ломать ничего не нужно.

Azur1d пишет:
Плаги выходят чаще чем обновляется прога, каждый раз просить пользователя скачать новую версию?


из всего следует только один вывод: нет ТЗ - нет предмета диспута.
каждый из присутствующих может "в_слепую" предложить по небольшой кучке вариантов ответов на поставленные ТС вопросы. + еще немного в зависимости от доп.условий или уточнений от ТС
пока же в кофейной гуще и то больше информативности

ps
ntldr пишет:
Если в виде DLL, которую он вручную скопирует в папку с плугами, то вы можете проверить и не загружать эту DLL

кажется мне, ТС не контролирует кол-во user'ов и/или права на использование ими длл => проверить это невозможно в принципе
и опять же см. вывод выше


. 1 . 2 . >>
 eXeL@B —› Программирование —› Идентификация "своей" DLL, и загрузка DLL из памяти.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати