Ich frage mich, ob es eine Möglichkeit gibt, das EBP eines Threads in einem anderen Prozess (in C++ unter Windows) als "GetThreadContext" zu erhalten. Ich vermute, dass diese Methode zu viel Zeit braucht (ich benutze sie sehr oft) und wenn ich nur die EBP und nicht alle Werte von CONTEXT bekommen könnte, wäre es schneller.
Ich dachte daran, "ReadProcessMemory" zu verwenden und dann die EBP mit dem Rest des Callstacks zu bekommen, aber ich weiß nicht, wo der Stack sein sollte und woher soll ich ihn bekommen.
Wenn jemand einen besseren Weg kennt, würde ich mich freuen, davon zu hören.
danke :)Das EBP eines Threads in einem anderen Prozess erhalten
Antwort
Der laufende Wert von EBP eines anderen Threads ist natürlich im EBP-Register, wenn der Thread läuft. Wenn es nicht läuft, wird es vom Scheduler im Kernel gespeichert. GetThreadContext ruft ab, was im Kernel ist; nichts anderes wird schneller sein.
Die Performance-Situation ist schlimmer, als ich es verstand, als ich dies schrieb. Wenn der Thread ausgeführt wird, verwendet der Kernel den APC-Mechanismus, um einen aktuellen Wert für Sie abzurufen. Dies ist nicht schnell, aber es gibt keine andere alternative API.
Nein, das ist falsch. NtGetContextThread reiht immer einen APC an den Zielthread an, wenn es nicht der aktuelle Thread ist. Es wartet dann auf den APC, um abzuschließen. Nicht sehr schnell. – wj32
Ich würde mich schlechter fühlen, wenn es tatsächlich eine andere schnellere Alternative gäbe. Ist dort eines? – bmargulies
Nein. Wenn ein Thread läuft, sind seine Register ... in den Registern, was nicht sehr hilfreich ist. Wenn es nicht ausgeführt wird, werden die Register in seinem KTHREAD-Objekt gespeichert. Der beste Weg, um sicherzustellen, dass die Register des Threads gespeichert werden, damit wir sie tatsächlich lesen können, besteht darin, einen APC an ihn zu hängen, was einen Interrupt auf dem Prozessor dieses Threads verursacht. – wj32
GetThreadContext wird der einzige Weg sein, weil EBP ein Register ist; Der Prozessor speichert es bei einem Kontextwechsel. Die einzige Möglichkeit, die Register eines Threads zu lesen, ist GetThreadContext.
Natürlich gibt es keine Garantie dafür, dass EBP den Wert hat, den Sie wollen ... Funktionen, die mit Auslassung des Frame-Zeigers kompiliert wurden, werden EBP nicht zuverlässig auf den Frame-Zeiger des aktuellen Call-Frames setzen.
Wenn Sie nur nach einem Stack-Trace suchen (der häufigste Grund, mit dem ein EBP beginnen soll), könnte ich Ihnen vorschlagen, StackWalk64?
- 1. Auslösen eines Basisereignisses in einem anderen Prozess
- 2. Signalisieren aller Threads in einem Prozess
- 3. Zuordnung innerhalb eines Threads nicht in einem anderen Thread
- 4. Prozess vs Threads
- 5. Prozess und Threads
- 6. Python Matplotlib: Plotten in einem anderen Prozess
- 7. Öffnen der Kamera in einem anderen Prozess
- 8. Wie verhindert man das Umschalten eines Threads?
- 9. erklärung über push ebp und pop ebp anweisung in assembly
- 10. FileStream: von einem anderen Prozess Fehler
- 11. Wie Stack-Spur eines Threads erhalten
- 12. Modale MessageBox auf einem anderen Prozess 'Handle kann Sperrziel Prozess
- 13. Hibernate/Neustart eines Threads
- 14. In einen anderen Prozess ziehen
- 15. Problem - TCHAR als LPARAM zu einem Fenster, das zu einem anderen Prozess/Thread gehört
- 16. System.IO.IOException: Datei von einem anderen Prozess
- 17. Rückruf einmal Aktivität in einem anderen Prozess gestartet?
- 18. Erhalte eine Nachricht von einem anderen Prozess
- 19. Datei wird von einem anderen Prozess verwendet
- 20. Freigabe-Ressource von einem anderen Prozess
- 21. Datei, die von einem anderen Prozess
- 22. Webhook Prozess auf einem anderen goroutine laufen
- 23. Starten eines Threads mit einem Parameter
- 24. Schließen eines Formulars, das in einem anderen Thread erstellt wird
- 25. Das Gesicht eines Würfels erhalten
- 26. Objekt von einem Prozess zu einem anderen übergeben
- 27. Wie von einem Prozess zum anderen zu signalisieren?
- 28. Zombie-Prozess, obwohl Threads noch laufen
- 29. Auf eine Variable eines Threads von einem anderen Thread in Java zugreifen
- 30. clr.dll LogHelp_TerminateOnAssert in einem .NET 4.0 Prozess
Was schreibst du, ein Profiler? Vielleicht, wenn Sie Ihr Problem erklären, kann Ihnen jemand einen schnelleren Weg geben. –
ja, ein Profiler :) – Idov