все вот спрашивают , а я вот решил самовыразится... вроде на статью - не тянет , а для топика - в самый раз.. Здесь начинающие програмисты могут черпать для себя идеи и ползеную информацию для защиты своих приложений: ...начнем, пожалуй... Интернет становится всё более привлекательной средой для заработка. Простейшая програмка, которую можно написать за 20 минут стоит около 20 баксов.При такой мысли так и хочется начать кодить за деньги... Даешь опен соурс! Если же последняя фраза выхвала у тебя отвращение и твоим рассудком правит алчность ...вобщем читай... Поскольку Dream CD можно купить повсюду ,программа должна иметь хотя бы элементарные алгоритмы самозащиты.... Здесь я опишу как приемы, так и идеи для реализации... Простейшие приемы защиты своего приложения от взлома... Как правило , крякер ставит breakpoint на какую-нибудь API (зависит от интерфейса). Чаще всего это бывает MessageBoxA или GetWindowTextA, GetWindowTextw, GetDlgItemTexta, GetDlgItemTextW. За что они отвечают? MessageBox вылезает, присообщении "Вы ввели неправильный пароль" , а остальные четыре могут вызываться, когда вы читаете содержимое Edit'а или чего-нибудь еще. Список использованных функций можно посмотреть в дизассемблированном файле; чтобы этого не было видно: можно использовать вызов необъявленных API (темя для отделоной статьи) Теперь посмотрим, как хранить информацию о том, зарегистрирован пользователь или нет. Если сделать в реестре пометку Registered=1, то понятно, к чему это приведет. Наилучший вариант - Писать данные пользователя в отдельный файл или ветку реестра (еще лучше туда и туда) и при каждом запуске проверять эту информацию. Можно также во время загрузки перед считыванием (и после) обращаться к "левым" веткам реестра и файлам. Это затруднит поиск. Так же (для 'дорогих' приложений) я посоветовал бы шифровать данные пользователя собственным шифром (необращаясь к известным алгоритмам) , это может серьёзно осложнить написания кряка... Так же следует выводить сообщение "Вы ввели неправильный пароль" или что-либо еще. Обычно на это ориентируется крякер. Гораздо лучше выйти из программы или вообще никак не отреагировать Очень интересный способ - считывать информацию сразу при их вводе, а затем считывать информацию просто "для отвода глаз"... Еще вариант: "Кто сказал, что пользователю нужна моментальная реакция??? Считайте данные и скажите, что пароль проверится через несколько секунд, и пусть весь мир подождет" (цитата , уже не помню откуда , но толк есть) . Тоесть можно пароль считывать и сравнивать посимвольно, опять же через таймер. Так же кодеры Borland C++ заметно осложнить декомпилятцию своего приложения ,используя набор функций CodeGuard и оптимизации кода,одноименного компилятора... Так же , дабы защитить свою программу от модифицирования в бинарном редакторе , следует регулярно подщитывать CRC файлов приложения... При этом многие большие проэкты используют свои собственные алгоритмы определения и проверки CRC... Далее предположим , информацию считали , но настоящего крякера ничто не остановит ... Там где не поможет диассемблирование , победным маршем пройдет отладчик. Вооружимся же знаниями: Первым же помошником нам будет API и функция kernel : IsDebuggerPresent вот пример её использования на дельфях... Code: function DebuggerPresent:boolean; type TDebugProc = function:boolean; stdcall; var Kernel32:HMODULE; DebugProc:TDebugProc; begin Result:=false; Kernel32:=GetModuleHandle('kernel32.dll'); if kernel32 <> 0 then begin @DebugProc:=GetProcAddress(kernel32, 'IsDebuggerPresent'); if Assigned(DebugProc) then Result:=DebugProc; end; end; Code: if DebuggerPresent then ShowMessage('Go to Disneyland, cracker...') else Showmessage('welcome'); Далее заметим: отладчик , анализируя приложение ,частично выполняет его код... но в большинстве отладчиков нереализованна обработка множества функций, которые может выполнить прграмма. Например банальные обработчики ошибок,которые вместо вылета возвращают программе управление. Тоесть достаточно разделить сичтанную информацию на ноль , и дешифровать её где-нибуть в обработчике ошибок.Большенство дебагеров , наткнувшись на такой финт, вылетят или проигнорируют обработчик ошибок... Так-же полезно считывать информацию по частям,в несколько потоков.Велика вероятность ,что один из потоков останется для отладчика незамеченным... Еще можно создать второе "мини" приложение , которому передавать часть 'пароля' для обработки... Это заставит кракера отлаживать каждое приложение отдельно... Есть еще очень интересный способ тут нам помогут замечательные приемы вирусостроения: запись в чужое адресное пространство и скрытие его процесса.Очень полезный способ против отладки "в реальном времени" на 98% помогает против таких программ, как АртМани... И наконец существует множество упаковщиков и готовых компонентов для защиты своего приложения.Но хочу заметить ,что для большинства из них есть свои распаковщики и crack tools.Так же всем известное детище AVP очень часто принимает подобного рода упакованные программы ,как вирусы ,что резко снижает доверие к программе и к её разработчику... Но >Эпилог< настоящего кракера ничто не остановит.Приктически невозможно написать программы, которая могла бы противостоять опытному взломщику.Описанные мной приёмы позволят лишь затруднить(иногда очень значительно осложнить) его работу...а так же защитить программу от кракеров-"дилетантов". Велика вероятность что у взломщика просто не хватит терпения и он забьёт на взлом вашей софтины... И вообще , только благодаря нелегкому труду крякеров мы ежедневно насладаемся использованием наших компилятовов , игр , софтом, операционными системыми...честь и хвала им. вперед, парни!Так держать!
не советовал бы это может серьезно облегчить написание кряка IsDebuggerPresent - это не серьезно, все равно что спрашивать при старте "вы используете отладчик? да/нет"
Это функцию уже все обходят + плагины есть, которые прячут дебаггер. создавай чисто демо версии в котрых все функции обрезаны и их нельзя восстановить...И ни один кракер не будет с ней парится, и все купят твой софт (= dmnt сцуко опередил
> Большенство дебагеров , наткнувшись на такой финт, вылетят или проигнорируют обработчик ошибок... может быть ты имеешь OllyDBG со снятыми галочками "Ignore (pass to program) following exceptions" > Приктически невозможно написать программы, которая могла бы противостоять опытному взломщику Skype..? > Так-же полезно считывать информацию по частям,в несколько потоков.Велика вероятность ,что один из потоков останется для отладчика незамеченным... ээ? какую именно? > запись в чужое адресное пространство и скрытие его процесса.Очень полезный способ против отладки "в реальном времени" А я найду WriteProcessMemory ) вообще что-то не совсем ясно о чем тут речь идёт, приходится самому догадываться Ты не слышал о таком способе - разбить код на части и зашифровать каждый, поставить навесной реал-тайм распаковщик который будет при исключении зашировывать старый и расшифровывать новый (когда старый выполнился) ?
Вот примерчик простейшей антиотладки Суть его в том , что запускаются два одинаковых процесса, и один дебагит другого. Адреса всех функций и меток в обоих процессах одинаковые, так что, по исключению прыгаем куда хотим. Code: program debug; uses windows,SysUtils,system; label m1,m2; function IsDebuggerPresent:boolean;external 'Kernel32.dll' name 'IsDebuggerPresent'; var y:Dword; sk:_CONTEXT; st:STARTUPINFO; pi:PROCESS_INFORMATION; de:DEBUG_EVENT; b:byte; begin if IsDebuggerPresent=false then begin // no debug zeromemory(@st,sizeof(st)); st.cb:=sizeof(st); st.wShowWindow:=SW_SHOW ; createprocess(nil,getcommandline,nil,nil,true,DEBUG_ONLY_THIS_PROCESS,nil,nil,st,pi); DebugActiveProcess(pi.dwProcessId); de.dwDebugEventCode:=0; while de.dwDebugEventCode<>EXIT_PROCESS_DEBUG_EVENT do begin ContinueDebugEvent(pi.dwProcessId,pi.dwThreadId,DBG_CONTINUE); de.dwDebugEventCode:=0; WaitForDebugEvent(de,300); if de.dwDebugEventCode=EXCEPTION_DEBUG_EVENT then begin sk.ContextFlags:=CONTEXT_CONTROL; GetThreadContext(pi.hThread,sk); if sk.Eip<getmodulehandle('Kernel32.dll') then begin ReadProcessMemory(pi.hProcess,pointer(sk.Eip-1),@b,1,y); if b=$cc then begin asm mov sk.Eip,offset m2 end;end; sk.ContextFlags:=CONTEXT_CONTROL; SetThreadContext(pi.hThread,sk); end; end; end; Exitprocess(0); end // no debug else begin asm m1: db $cc end; Exitprocess(0); asm m2: end; messageboxA(0,'?','!',0); end; end.
это не простейшая антиотладка, а элементарная... и не к чему это вообще) Xserg хех арма почти так же делает)) и ничего, всё путём снимается....