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
Assembler Stackinhalt aus Mainthread
Assembler Stackinhalt aus Mainthread

http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Re: Assembler Stackinhalt aus Mainthread
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?
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.
Am nicht-eigenen Stack herumzufummeln finde ich ziemlich unschön. Wozu brauchst du das denn?
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.

- 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
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:
*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)Re: Assembler Stackinhalt aus Mainthread
Jep, hab auch mit einigem googlen doch noch ne Lösung gefunden (PS: funktioniert nur mit 32bit, kann man aber leicht ändern):
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
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)
lg Kevin
PS: Ach ja, weshalb ich das mache: Stichwort Garbage Collection

http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen