ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > Реверсинг
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Простейшие приемы антиотладки...
  #1  
Старый 11.06.2007, 17:37
Jes
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме:
3371897

Репутация: 1462
Lightbulb Простейшие приемы антиотладки...

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

Интернет становится всё более привлекательной средой для заработка. Простейшая програмка, которую можно написать за 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 очень часто принимает подобного рода упакованные программы ,как вирусы ,что резко снижает доверие к программе и к её разработчику...

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

Последний раз редактировалось Jes; 12.06.2007 в 15:17..
 
Ответить с цитированием

  #2  
Старый 11.06.2007, 17:53
dmnt
Познающий
Регистрация: 06.06.2007
Сообщений: 99
Провел на форуме:
559723

Репутация: 94
Отправить сообщение для dmnt с помощью ICQ
По умолчанию

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

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

  #3  
Старый 11.06.2007, 17:55
GoreMaster
Участник форума
Регистрация: 28.05.2007
Сообщений: 125
Провел на форуме:
638513

Репутация: 103
По умолчанию

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

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

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

Последний раз редактировалось GoreMaster; 11.06.2007 в 18:04..
 
Ответить с цитированием

  #4  
Старый 11.06.2007, 18:04
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

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

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

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

Skype..?

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

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

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

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

  #5  
Старый 12.06.2007, 15:16
Jes
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме:
3371897

Репутация: 1462
По умолчанию

название топика: "Простейшие приемы"....
 
Ответить с цитированием

  #6  
Старый 12.06.2007, 16:31
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

Вот примерчик простейшей антиотладки

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

Код:
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.
 
Ответить с цитированием

  #7  
Старый 12.06.2007, 22:59
Hellsp@wn
Постоянный
Регистрация: 29.04.2007
Сообщений: 496
Провел на форуме:
2715445

Репутация: 588
По умолчанию

это не простейшая антиотладка, а элементарная...
и не к чему это вообще)

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

  #8  
Старый 12.06.2007, 23:23
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

1) Тема боян
2) переносится в реверсинг
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
fucking ho.com.ua - не работают простейшие скрипты! Дикс PHP, PERL, MySQL, JavaScript 11 16.07.2006 19:25
Некоторые приемы в Win2K foreva Чужие Статьи 0 06.02.2005 11:41



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ