Как защитить ПО от несакционированного копирования?
Но слишком сложны, чтобы это делать просто так.
Если же делать простые способы, то они стольже просто и обходятся.
---
...Я работаю антинаучным аферистом...
Вопрос в том, как спрятать файлы, а линки к ним скрыть не нарушая возможность запуска ПО через линки (типа ярлыка)
В xp (и в 2к тожеть наверно)...
Если у тебя НТФС, то там есть на подобие, что и в Линухе, вроди...
Сделай ярлык...
Потом Проперти-- адвансед... (точно не помню )
Но Винду сломают... если захотят
ПО под Win 98. Есть какие-либо альтернативные методы? Пусть если даже необходимо написать лополнительную софтину, например, которая будет запускать ПО, но без нее нифига не будет работать ?
В кафеМаксе... Но там ...
Я бы сказал - НИКАК...
HASP?
Есть знакомые или люди умеющие делать такие фишки ?Заплачу!
А это что за зверь?
www.hasp.com
Стандартная защита большого процента специального ПО.
Стандартная защита большого процента специального ПО.
Я так и не понял как это устроено, но ...Ему легче НТФС поставить... ИМХО...
Locker для компьютерного клуба можно ещё какой-нибудь поставить.
А если чел возмет и загрузиться с дискеты?
Вообще, человека с желанием взломать программу и соответствующими навыками никто не сможет остановить.
А это совсем просто... даже ниче не надо, кроме дисковода... И то если не будет, можно подцепить
В программу встраивается некий код и программа будет работать только если присутствует USB-флешка с нужным файлом.
Флешку вскрыть или скопировать нельзя. это "ключ"
Даже если злоумышленник копирует ПО он не сможет его запустить без нужного ключа. А ключ остаётся торчать в исходной машине.
Этот вариант годится только для разработчиков - т.е. если ты имеешь возможность пересобирать защищаемое ПО.
Но, пожалуй, это наиболее приемлемое решение.
---
...Я работаю...
Делается привязка ключа к машине.
---
...Я работаю антинаучным аферистом...
А в ключ можно и часы встроить, или ещё что, чтобы он был поуникальней...
Почему это флешку скопировать нельзя?
как например отучают последние 1с Предприятия от зависимости от HASP-ключа
А к ней доступ хитрый. это не совсем обычная флешка.
AFAIK, это вообще не флешка.
и что за это потом бывает...
но ведь до сих пор отучают
Да имхо все равно пофиг - умельцы эту часть nop'ами забьют...
---
...Я работаю антинаучным аферистом...
Вообще, человека с желанием взломать программу и соответствующими навыками никто не сможет остановить.
Вообще этот человек может стоить дороже, чем эта программа!
У меня на работе ключ Guardant воткнут в LPT-порт и на флешку как то мало смахивает (нахрена она вообще тама то? инфы то хранить совсем мало надо).
Во-первых --- длина ключа, во-вторых --- привязка,
а в третьих --- что-нибудь, чтобы сбить с толку вероятного противника.
---
...Я работаю антинаучным аферистом...
это с каких пор HASP стал флешкой?
Я не буду, а люди, кажется, всегда дизассемблили...
дизассемблили...
Чего они дизассемблили если он зашифрован?
Hint: Процессор не может исполнять код в зашифрованном виде.
Если грамотно увязать, то просто так не продизассемблируешь.
---
...Я работаю антинаучным аферистом...
Может хватит уже транскриптить малоизвестный софт?
что не знать их можно только от безграмотности.
---
...Я работаю антинаучным аферистом...
Процессор не может исполнять код в зашифрованном виде.
Под отладчиком они что ли по нему ходят? Все равно не очень понятно чего дальше... И уж при чем тут
умельцы эту часть nop'ами забьютваще не ясно... Какую в таком случае часть? Можно удалить проверку какого-нибудь пароля, а тут?...
> А Райвест хрен знает как пишется
Rivest
Ну извините
Под отладчиком далеко ходить не надо, достаточно добраться до интерпретации самого LZH.
---
...Я работаю антинаучным аферистом...
А если взять серийные номера устройств, устрановленных на машине и прописать в проге в зашифрованном виде?
Хоть в открытом виде серийники пиши...
Чем отличается наличие некого ключа на каком-нибудь устройстве? Только тем, что понадобится либо эмуляция, либо подобное устройство...
Неужели до народа так и не доходит,
что простое хранение --- в любом виде! --- ни от чего не спасает?
---
...Я работаю антинаучным аферистом...
Я имел в виду, что нужно проверять на серийники устройств, а каким образом - каждый сам решит...
И как ты предлагаешь скрыть кусок проверки?
Если я бы это знал, то не сидел под Виндой...
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Динамическая шифрация требует серьезного изменения кода.
Без проверки целостности защиты нет.
---
...Я работаю антинаучным аферистом...
Самая серьезная защита - это вынос часть функционала программы в ключ
Тебе придётся выносить в ключ достаточно большой объём данных,
чтобы сложно было их восстановить, но тогда прощай, привязка.
---
...Я работаю антинаучным аферистом...
для этих целей они достаточно надежны.
---
...Я работаю антинаучным аферистом...
Это код, который занимается расшифровкой, вот его-то и достаточно сломать - вставить "жучок", который будут все расшифрованные процедуры сохранять в надежное место, а потом слинковать эти процедуры...
Это, конечно, уже не так тривиально, но вполне автоматизируемо...
А проверки целостности?
---
...Я работаю антинаучным аферистом...
Во-первых, целостность чего проверять? целостность exe-шника на диске? целостность функции в памяти?
во-вторых, проверку целостности можно тоже отключить.
NTFS + шифровка, прогу ставишь под админом, юзеру говоришь пароль обычного пользователя, которому файлы проги не доступны, саму прогу запускает служба, работающая под local system... сломать будет непросто.
В этом случае пройдет атака на WM_TIMER, т.к. у тебя есть GUI запущенный под админскими правами.
что за атака такая?.. зачем мне вообще, WM_TIMER обрабатывать? Да и как устраивать атаку на прогу, если у тебя нет ее бинарника даже?
это сообщение будешь обрабатывать не ты, а система.
WM_TIMERОбрати внимание на параметр lParam.
WPARAM wParam
LPARAM lParam;
Parameters
wParam
[in] Specifies the timer identifier.
lParam
[in] Pointer to an application-defined callback function that was passed to the SetTimer function when the timer was installed.
Грузишь в адресное пространство программы свой код, далее через SendMessage посылаешь программе сообщение WM_Timer, где в качестве lParam передается указатель на твой загруженный код.
Грузишь в адресное пространство программы свой код, далее через SendMessage посылаешь программе сообщение WM_Timer, где в качестве lParam передается указатель на твой загруженный код.
Гм... ну и как ты в мой процесс свой код загрузишь?.. Предположим, у юзера нет прав на запись в реестр и хук он поставить не сможет.
Наконец, никто мне не мешает запустить гуёвый поток под пониженными привилегиями
Вводишь, например, специально подготовленную 300-метровую строку, далее быстренько ее локализуешь в памяти
Скорее процесс, а не поток.
Да, это уже более надежное решение.
ха! как ты в мою прогу введешь 300-метровую строку?!
угу, например поток, который только и будет что преобразовывать действия юзера в команды направляемые сервису
Если общается, то, наверняка, есть строки, если есть строки, то значит можно туда забабахать длинную строку.
Вообще, ерунду мы обсуждаем.
Утверждение: при грамотной защите время, затрачиваемое на слом,
сравнимо или превышает время, затрачиваемое на переписывание.
Вот из этого и надо исходить.
---
...Я работаю антинаучным аферистом...
char buf[256];
GetWindowText(hWnd, buf, 255);
откуда тут в моей памяти возьмется 300 мегов?
сравнимо или превышает время, затрачиваемое на переписывание.
Очень сильное утверждение, и имхо, неправильное.
Во-первых: ломать, не строить.
Во-вторых: программа - это белый ящик, а не черный, поэтому априори все действия программы доступны.
По опыту могу сказать, что при набитой руке довольно серьезные защиты снимаются за пару дней.
сегодня на работе классно повеселился: мы до этого NTLM-аутентификацию юзали, начальник решил что это работает слишком медленно и все переделал (в целях оптимизации ). Я сегодня глянул что он там наваял, оказалось что теперь клиентская прога передает имя юзера почти открытым текстом (раньше - токен передавался). Я не долго думая, заменил в коде System.Security.Principal.WindowsIdentity.GetCurrent.Name на строковую константу с его сетевым именем и оно сработало! Думаю, вот он завтра обрадуется
for (i = 0; i < MAX_FLOOD; ++i)
PostMessage(WM_FLOOD, ...);
PostMessage(WM_TIMER, ...);
PostMessage(WM_SETTEXT, big_string);
ну и?.. на каком месте я тут GetWindowText вызываю? и почему ко мне все 300 мегов придут?
стоимость разработки защиты не должна быть больше убытка при взломе.
"Серьёзные" --- это в каком смысле?
Помнишь, как ставится задача взлома шифра?
По неизвестному ключу и _известному_ алгоритму.
Целостность проверяется расшифровкой и расжиманием кода с
переписыванием старого.
Неверно сделал --- ошибка.
Не там разместил --- тоже ошибка.
Латать код на лету не настолько просто.
---
...Я работаю антинаучным аферистом...
в чьей очереди сообщений будут стоять все вышезапостенные сообщения?
и в чьем адресном пространстве располагается эта очередь?
Еще раз повторю, что проверка на целостность убивается первой.
Как прога работать будет?
---
...Я работаю антинаучным аферистом...
те, которые использовали всякие полиморфные алгоритмы, динамическую шифрацию, проверку целостности, недокументированные команды, вставки убивающие дебагер и т.д.
Правильно, совершенно не нужен.
Поэтому его можно безболезненно за-nop-ить, или поставить в начале проверки jmp
в чьей очереди сообщений будут стоять все вышезапостенные сообщения?
гуёвого потока.
и в чьем адресном пространстве располагается эта очередь?
моего процесса...
но ты уверен, что у этого процесса есть прямой доступ к очереди сообщений, не через GetMessage/PeekMessage etc?
это у какого?
ps
напомню, что обсуждается тот случай, когда именно гуевый процесс запущен под админскими правами.
Если же программа написана, как честный клиент-сервер (сервер, не содержащий gui, запускается под админскими правами, а клиент запускается под правами пользователя то на такой вариант стандартной атаки нет.
Для хранения ещё каких-нибудь вспомогательных данных.
---
...Я работаю антинаучным аферистом...
Или отдельно в сторонке храним оригинальную копию кода, которую и подсовываем каждый раз в функцию проверки целостности.
ps
еще раз повторю: программа - это белый ящик, поэтому можно посмотреть, исправить и т.д. все что угодно.
блин... всякие данные системных драйверов тоже находятся в адресном пространстве проги, запущенной простым пользователем VasjaPupkin, но это не означает что пользовательский код имеет к ним прямой доступ. С очередью сообщений, вроде бы, точно так же. Кроме того, в очередь сообщений можно передать только два DWORD'а + HWDN + код сообщения, никакого типа маршалинга PostMessage не делает, так что как ты в очередь положишь 300 мегов мне совершенно не понятно (учитывая, что по умолчанию там места только на 8 сообщений).
откуда такая информация?
char buf[256];
А что, этого не достаточно? В этих 256 байтах можно скажем передать управление в какой-нибудь dll?..
int _tmain
{
MSG msg;
PeekMessage(&msg, 0, 0, 0, 0);
for (int i = 0;;i++)
{
bool res = 0 != PostMessage(0, WM_UNDO, 0, 0);
if (!res)
{
Console::WriteLine("error: {0}", __box(GetLastError;
Console::WriteLine(__box(i;
break;
}
}
return 0;
}
вышеуказанная программа дохнет на числе 10000 на WinXp.
всякие данные системных драйверов тоже находятся в адресном пространстве проги, запущенной простым пользователем VasjaPupkin, но это не означает что пользовательский код имеет к ним прямой доступ
А какой смысл тогда их там располагать?
Да, прокол вышел.
значит берем TextBox в атакуемой программе.
посылаем ему EM_LIMITTEXT 3000000
делаем copy/paste строки в данный текстбокс
строка попала в нужное адресное пространство
значит берем TextBox в атакуемой программе.означает, что в любой windows GUI программе есть переполнение?
посылаем ему EM_LIMITTEXT 3000000
делаем copy/paste строки в данный текстбокс
строка попала в нужное адресное пространство
что ты в данном случае понимаешь под словом "переполнение"?
В переменную записывается больше данных, чем в неё может вместиться. В результате переписываются другие данные и возможно код.
т. к. когда уже непосредственно код получает данную строку, используется функция: WM_GETTEXT (buffer, buffer_len).
Насколько я понял пока цель не засрать чужой код, а разместить свой хоть где-нибудь. Утверждается, что потом можно передать на него управление через WM_TIMER... Хотя пока не очень ясно как угадать его виртуальный адрес?..
адрес угадывается банальным перебором, именно для этого большая строка и заталкивается, чтобы можно было быстрее нащупать переданную строку.
Хорошо, а куда эти 300Мб записываются? Под них же не аллоцируется память?
аллоцируется. Команда Paste аллоцирует память
адрес угадывается банальным перебором
Не понял... если не угадать с первого раза, то упадет же?..
Дык, значит придется перезапустить прогу.
Тогда объясни доступно, чего ты добиваешься заливанием 300 Мб строки?
Команда Paste аллоцирует память
вопрос в том, где она аллоцируется Есть такое подозрение, что в адресное пространство моего процесса оно попадет только после того, как я GetWindowText вызову
ну идея тут такая: допустим, мне нужно впихнуть в другой процесс вредоносный код размером 100 байт и передать в него управление. Для этого я повторяю этот код 3 миллиона раз, впихиваю его в память процесса, потом делаю переход по случайному адресу. С большой вероятностью я попаду на мой код, но с каким-то смещением. Вероятность угадать смещение при попадании в блок - 1% (что довольно много). Потом останется добиться полного совпадения.
Кстати, если посылать через SendMessage, то почему-то отваливается на 1400
Понятно, то есть переполнения нет, но как делается переход по случайному адресу?
1400 это invalid window handle, значит и оконной процедуры вызвать не смог
переход по случайному адресу?
Если надыбать где-то hwnd и вызвать PostMessage(hwnd, WM_TIMER, wparam, lparam) и если в окне будет дефолтная обработка этого сообщения, то управление уйдет на lparam.
PS Кстати, это не очень устаревшие сведения? Может залепили давно, а мы тут изучаем?
http://www.bugtraq.ru/rsn/archive/2002/12/11.html
http://support.microsoft.com/?kbid=328310
Подробностей не знаю, может быть, запретили обработку с "левым" wParam (левый идентификатор таймера).
Оставить комментарий
Dronidze
Есть проблема :Устанавливается специализированное ПО на чистую машину.
Машина отдается в чужие руки.
Существуют ли способы защиты от несанкцианированного копирования ПО на другие информационные носители ?