![]() |
GetThreadContext liefert falsche Werte
Delphi-Quellcode:
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?
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; Sollte ich das falsch sehen, wie krieg ich dann die aktuelle Programmzeile heraus wenn ich den Prozess anhalte? |
Re: GetThreadContext liefert falsche Werte
So wie du es da stehen hast, gibt es den System Breakpoint zurück der in der ntdll liegt (Nicht den Entry Point!).
Lässt du das Programm laufen, dann ist der EIP irgendwo. Jenachdem wo der MainThread gerade dran ist. Und immer dran denken, den Thread vorher zu suspenden, sonst bringt der dir gar nix ;) |
Re: GetThreadContext liefert falsche Werte
mmmh .. und wie lese ich die register des threads richtig?
|
Re: GetThreadContext liefert falsche Werte
Delphi-Quellcode:
so funktionierts :)
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; |
Re: GetThreadContext liefert falsche Werte
Darf man auch mal fragen wofür du das brauchst?
|
Re: GetThreadContext liefert falsche Werte
Nachdem mein letztes Projekt ein EXE-Crypter war, versuche Ich jetzt einen universal EXE-Uncrypter zu programmieren, dafür muss ich aber genau wissen welche programmzeile gerade ausgeführt wird und quasi durch den code tracen. Ganz einfach ist es nicht, aber wenn es zu einfach wäre, würde es ja keinen spaß machen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz