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

Discussion in 'Реверсинг' started by Jes, 11 Jun 2007.

  1. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    все вот спрашивают , а я вот решил самовыразится...
    вроде на статью - не тянет , а для топика - в самый раз..
    Здесь начинающие програмисты могут черпать для себя идеи и ползеную информацию для защиты своих приложений:
    ...начнем, пожалуй...

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

    Но >Эпилог< настоящего кракера ничто не остановит.Приктически невозможно написать программы, которая могла бы противостоять опытному взломщику.Описанные мной приёмы позволят лишь затруднить(иногда очень значительно осложнить) его работу...а так же защитить программу от кракеров-"дилетантов". Велика вероятность что у взломщика просто не хватит терпения и он забьёт на взлом вашей софтины...
    И вообще , только благодаря нелегкому труду крякеров мы ежедневно насладаемся использованием наших компилятовов , игр , софтом, операционными системыми...честь и хвала им. вперед, парни!Так держать!
     
    #1 Jes, 11 Jun 2007
    Last edited: 12 Jun 2007
  2. dmnt

    dmnt Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    89
    Likes Received:
    36
    Reputations:
    15
    не советовал бы :) это может серьезно облегчить написание кряка

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

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    119
    Likes Received:
    32
    Reputations:
    4
    Это функцию уже все обходят + плагины есть, которые прячут дебаггер.

    создавай чисто демо версии в котрых все функции обрезаны и их нельзя восстановить...И ни один кракер не будет с ней парится, и все купят твой софт (=

    dmnt
    сцуко опередил :)
     
    #3 GoreMaster, 11 Jun 2007
    Last edited: 11 Jun 2007
  4. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    > Большенство дебагеров , наткнувшись на такой финт, вылетят или проигнорируют обработчик ошибок...

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

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

    Skype..?

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

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

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

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

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    название топика: "Простейшие приемы"....
     
    1 person likes this.
  6. Xserg

    Xserg Elder - Старейшина

    Joined:
    9 Dec 2006
    Messages:
    135
    Likes Received:
    127
    Reputations:
    53
    Вот примерчик простейшей антиотладки

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

    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.
    
     
  7. Hellsp@wn

    Hellsp@wn Elder - Старейшина

    Joined:
    29 Apr 2007
    Messages:
    401
    Likes Received:
    153
    Reputations:
    48
    это не простейшая антиотладка, а элементарная...
    и не к чему это вообще)

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

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    1) Тема боян
    2) переносится в реверсинг