PDA

Просмотр полной версии : Простейшие приемы антиотладки...


Jes
11.06.2007, 17:37
все вот спрашивают , а я вот решил самовыразится...
вроде на статью - не тянет , а для топика - в самый раз..
Здесь начинающие програмисты могут черпать для себя идеи и ползеную информацию для защиты своих приложений:
...начнем, пожалуй...

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

Даешь опен соурс!
Если же последняя фраза выхвала у тебя отвращение и твоим рассудком правит алчность ...вобщем читай...
Поскольку Dream CD можно купить повсюду ,программа должна иметь хотя бы элементарные алгоритмы самозащиты....
Здесь я опишу как приемы, так и идеи для реализации...

Простейшие приемы защиты своего приложения от взлома...

Как правило , крякер ставит breakpoint на какую-нибудь API (зависит от интерфейса). Чаще всего это бывает MessageBoxA или GetWindowTextA, GetWindowTextw, GetDlgItemTexta, GetDlgItemTextW. За что они отвечают? MessageBox вылезает, присообщении "Вы ввели неправильный пароль" , а остальные четыре могут вызываться, когда вы читаете содержимое Edit'а или чего-нибудь еще.

Список использованных функций можно посмотреть в дизассемблированном файле; чтобы этого не было видно: можно использовать вызов необъявленных API (темя для отделоной статьи) Теперь посмотрим, как хранить информацию о том, зарегистрирован пользователь или нет. Если сделать в реестре пометку Registered=1, то понятно, к чему это приведет. Наилучший вариант - Писать данные пользователя в отдельный файл или ветку реестра (еще лучше туда и туда) и при каждом запуске проверять эту информацию. Можно также во время загрузки перед считыванием (и после) обращаться к "левым" веткам реестра и файлам. Это затруднит поиск.
Так же (для 'дорогих' приложений) я посоветовал бы шифровать данные пользователя собственным шифром (необращаясь к известным алгоритмам) , это может серьёзно осложнить написания кряка...

Так же следует выводить сообщение "Вы ввели неправильный пароль" или что-либо еще. Обычно на это ориентируется крякер. Гораздо лучше выйти из программы или вообще никак не отреагировать

Очень интересный способ - считывать информацию сразу при их вводе, а затем считывать информацию просто "для отвода глаз"...

Еще вариант:
"Кто сказал, что пользователю нужна моментальная реакция??? Считайте данные и скажите, что пароль проверится через несколько секунд, и пусть весь мир подождет" (цитата , уже не помню откуда , но толк есть) . Тоесть можно пароль считывать и сравнивать посимвольно, опять же через таймер.

Так же кодеры Borland C++ заметно осложнить декомпилятцию своего приложения ,используя набор функций CodeGuard и оптимизации кода,одноименного компилятора...

Так же , дабы защитить свою программу от модифицирования в бинарном редакторе , следует регулярно подщитывать CRC файлов приложения...
При этом многие большие проэкты используют свои собственные алгоритмы определения и проверки CRC...

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

Первым же помошником нам будет API и функция kernel : IsDebuggerPresent
вот пример её использования на дельфях...
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;
if DebuggerPresent then
ShowMessage('Go to Disneyland, cracker...')
else
Showmessage('welcome');

Далее заметим: отладчик , анализируя приложение ,частично выполняет его код...
но в большинстве отладчиков нереализованна обработка множества функций, которые может выполнить прграмма.
Например банальные обработчики ошибок,которые вместо вылета возвращают программе управление. Тоесть достаточно разделить сичтанную информацию на ноль , и дешифровать её где-нибуть в обработчике ошибок.Большенство дебагеров , наткнувшись на такой финт, вылетят или проигнорируют обработчик ошибок...
Так-же полезно считывать информацию по частям,в несколько потоков.Велика вероятность ,что один из потоков останется для отладчика незамеченным...
Еще можно создать второе "мини" приложение , которому передавать часть 'пароля' для обработки...
Это заставит кракера отлаживать каждое приложение отдельно...

Есть еще очень интересный способ тут нам помогут замечательные приемы вирусостроения: запись в чужое адресное пространство и скрытие его процесса.Очень полезный способ против отладки "в реальном времени"
на 98% помогает против таких программ, как АртМани...

И наконец существует множество упаковщиков и готовых компонентов для защиты своего приложения.Но хочу заметить ,что для большинства из них есть свои распаковщики и crack tools.Так же всем известное детище AVP очень часто принимает подобного рода упакованные программы ,как вирусы ,что резко снижает доверие к программе и к её разработчику...

Но >Эпилог< настоящего кракера ничто не остановит.Приктически невозможно написать программы, которая могла бы противостоять опытному взломщику.Описанные мной приёмы позволят лишь затруднить(иногда очень значительно осложнить) его работу...а так же защитить программу от кракеров-"дилетантов". Велика вероятность что у взломщика просто не хватит терпения и он забьёт на взлом вашей софтины...
И вообще , только благодаря нелегкому труду крякеров мы ежедневно насладаемся использованием наших компилятовов , игр , софтом, операционными системыми...честь и хвала им. вперед, парни!Так держать!

dmnt
11.06.2007, 17:53
Так же (для 'дорогих' приложений) я посоветовал бы шифровать данные пользователя собственным шифром (необращаясь к известным алгоритмам) , это может серьёзно осложнить написания кряка...
не советовал бы :) это может серьезно облегчить написание кряка

IsDebuggerPresent - это не серьезно, все равно что спрашивать при старте "вы используете отладчик? да/нет" :)

GoreMaster
11.06.2007, 17:55
IsDebuggerPresent
Это функцию уже все обходят + плагины есть, которые прячут дебаггер.

Но >Эпилог< настоящего кракера ничто не остановит.Приктически невозможно написать программы, которая могла бы противостоять опытному взломщику.
создавай чисто демо версии в котрых все функции обрезаны и их нельзя восстановить...И ни один кракер не будет с ней парится, и все купят твой софт (=

dmnt
сцуко опередил :)

KEZ
11.06.2007, 18:04
> Большенство дебагеров , наткнувшись на такой финт, вылетят или проигнорируют обработчик ошибок...

может быть ты имеешь OllyDBG со снятыми галочками
"Ignore (pass to program) following exceptions"

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

Skype..?

> Так-же полезно считывать информацию по частям,в несколько потоков.Велика вероятность ,что один из потоков останется для отладчика незамеченным...

ээ? какую именно?

> запись в чужое адресное пространство и скрытие его процесса.Очень полезный способ против отладки "в реальном времени"

А я найду WriteProcessMemory ) вообще что-то не совсем ясно о чем тут речь идёт, приходится самому догадываться
Ты не слышал о таком способе - разбить код на части и зашифровать каждый, поставить навесной реал-тайм распаковщик который будет при исключении зашировывать старый и расшифровывать новый (когда старый выполнился) ?

Jes
12.06.2007, 15:16
название топика: "Простейшие приемы"....

Xserg
12.06.2007, 16:31
Вот примерчик простейшей антиотладки

Суть его в том , что запускаются два одинаковых процесса,
и один дебагит другого.
Адреса всех функций и меток в обоих процессах одинаковые,
так что, по исключению прыгаем куда хотим.


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,DEBU G_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,DB G_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.

Hellsp@wn
12.06.2007, 22:59
это не простейшая антиотладка, а элементарная...
и не к чему это вообще)

Xserg
хех арма почти так же делает)) и ничего, всё путём снимается....

_Great_
12.06.2007, 23:23
1) Тема боян
2) переносится в реверсинг