AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi GetThreadContext liefert falsche Werte
Thema durchsuchen
Ansicht
Themen-Optionen

GetThreadContext liefert falsche Werte

Ein Thema von MCQ · begonnen am 16. Jan 2006 · letzter Beitrag vom 16. Jan 2006
Antwort Antwort
MCQ

Registriert seit: 14. Jan 2004
Ort: Dessau
80 Beiträge
 
#1

GetThreadContext liefert falsche Werte

  Alt 16. Jan 2006, 14:45
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?
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#2

Re: GetThreadContext liefert falsche Werte

  Alt 16. Jan 2006, 15:14
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
  Mit Zitat antworten Zitat
MCQ

Registriert seit: 14. Jan 2004
Ort: Dessau
80 Beiträge
 
#3

Re: GetThreadContext liefert falsche Werte

  Alt 16. Jan 2006, 15:30
mmmh .. und wie lese ich die register des threads richtig?
  Mit Zitat antworten Zitat
MCQ

Registriert seit: 14. Jan 2004
Ort: Dessau
80 Beiträge
 
#4

Re: GetThreadContext liefert falsche Werte

  Alt 16. Jan 2006, 15:38
Delphi-Quellcode:
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;
so funktionierts
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#5

Re: GetThreadContext liefert falsche Werte

  Alt 16. Jan 2006, 15:57
Darf man auch mal fragen wofür du das brauchst?
  Mit Zitat antworten Zitat
MCQ

Registriert seit: 14. Jan 2004
Ort: Dessau
80 Beiträge
 
#6

Re: GetThreadContext liefert falsche Werte

  Alt 16. Jan 2006, 16:01
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz