Показать сообщение отдельно

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