AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetThreadContext 64Bit

Ein Thema von sansimarkus · begonnen am 25. Jul 2012 · letzter Beitrag vom 30. Jul 2012
Antwort Antwort
sansimarkus

Registriert seit: 15. Dez 2011
17 Beiträge
 
Delphi XE2 Architect
 
#1

GetThreadContext 64Bit

  Alt 25. Jul 2012, 16:04
Moin,

ich bastele grade ein Programm, dass ein anderes via CreateProcess startet, dadurch habe ich ein TProcessInformation record welches das Handle des Prozesses und des Hauptthreads enthält. Nun versuche ich kurz nach dem starten des Programmes (sleep (100)) einen der Register des Hauptthreads auszulesen:

Delphi-Quellcode:
     

var
   FTargetContext: _CONTEXT; // = winapi.windows._CONTEXT
   FStartUpInfo: TStartupInfo;
   FProcessSpawnInfo: TProcessInformation;

[....]
 
ZeroMemory(@FStartUpInfo, SizeOf(TStartUpInfo));
ZeroMemory(@FProcessSpawnInfo, SizeOf(TProcessInformation));
FStartUpInfo.cb := SizeOf(TStartUpInfo);
if not CreateProcess(PChar(StrBuf2), nil, nil, nil, true,
                     DETACHED_PROCESS or CREATE_SUSPENDED,
                     nil, PChar(StrBuf1), FStartUpInfo, FProcessSpawnInfo)
then
    ErrorAndExit(); //pseudocode

repeat
 if ResumeThread(FProcessSpawnInfo.hThread) = -1 then
   ErrorAndExit(); //pseudocode
 Sleep(100);
 FTargetContext.ContextFlags := CONTEXT_FULL;
 if SuspendThread(FProcessSpawnInfo.hThread) = -1 then
   ErrorAndExit(); //pseudocode
 if not GetThreadContext(FProcessSpawnInfo.hThread, FTargetContext) then
   ErrorAndExit(); // <---- failed
until SomeCondition;
Das ganze funktioniert wunderbar in der 32Bit Version (target prozess ist natürlich auch 32bit), mit 64Bit (target prozess ist auch 64bit) kommt GetThreadContext mit false zurück und FTargetContext ist ausgenullt. Im MSDN steht leider nichts bezüglich irgendwelcher unterschiede von GetThreadContext bei 32 und 64Bit, abgesehen davon, dass ein 64bit Programm ein 32bit-Thread mittels Wow64GetThreadContext auslesen kann, aber das trifft ja nicht zu, da meine 64bit-Executable auch eine 64bit-Executable wieder ausführt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: GetThreadContext 64Bit

  Alt 25. Jul 2012, 17:52
kommt GetThreadContext mit false zurück und FTargetContext ist ausgenullt. Im MSDN steht leider nichts ...
Einiges steht dort schon.

Zitat:
Return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Zitat:
If the function succeeds, the return value is nonzero.
OK, ist erledigt.

Zitat:
To get extended error information, call GetLastError.
?



GetLastError SysErrorMessage RaiseLastOSError ...
$2B or not $2B
  Mit Zitat antworten Zitat
sansimarkus

Registriert seit: 15. Dez 2011
17 Beiträge
 
Delphi XE2 Architect
 
#3

AW: GetThreadContext 64Bit

  Alt 25. Jul 2012, 18:06
Oops, ganz vergessen zu dazuzuschreiben, jo der WindowsError ist mal wieder hilfreich wie Fußpilz:
"Unzulässiger Zugriff auf einen Speicherbereich" - auf welchen Speicherbereich? ist meine Context-variable zu klein? oder der Speicherbereich im anderen Programm/Thread geschützt? Da fallen mir noch 100 weitere Möglichkeiten ein wo er auf Speicher zugreifen könnte.

RaiseLastOSError:
Code:
ERROR_NOACCESS
    998 (0x3E6)
    Invalid access to memory location.

Und zum nonzero return Value: die Funktion gibt System.Boolean zurück und die Suspend/Resumethread geben im Fehlerfall laut MSDN -1 zurück.


Edit: mein Programm läuft als Administrator, es holt sich vor CreateProcess das DebugPrivilegeToken.

Edit2: Was mich am meisten ärgert ist, dass ich das ganze nicht vernünftig debuggen kann, mit singlestepping springt er einfach drüber. Das x64 debugging mit Delphi XE2 ist der pure Wahnsinn.

Geändert von sansimarkus (25. Jul 2012 um 18:24 Uhr)
  Mit Zitat antworten Zitat
sansimarkus

Registriert seit: 15. Dez 2011
17 Beiträge
 
Delphi XE2 Architect
 
#4

AW: GetThreadContext 64Bit

  Alt 27. Jul 2012, 10:30
Update:

Anstatt dem Handle, dass mir CreateProcess in FProcessSpawnInfo schreibt nun versucht mittels dem Handle von OpenThread 'THREAD_ALL_ACCESS' den Context zu lesen, ohne Erfolg. Warum ist OpenThread eigentlich nicht in den Delphi-Windows headern?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: GetThreadContext 64Bit

  Alt 30. Jul 2012, 09:43
Was passiert, wenn du es mal nicht mit CONTEXT_FULL, sondern mit z.b. mal nur den Control Registern versuchst?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
sansimarkus

Registriert seit: 15. Dez 2011
17 Beiträge
 
Delphi XE2 Architect
 
#6

AW: GetThreadContext 64Bit

  Alt 30. Jul 2012, 13:54
Selbes Ergebnis - mit allen verügbaren Flags.
  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 02:27 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