var
si: TStartupInfo;
Programm:PChar;
context:_CONTEXT;
buf1:array[0..1] of char;
bp:array[0..1] of char;
addr:Pointer;
num:DWORD;
begin
// Ziel-EXE
Programm:='D:\Cracking\CrackMe\HDasm\HDasm.exe';
// Code für BreakPoint
bp:=chr($EB)+chr($FE);
// Programm wird im Suspended-Mode gestartet
FillChar(si, SizeOf(si), 0);
FillChar(pi, SizeOf(pi), 0);
CreateProcess(Programm,nil,nil,nil,false,CREATE_SUSPENDED,nil,nil,si,pi);
// Register werden gelesen
context.ContextFlags:=CONTEXT_FULL or CONTEXT_FLOATING_POINT or CONTEXT_DEBUG_REGISTERS;
GetThreadContext(pi.hThread,context);
// EntryPoint wid ermittelt
addr:=ptr(context.Eax);
// Schreib-Lese-Rechte werden geholt
VirtualProtectEx(pi.hProcess,addr,2,PROCESS_ALL_ACCESS,num);
// alte werte werden gesichert
ReadProcessMemory(pi.hProcess,addr,@buf1,sizeof(buf1),num);
showmessage(inttostr(num));
// breakPoint wird gesetzt
WriteProcessMemory(pi.hProcess,addr,@bp,sizeof(bp),num);
showmessage(inttostr(num));
// Prozess wird fortgesetzt
ResumeThread(pi.hThread);
// es wird gewartet bis Programm am BP hängt
sleep(100);
// Prozess wird angehalten
suspendThread(pi.hThread);
// Register werden gelesen
GetThreadContext(pi.hThread,context);
// alte werte werden wiederergestellt
WriteProcessMemory(pi.hProcess,addr,@buf1,sizeof(buf1),num);
// Register werden ausgegeben
showmessage('EAX: '+inttohex(context.Eax,8)+#13+
'EBX: '+inttohex(context.Ebx,8)+#13+
'ECX: '+inttohex(context.Ecx,8)+#13+
'EDX: '+inttohex(context.Edx,8)+#13+
'ESP: '+inttohex(context.Esp,8)+#13+
'EDI: '+inttohex(context.Edi,8)+#13+
'EIP: '+inttohex(context.Eip,8)+#13
);
// Prozess wird fortgesetzt
ResumeThread(pi.hThread);
end;