Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как определить - находится ли приложение в...


Автор: MuForum 4.7.2007, 18:01
Доброе время суток!

Столкнулся с такой проблемой, и чесно говоря пока не знаю как решить, да и в Интернете мало чего нашел по этому поводу... (Только по Delphi кое-что...)

Вопрос: "Как определить - Находиться ли приложение в режиме отладки?", другими словами, нужно проверять, находиться ли программа в состояние Debug или прикрепился(attach) ли какой-то дебагер к программе, если да, то выключаем программу.


P.S. -> Прошу помощь опытных программеров, так как сам справиться не могу!


Вот в Интернете нашел интересную информацию по этому поводу, но только на Delphi!
Цитата(Simon Carter)

Обычно господа взломщики, для того, чтобы взломать защиту приложения, запускают его в режиме отладки и анализируют машинный код для определения точки перехвата ввода пароля с клавиатуры. 
Обычно таким способом ломаются игрушки smile 
Конечно данный способ не сможет полностью защитить Ваш программный продукт от взлома, но прекратить выполнение секретного кода - запросто. Для этого мы будем использовать API функцию IsDebuggerPresent. Единственный недостаток этой функции, заключается в том, что она не работет под Windows 95. 
Теперь посмотрим как эту функцию реализовать в Delphi:
Код

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('debugging')  
else  
  ShowMessage('NOT debugging');


Автор: JackYF 4.7.2007, 18:06
Код

bool DebuggerPresent()
{
  typedef bool (__stdcall* TDebugProc)();  

  HMODULE kernel32;  
  TDebugProc DebugProc;  

  bool result = false;
  kernel32 = GetModuleHandle("kernel32.dll");  
  if (Kernel32 != 0)
  {  
    DebugProc = GetProcAddress(Kernel32, "IsDebuggerPresent");  
    if (DebugProc)
    {  
      Result = DebugProc();
    } 
  }  
}


if (DebuggerPresent())
{
  ShowMessage("debugging");  
}
else
 


Ну где-то вот так...

Автор: MuForum 4.7.2007, 18:24
#2, JackYF - Благодарю за помощь, сейчас уже буду дальше работать и химичить ;)

Автор: jonie 4.7.2007, 22:12
такой код обойдется за эмн....2 ил 3 секунды тем же отладчиком ...
вариантов море на самом деле определения отладчика... это и флаги проца, и засекания времени rdtsc используя и SEH\VEH трюки...
подробнее на wasm.ru и на сайтах посвященным взломам...для начала рекомендую поискать статью "исследование полиморфного движка ASProtect"....

Автор: Klin 4.7.2007, 23:35
jonie, в принципе за это время можно его и пресечь. К сожалению, в этом случае нужно определить не только его наличие, но и его "нахождение". А на это может уйти время.

Автор: dumb 5.7.2007, 03:09
Цитата(Klin @  5.7.2007,  00:35 Найти цитируемый пост)
в принципе за это время можно его и пресечь.

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

по поводу kernel32!IsDebuggerPresent: а стоит ли ради пары байт такой огород городить?  - там суть-то в паре строк:
Код

mov eax,fs:[30h] ; peb
movzx eax,byte ptr [eax+02] ; isdebug

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)