
12.06.2007, 16:31
|
|
Участник форума
Регистрация: 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.
|
|
|