Delphi-Quellcode:
var
si: TStartupInfo;
ACurrentDir:Pchar;
Programm:PChar;
wert:DWORD;
context:_CONTEXT;
begin
Programm:='D:\test.exe';
ACurrentDir := PChar(ExtractFilePath(Programm));
FillChar(si, SizeOf(si), 0);
FillChar(pi, SizeOf(pi), 0);
CreateProcess(Programm,nil,nil,nil,false,CREATE_SUSPENDED,nil,nil,si,pi);
context.ContextFlags:=CONTEXT_FULL or CONTEXT_FLOATING_POINT or CONTEXT_DEBUG_REGISTERS;
GetThreadContext(pi.hThread,context);
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
);
ResumeThread(pi.hThread);
end;
Diese funktion funtioniert insoweit das das die Ziel-EXE gestartet und Angehalten wird. eine MessageBoxWird ausgegeben in der die Werte der Register stehen. ABER: Der EntryPoint (0044AD54) der EXE-Datei steht in EAX und selbst wenn ich mir die MessageBox erst ausgeben nachdem das Programm 4 sekunden lang gearbeitet hat, liegt der wert von EIP nicht mal annährend in einer der Setionen des Programms. EIP, sollte doch aber die Programmzeile zurückgeben in der gerade gearbeitet wird, oder sehe ich das falsch?
Sollte ich das falsch sehen, wie krieg ich dann die aktuelle Programmzeile heraus wenn ich den Prozess anhalte?