Как защитить ПО от несакционированного копирования?
Существуют.
Но слишком сложны, чтобы это делать просто так.
Если же делать простые способы, то они стольже просто и обходятся.
---
...Я работаю антинаучным аферистом...
Но слишком сложны, чтобы это делать просто так.
Если же делать простые способы, то они стольже просто и обходятся.
---
...Я работаю антинаучным аферистом...
Вопрос в том, как спрятать файлы, а линки к ним скрыть не нарушая возможность запуска ПО через линки (типа ярлыка)
Если у тебя Линукс... то никаких затруднений... там через ТБит или Сбит - точно не помню...
В xp (и в 2к тожеть наверно)...
Если у тебя НТФС, то там есть на подобие, что и в Линухе, вроди...
Сделай ярлык...
Потом Проперти-- адвансед... (точно не помню
)
Но Винду сломают... если захотят
В xp (и в 2к тожеть наверно)...
Если у тебя НТФС, то там есть на подобие, что и в Линухе, вроди...
Сделай ярлык...
Потом Проперти-- адвансед... (точно не помню
)Но Винду сломают... если захотят

ПО под Win 98. Есть какие-либо альтернативные методы? Пусть если даже необходимо написать лополнительную софтину, например, которая будет запускать ПО, но без нее нифига не будет работать ?
такое видел - 100 пудов...
В кафеМаксе... Но там ...
В кафеМаксе... Но там ...
У тебя файловая система не защищенная (ФАТ)...
Я бы сказал - НИКАК...
Я бы сказал - НИКАК...
HASP?
Есть знакомые или люди умеющие делать такие фишки ?Заплачу!
А это что за зверь?
www.hasp.com
Стандартная защита большого процента специального ПО.
Стандартная защита большого процента специального ПО.
Я так и не понял как это устроено, но ...Ему легче НТФС поставить... ИМХО...
Locker для компьютерного клуба можно ещё какой-нибудь поставить.
А если чел возмет и загрузиться с дискеты?
Вообще, человека с желанием взломать программу и соответствующими навыками никто не сможет остановить.
Ну дык, чем сложнее тем менее вероятней взлом
А это совсем просто... даже ниче не надо, кроме дисковода... И то если не будет, можно подцепить
А это совсем просто... даже ниче не надо, кроме дисковода... И то если не будет, можно подцепить

Эта штука работает так:
В программу встраивается некий код и программа будет работать только если присутствует USB-флешка с нужным файлом.
Флешку вскрыть или скопировать нельзя. это "ключ"
Даже если злоумышленник копирует ПО он не сможет его запустить без нужного ключа. А ключ остаётся торчать в исходной машине.
Этот вариант годится только для разработчиков - т.е. если ты имеешь возможность пересобирать защищаемое ПО.
В программу встраивается некий код и программа будет работать только если присутствует USB-флешка с нужным файлом.
Флешку вскрыть или скопировать нельзя. это "ключ"
Даже если злоумышленник копирует ПО он не сможет его запустить без нужного ключа. А ключ остаётся торчать в исходной машине.
Этот вариант годится только для разработчиков - т.е. если ты имеешь возможность пересобирать защищаемое ПО.
Умельцы ломают и их.
Но, пожалуй, это наиболее приемлемое решение.
---
...Я работаю...
Но, пожалуй, это наиболее приемлемое решение.
---
...Я работаю...
Программа _шифруется_ с тем ключом, который предоставляется в наиболее сложном для воспроизведении виде.
Делается привязка ключа к машине.
---
...Я работаю антинаучным аферистом...
Делается привязка ключа к машине.
---
...Я работаю антинаучным аферистом...
А в ключ можно и часы встроить, или ещё что, чтобы он был поуникальней...
Почему это флешку скопировать нельзя? 

как например отучают последние 1с Предприятия от зависимости от HASP-ключа
А к ней доступ хитрый. это не совсем обычная флешка.
AFAIK, это вообще не флешка.
и что за это потом бывает...
но ведь до сих пор отучают
Да имхо все равно пофиг - умельцы эту часть nop'ами забьют...
А код ты чем будешь расшифровывать?
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Вообще, человека с желанием взломать программу и соответствующими навыками никто не сможет остановить.
Вообще этот человек может стоить дороже, чем эта программа!

У меня на работе ключ Guardant воткнут в LPT-порт и на флешку как то мало смахивает
(нахрена она вообще тама то? инфы то хранить совсем мало надо).
(нахрена она вообще тама то? инфы то хранить совсем мало надо).Чем больше --- тем лучше.
Во-первых --- длина ключа, во-вторых --- привязка,
а в третьих --- что-нибудь, чтобы сбить с толку вероятного противника.
---
...Я работаю антинаучным аферистом...
Во-первых --- длина ключа, во-вторых --- привязка,
а в третьих --- что-нибудь, чтобы сбить с толку вероятного противника.
---
...Я работаю антинаучным аферистом...
это с каких пор HASP стал флешкой?
Я не буду, а люди, кажется, всегда дизассемблили... 

дизассемблили...
Чего они дизассемблили если он зашифрован?

Hint: Процессор не может исполнять код в зашифрованном виде.
Как насчёт связки Хафман --- Лемпел---Зив --- Райвест?
Если грамотно увязать, то просто так не продизассемблируешь.
---
...Я работаю антинаучным аферистом...
Если грамотно увязать, то просто так не продизассемблируешь.
---
...Я работаю антинаучным аферистом...
А как насчет связки Программа_1 - Программа_2 - Прогоамма_3 ?
Может хватит уже транскриптить малоизвестный софт?
Может хватит уже транскриптить малоизвестный софт?
Товарищи Хафман, Лемпел, Зив и Райвест настолько хорошо известны,
что не знать их можно только от безграмотности.
---
...Я работаю антинаучным аферистом...
что не знать их можно только от безграмотности.
---
...Я работаю антинаучным аферистом...
Процессор не может исполнять код в зашифрованном виде.
Под отладчиком они что ли по нему ходят? Все равно не очень понятно чего дальше... И уж при чем тут
умельцы эту часть nop'ами забьютваще не ясно... Какую в таком случае часть?
Можно удалить проверку какого-нибудь пароля, а тут?...Huffman, блиа
> А Райвест хрен знает как пишется
Rivest
> А Райвест хрен знает как пишется
Rivest
Ну извините


Под отладчиком далеко ходить не надо, достаточно добраться до интерпретации самого LZH.
До ЛЗХ ещё добраться надо.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
А если взять серийные номера устройств, устрановленных на машине и прописать в проге в зашифрованном виде? 

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

Не "прописать," а зашифровать программу ключом, основанным на них.
Неужели до народа так и не доходит,
что простое хранение --- в любом виде! --- ни от чего не спасает?
---
...Я работаю антинаучным аферистом...
Неужели до народа так и не доходит,
что простое хранение --- в любом виде! --- ни от чего не спасает?
---
...Я работаю антинаучным аферистом...
Я имел в виду, что нужно проверять на серийники устройств, а каким образом - каждый сам решит... 

И как ты предлагаешь скрыть кусок проверки?
Если я бы это знал, то не сидел под Виндой... 

Читай выше, как.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Нединамическая шифрация - откручивается на раз.
Динамическая шифрация требует серьезного изменения кода.
Динамическая шифрация требует серьезного изменения кода.
Верно.
Без проверки целостности защиты нет.
---
...Я работаю антинаучным аферистом...
Без проверки целостности защиты нет.
---
...Я работаю антинаучным аферистом...
Самая серьезная защита - это вынос часть функционала программы в ключ
Да, но всегда есть вопрос о защите ключа.
Тебе придётся выносить в ключ достаточно большой объём данных,
чтобы сложно было их восстановить, но тогда прощай, привязка.
---
...Я работаю антинаучным аферистом...
Тебе придётся выносить в ключ достаточно большой объём данных,
чтобы сложно было их восстановить, но тогда прощай, привязка.
---
...Я работаю антинаучным аферистом...
Ключ или скрипт расшифровки можно хранить в базе данных.
для этих целей они достаточно надежны.
для этих целей они достаточно надежны.
Совершенно ненадёжны --- откручиваются на раз.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Всегда есть такой участок кода, который не зашифрован.
Это код, который занимается расшифровкой, вот его-то и достаточно сломать - вставить "жучок", который будут все расшифрованные процедуры сохранять в надежное место, а потом слинковать эти процедуры...
Это, конечно, уже не так тривиально, но вполне автоматизируемо...
Это код, который занимается расшифровкой, вот его-то и достаточно сломать - вставить "жучок", который будут все расшифрованные процедуры сохранять в надежное место, а потом слинковать эти процедуры...
Это, конечно, уже не так тривиально, но вполне автоматизируемо...

Как насчёт Лампеля с Зивом?
А проверки целостности?
---
...Я работаю антинаучным аферистом...
А проверки целостности?
---
...Я работаю антинаучным аферистом...
> проверки целостности?
Во-первых, целостность чего проверять? целостность exe-шника на диске? целостность функции в памяти?
во-вторых, проверку целостности можно тоже отключить.
Во-первых, целостность чего проверять? целостность exe-шника на диске? целостность функции в памяти?
во-вторых, проверку целостности можно тоже отключить.
NTFS + шифровка, прогу ставишь под админом, юзеру говоришь пароль обычного пользователя, которому файлы проги не доступны, саму прогу запускает служба, работающая под local system... сломать будет непросто. 

В этом случае пройдет атака на WM_TIMER, т.к. у тебя есть GUI запущенный под админскими правами.
что за атака такая?.. зачем мне вообще, WM_TIMER обрабатывать? Да и как устраивать атаку на прогу, если у тебя нет ее бинарника даже?
> зачем мне вообще, WM_TIMER обрабатывать?
это сообщение будешь обрабатывать не ты, а система.
Грузишь в адресное пространство программы свой код, далее через SendMessage посылаешь программе сообщение WM_Timer, где в качестве lParam передается указатель на твой загруженный код.
это сообщение будешь обрабатывать не ты, а система.
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-метровую строку?!
угу, например поток, который только и будет что преобразовывать действия юзера в команды направляемые сервису
с внешним миром твоя программа как-то общается?
Если общается, то, наверняка, есть строки, если есть строки, то значит можно туда забабахать длинную строку.
Если общается, то, наверняка, есть строки, если есть строки, то значит можно туда забабахать длинную строку.
Код в памяти.
Вообще, ерунду мы обсуждаем.
Утверждение: при грамотной защите время, затрачиваемое на слом,
сравнимо или превышает время, затрачиваемое на переписывание.
Вот из этого и надо исходить.
---
...Я работаю антинаучным аферистом...
Вообще, ерунду мы обсуждаем.
Утверждение: при грамотной защите время, затрачиваемое на слом,
сравнимо или превышает время, затрачиваемое на переписывание.
Вот из этого и надо исходить.
---
...Я работаю антинаучным аферистом...
в память моего процесса строка попадет, только если я сам на это соглашусь:
откуда тут в моей памяти возьмется 300 мегов?
char buf[256];
GetWindowText(hWnd, buf, 255);
откуда тут в моей памяти возьмется 300 мегов?
> Утверждение: при грамотной защите время, затрачиваемое на слом,
сравнимо или превышает время, затрачиваемое на переписывание.
Очень сильное утверждение, и имхо, неправильное.
Во-первых: ломать, не строить.
Во-вторых: программа - это белый ящик, а не черный, поэтому априори все действия программы доступны.
По опыту могу сказать, что при набитой руке довольно серьезные защиты снимаются за пару дней.
сравнимо или превышает время, затрачиваемое на переписывание.
Очень сильное утверждение, и имхо, неправильное.
Во-первых: ломать, не строить.
Во-вторых: программа - это белый ящик, а не черный, поэтому априори все действия программы доступны.
По опыту могу сказать, что при набитой руке довольно серьезные защиты снимаются за пару дней.
сегодня на работе классно повеселился: мы до этого NTLM-аутентификацию юзали, начальник решил что это работает слишком медленно и все переделал (в целях оптимизации
). Я сегодня глянул что он там наваял, оказалось что теперь клиентская прога передает имя юзера почти открытым текстом (раньше - токен передавался). Я не долго думая, заменил в коде System.Security.Principal.WindowsIdentity.GetCurrent.Name на строковую константу с его сетевым именем и оно сработало!
Думаю, вот он завтра обрадуется 
). Я сегодня глянул что он там наваял, оказалось что теперь клиентская прога передает имя юзера почти открытым текстом (раньше - токен передавался). Я не долго думая, заменил в коде 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 мегов придут?
Правильнее условие должно бы звучать так:
стоимость разработки защиты не должна быть больше убытка при взломе.
"Серьёзные" --- это в каком смысле?
Помнишь, как ставится задача взлома шифра?
По неизвестному ключу и _известному_ алгоритму.
Целостность проверяется расшифровкой и расжиманием кода с
переписыванием старого.
Неверно сделал --- ошибка.
Не там разместил --- тоже ошибка.
Латать код на лету не настолько просто.
---
...Я работаю антинаучным аферистом...
стоимость разработки защиты не должна быть больше убытка при взломе.
"Серьёзные" --- это в каком смысле?
Помнишь, как ставится задача взлома шифра?
По неизвестному ключу и _известному_ алгоритму.
Целостность проверяется расшифровкой и расжиманием кода с
переписыванием старого.
Неверно сделал --- ошибка.
Не там разместил --- тоже ошибка.
Латать код на лету не настолько просто.
---
...Я работаю антинаучным аферистом...
> и почему ко мне все 300 мегов придут?
в чьей очереди сообщений будут стоять все вышезапостенные сообщения?
и в чьем адресном пространстве располагается эта очередь?
в чьей очереди сообщений будут стоять все вышезапостенные сообщения?
и в чьем адресном пространстве располагается эта очередь?
Еще раз повторю, что проверка на целостность убивается первой.
Ты код не получишь верный, если её убьёшь.
Как прога работать будет?
---
...Я работаю антинаучным аферистом...
Как прога работать будет?
---
...Я работаю антинаучным аферистом...
> "Серьёзные" --- это в каком смысле?
те, которые использовали всякие полиморфные алгоритмы, динамическую шифрацию, проверку целостности, недокументированные команды, вставки убивающие дебагер и т.д.
те, которые использовали всякие полиморфные алгоритмы, динамическую шифрацию, проверку целостности, недокументированные команды, вставки убивающие дебагер и т.д.
Зачем проге для нормальной работы (выполнения полезного функционала) код проверки целостности?
Правильно, совершенно не нужен.
Поэтому его можно безболезненно за-nop-ить, или поставить в начале проверки jmp
Правильно, совершенно не нужен.
Поэтому его можно безболезненно за-nop-ить, или поставить в начале проверки jmp
в чьей очереди сообщений будут стоять все вышезапостенные сообщения?
гуёвого потока.
и в чьем адресном пространстве располагается эта очередь?
моего процесса...
но ты уверен, что у этого процесса есть прямой доступ к очереди сообщений, не через GetMessage/PeekMessage etc?
> у этого процесса
это у какого?
ps
напомню, что обсуждается тот случай, когда именно гуевый процесс запущен под админскими правами.
Если же программа написана, как честный клиент-сервер (сервер, не содержащий gui, запускается под админскими правами, а клиент запускается под правами пользователя то на такой вариант стандартной атаки нет.
это у какого?
ps
напомню, что обсуждается тот случай, когда именно гуевый процесс запущен под админскими правами.
Если же программа написана, как честный клиент-сервер (сервер, не содержащий gui, запускается под админскими правами, а клиент запускается под правами пользователя то на такой вариант стандартной атаки нет.
Например, для построения ключа к внутренней расшифровке.
Для хранения ещё каких-нибудь вспомогательных данных.
---
...Я работаю антинаучным аферистом...
Для хранения ещё каких-нибудь вспомогательных данных.
---
...Я работаю антинаучным аферистом...
дык, один раз посмотрели какой код нужен, и запомнили.
Или отдельно в сторонке храним оригинальную копию кода, которую и подсовываем каждый раз в функцию проверки целостности.
ps
еще раз повторю: программа - это белый ящик, поэтому можно посмотреть, исправить и т.д. все что угодно.
Или отдельно в сторонке храним оригинальную копию кода, которую и подсовываем каждый раз в функцию проверки целостности.
ps
еще раз повторю: программа - это белый ящик, поэтому можно посмотреть, исправить и т.д. все что угодно.
блин... всякие данные системных драйверов тоже находятся в адресном пространстве проги, запущенной простым пользователем VasjaPupkin, но это не означает что пользовательский код имеет к ним прямой доступ. С очередью сообщений, вроде бы, точно так же. Кроме того, в очередь сообщений можно передать только два DWORD'а + HWDN + код сообщения, никакого типа маршалинга PostMessage не делает, так что как ты в очередь положишь 300 мегов мне совершенно не понятно (учитывая, что по умолчанию там места только на 8 сообщений).
> учитывая, что по умолчанию там места только на 8 сообщений
откуда такая информация?
откуда такая информация?
char buf[256];
А что, этого не достаточно? В этих 256 байтах можно скажем передать управление в какой-нибудь dll?..
> учитывая, что по умолчанию там места только на 8 сообщений
вышеуказанная программа дохнет на числе 10000 на WinXp.
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, но это не означает что пользовательский код имеет к ним прямой доступ
А какой смысл тогда их там располагать?> никакого типа маршалинга PostMessage не делает
Да, прокол вышел.
значит берем TextBox в атакуемой программе.
посылаем ему EM_LIMITTEXT 3000000
делаем copy/paste строки в данный текстбокс
строка попала в нужное адресное пространство
Да, прокол вышел.
значит берем TextBox в атакуемой программе.
посылаем ему EM_LIMITTEXT 3000000
делаем copy/paste строки в данный текстбокс
строка попала в нужное адресное пространство
Я вообще плохо въезжаю в ваш разговор, поэтому извините за возможно тупой вопрос. Вот это:
значит берем TextBox в атакуемой программе.означает, что в любой windows GUI программе есть переполнение?
посылаем ему EM_LIMITTEXT 3000000
делаем copy/paste строки в данный текстбокс
строка попала в нужное адресное пространство
> означает, что в любой windows GUI программе есть переполнение?
что ты в данном случае понимаешь под словом "переполнение"?
что ты в данном случае понимаешь под словом "переполнение"?
В переменную записывается больше данных, чем в неё может вместиться. В результате переписываются другие данные и возможно код.
При правильном программирование - нет.
т. к. когда уже непосредственно код получает данную строку, используется функция: WM_GETTEXT (buffer, buffer_len).
т. к. когда уже непосредственно код получает данную строку, используется функция: WM_GETTEXT (buffer, buffer_len).
Насколько я понял пока цель не засрать чужой код, а разместить свой хоть где-нибудь. Утверждается, что потом можно передать на него управление через WM_TIMER... Хотя пока не очень ясно как угадать его виртуальный адрес?..
адрес угадывается банальным перебором, именно для этого большая строка и заталкивается, чтобы можно было быстрее нащупать переданную строку.
Хорошо, а куда эти 300Мб записываются? Под них же не аллоцируется память?
> Под них же не аллоцируется память?
аллоцируется. Команда Paste аллоцирует память
аллоцируется. Команда Paste аллоцирует память
адрес угадывается банальным перебором
Не понял... если не угадать с первого раза, то упадет же?..
Дык, значит придется перезапустить прогу.
Тогда объясни доступно, чего ты добиваешься заливанием 300 Мб строки?
Команда Paste аллоцирует память
вопрос в том, где она аллоцируется
Есть такое подозрение, что в адресное пространство моего процесса оно попадет только после того, как я GetWindowText вызовуну идея тут такая: допустим, мне нужно впихнуть в другой процесс вредоносный код размером 100 байт и передать в него управление. Для этого я повторяю этот код 3 миллиона раз, впихиваю его в память процесса, потом делаю переход по случайному адресу. С большой вероятностью я попаду на мой код, но с каким-то смещением. Вероятность угадать смещение при попадании в блок - 1% (что довольно много). Потом останется добиться полного совпадения.
на 2k - тоже... похоже, у меня устаревшие сведения. 
Кстати, если посылать через SendMessage, то почему-то отваливается на 1400

Кстати, если посылать через SendMessage, то почему-то отваливается на 1400
Понятно, то есть переполнения нет, но как делается переход по случайному адресу?
SendMessage с _очередью_ не работает, а вызывает напрямую соответствующую обработку в оконной процедуре, тут этот пример не катит.
1400 это invalid window handle, значит и оконной процедуры вызвать не смог
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 (левый идентификатор таймера).
http://www.bugtraq.ru/rsn/archive/2002/12/11.html
http://support.microsoft.com/?kbid=328310
Подробностей не знаю, может быть, запретили обработку с "левым" wParam (левый идентификатор таймера).
Оставить комментарий

Dronidze
Есть проблема :Устанавливается специализированное ПО на чистую машину.
Машина отдается в чужие руки.
Существуют ли способы защиты от несанкцианированного копирования ПО на другие информационные носители ?