Einzelnen Beitrag anzeigen

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