Assembler Stackinhalt aus Mainthread

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Assembler Stackinhalt aus Mainthread

Beitrag von CSHW89 »

Hallo Leute,

ich habe mal eine Frage an die Assembler-Genies: gibt es eine Möglichkeit aus einem Thread heraus, den kompletten Stackinhalt des Mainthreads (oder besser noch aus allen weiteren Threads des Prozesses) herauszulesen? Aus dem eigenen Thread kann man ja auf das esp-Register zugreifen, wobei ich da auch nicht weiß, wie man an die derzeitige Stackgröße herankommt.

lg Kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Assembler Stackinhalt aus Mainthread

Beitrag von DarkSoul »

Schwierig. Ich denke, es ist unmöglich, weil dein Thread ein eigener Prozess ist.

Am nicht-eigenen Stack herumzufummeln finde ich ziemlich unschön. Wozu brauchst du das denn? :o

Alternativvorschlag:
1. Nachricht an Main-Thread: Lies mal deinen Stackbereich aus und sende ihn mir zu.
2. Thread wartet auf die Daten...
3. Main-Thread erledigt das bei nächster Gelegenheit und sendet ihm die Daten. (Als kopierten Speicherbereich, nicht einfach den Inhalt vom SP-Register als Zeiger übermitteln)
4. Thread erhält die Daten und macht weiter
:)

Wäre ja schlimm, wenn auf "fremden" Stack zugegriffen werden könnte. Das wäre ein offenes Scheunentor für bösartige Machenschaften, wenn man an beliebige threadfremde Stellen vom Stack zugreifen könnte. :wink:
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Assembler Stackinhalt aus Mainthread

Beitrag von NicTheQuick »

Threads und Prozesse sind unterschiedliche Dinge. Ein Prozess kann fast beliebig viele Threads besitzen und alle Threads nutzen üblicherweise einen gemeinsamen virtuellen Speicherbereich. Bei Prozessen ist das nicht so. Da hat jeder Prozess einen eigenen virtuellen Speicherbereich. Das heißt ein Prozess kann nicht auf den Speicher eines anderen Prozesses zugreifen, aber innerhalb eines Prozesses können Threads auf den Speicher anderer Threads zugreifen. Da dürften nicht mal die Threaded-Variablen ausgenommen sein, wenn man nur ihren Pointer kennt.
*Coding*
Hab es gerade verifiziert. Man kann die Threaded-Variablen anderer Threads manipulieren:

Code: Alles auswählen

Define *otherVar.Integer

Threaded var.i

Procedure Thread(*p_otherVar.Integer)
	*p_otherVar\i = @var
	var = 1
	Delay(1000)
	Debug var
EndProcedure

CreateThread(@Thread(), @*otherVar)
Delay(500)
*otherVar\i = 2
Delay(1000)
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Assembler Stackinhalt aus Mainthread

Beitrag von CSHW89 »

Jep, hab auch mit einigem googlen doch noch ne Lösung gefunden (PS: funktioniert nur mit 32bit, kann man aber leicht ändern):

Code: Alles auswählen

Global __mainPointer.i, __mainThread.i
Global __testPointer.i, __testThread.i

! MOV dword [v___mainPointer], esp
Debug "main start esp: " + __mainPointer

DuplicateHandle_(GetCurrentProcess_(), GetCurrentThread_(), GetCurrentProcess_(), @__mainThread, 0, #False, #DUPLICATE_SAME_ACCESS)


Procedure testThread(dummy)
  
  ! MOV dword [v___testPointer], esp
  Debug "test start esp: " + __testPointer
  
  ! PUSH 3
  ! PUSH 42
  ! PUSH 5
  
  Repeat
  ForEver
EndProcedure


Procedure readContext(dummy)
  Protected context.CONTEXT
  
  SuspendThread_(__mainThread)
  SuspendThread_(__testThread)
  
  context\ContextFlags = #CONTEXT_CONTROL
  GetThreadContext_(__mainThread, @context)
  
  Debug "-----------"
  Debug "main current esp: " + context\esp
  Debug "content of main thread"
  For i = context\esp To __mainPointer Step 4
    Debug PeekI(i)
  Next
  
  context\ContextFlags = #CONTEXT_CONTROL
  GetThreadContext_(__testThread, @context)
  
  Debug "-----------"
  Debug "test current esp: " + context\esp
  Debug "content of test thread"
  For i = context\esp To __testPointer Step 4
    Debug PeekI(i)
  Next
  
  ResumeThread_(__mainThread)
  ; ResumeThread_(__testThread)
EndProcedure


! PUSH 9
! PUSH 102
! PUSH 7


__testThread = ThreadID(CreateThread(@testThread(), 0))
Delay(100)
CreateThread(@readContext(), 0)
Delay(1000)
Ich pushe sowohl im Main-Thread (7,102,9) sowie im Test-Thread (5,42,3) jeweils drei Werte. Wenn mans starten, kann man sie bei der Ausgabe finden. Etwas finde ich aber bei der Ausgabe komisch. Beim Inhalt des Test-Threads liegt vor der 3 noch ein Wert auf dem Stack, vermutlich hat das was mit der dummy-Variable zu tun. Nach den Werten 5,42,3 finden sich allerdings noch weitere Werte. Das merkwürdige daran ist, dass manchmal nur zwei Werte zu finden sind, manchmal aber deutlich mehr.

lg Kevin

PS: Ach ja, weshalb ich das mache: Stichwort Garbage Collection
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Antworten