Synchronize Code Injection

09/11/2012 13:25 Medix#1
hoi :>

ich suche gerade verzweifelt nach einer möglichkeit meinen thread mit dem des hauptthreads eines spiels zu synchronisieren.


Zur Zeit sieht mein code ca. so aus:

Code:
SuspendThread(main_thread)
InjectAndExecuteThread()
ResumeThread(main_thread)
funktioniert auch wunderbar (bis es ab und zu random crashed wahrscheinlich auf grund von race conditions oder was weiß ich). Zudem wird von der verwendung von suspend/resumethread absolut abgeraten auf msdn.

Gibt es eine möglichkeit das ganze irgendwie threadsafe zu bekommen damit keine random crashs mehr auftreten?

Hab länger gesucht und nichts gefunden und selber gehn mir die ideen auch aus :(

Würde jedoch in diesem Fall gerne auf dll injection & hooks verzichten. (damit würd sich das leicht lösen lassen).
09/11/2012 14:05 Tyrar#2
wenn ich es richtig verstanden habe würde es reichen, den mainthread anzuhalten und einen neuen thread mit dem eigenen code zu starten. sobald der neue thread beendet wurde kannst du den main thread fortführen.
09/11/2012 14:34 Medix#3
exakt. Nur ist mir dazu nur SuspendThread() und ResumeThread() bekannt. und diese sind für debugger gedacht und scheinen ihren job nicht immer so zu machen wie ich es will.
09/14/2012 18:37 tnd0#4
Wenn dein eigener Thread nicht zulange braucht kannst du mittels OpenThread() und GetThreadContext() auf den MainThread den derzeitigen EIP (64bit: RIP) auslesen. An einer geeigneten Stelle (zb. beim callen einer Funktion und während der Thread sich nicht in einer CriticalSection befindet) dann die ersten 2 Byte durch $EB $FE ersetzen (jmp -2), sodass er nicht suspended sondern in einer Endlosschleife ist. Nach dem Ersetzen im Injector/HackTool/Crack/Patch den EIP/RIP periodisch checken bis er in dem veränderten Code bereich angekommen ist, dann kannst du ihn sicher Suspenden. Vor dem Resumen natürlich den Originalcode wiederherstellen.