AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi BaseAddress aller Threads einer Anwendung bestimmen

BaseAddress aller Threads einer Anwendung bestimmen

Ein Thema von peanut · begonnen am 21. Jun 2006 · letzter Beitrag vom 24. Jun 2006
Antwort Antwort
peanut
(Gast)

n/a Beiträge
 
#1

BaseAddress aller Threads einer Anwendung bestimmen

  Alt 21. Jun 2006, 12:52
Hallo,

ich möchte gerne alle Threads eines gegebenen Prozesses auswerten.
Gibt es eine API-Funktion, mit der ich mir die Basisadresse eines
Threads anzeigen lassen kann um z.B. zu überprüfen, wo der Code
des Threads im Speicher liegt?

Ich habe bereits versucht, dies mittels debugging zu lösen. Doch
die dort erhaltenen TDebugEvent.CreateThread.lpStartAddress zeigt
immer auf eine IMAGE_SCN_MEM_EXECUTE Section der kernel32.dll?

Das finde ich sehr komisch, da Threads doch eigentlich im Prozess-
speicher der Anwendung laufen sollten. Müsste ich demenstsprechend
nicht in einer als IMAGE_SCN_MEM_EXECUTE markierten Section
meines Prozesses landen?

Für Hilfe bin ich sehr dankbar.

Viele Grüße

peanut.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#2

Re: BaseAddress aller Threads einer Anwendung bestimmen

  Alt 21. Jun 2006, 16:21
Zitat von peanut:
Ich habe bereits versucht, dies mittels debugging zu lösen. Doch
die dort erhaltenen TDebugEvent.CreateThread.lpStartAddress zeigt
immer auf eine IMAGE_SCN_MEM_EXECUTE Section der kernel32.dll?
Die Startadresse der mit kernel32!CreateThread erzeugten Threads ist kernel32!BaseThreadStart (Wrapper-Funktion die die eigentliche Thread-Funktion aufruft).

ps: siehe http://www.microsoft.com/msj/0799/Win32/Win320799.aspx
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#3

Re: BaseAddress aller Threads einer Anwendung bestimmen

  Alt 22. Jun 2006, 09:51
Zitat von NicoDE:
Die Startadresse der mit kernel32!CreateThread erzeugten Threads ist kernel32!BaseThreadStart (Wrapper-Funktion die die eigentliche Thread-Funktion aufruft).
Wie komme ich an kernel32!BaseThreadStart, wenn ich den Thread nicht selbst erzeugt habe. Ich denke da vor allem an CreateRemoteThread()! In meiner Anwendung soll dies möglichst frühzeitig erkannt werden.

Dummerweise funktioniert CreateRemoteThread auch in Gast-Zugängen auf allen Prozessen, die mit diesen Rechten laufen. Kann man das irgendwie unterbinden - das scheint mir beinahe leichter zu sein als mit den Threads zu pfuschen...
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#4

Re: BaseAddress aller Threads einer Anwendung bestimmen

  Alt 22. Jun 2006, 10:05
Zitat von peanut:
Wie komme ich an kernel32!BaseThreadStart, wenn ich den Thread nicht selbst erzeugt habe.
Wozu brauchst du die Adresse eines internen Wrappers?

Zitat von peanut:
Ich denke da vor allem an CreateRemoteThread()! In meiner Anwendung soll dies möglichst frühzeitig erkannt werden.
Schreibe eine DLL und reagiere auf neue Threads.

Zitat von peanut:
Dummerweise funktioniert CreateRemoteThread auch in Gast-Zugängen auf allen Prozessen, die mit diesen Rechten laufen. Kann man das irgendwie unterbinden
Ändere die Sicherheitsbeschreibung deines Prozesses.
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#5

Re: BaseAddress aller Threads einer Anwendung bestimmen

  Alt 22. Jun 2006, 10:41
Zitat von NicoDE:
Zitat von peanut:
Wie komme ich an kernel32!BaseThreadStart, wenn ich den Thread nicht selbst erzeugt habe.
Wozu brauchst du die Adresse eines internen Wrappers?
Ich habe mich dumm ausgedrückt, ich wollte eigentlich an den ThreadContext um so vielleicht an die Adresse des Threads zu kommen - über ebp-Register? Das sollte ich mir aber lieber aus dem Kopf schlagen...

Zitat von NicoDE:
Zitat von peanut:
Ich denke da vor allem an CreateRemoteThread()! In meiner Anwendung soll dies möglichst frühzeitig erkannt werden.
Schreibe eine DLL und reagiere auf neue Threads.
Wie kann ich in einer DLL erkennen ob ein Thread in der Anwendung erzeugt wird? Ich bekomme dort doch nur Nachrichten mit, die die DLL betreffen oder kann man dort auch erfahren, wo ein neuer Thread im Speicher liegt?

Zitat von NicoDE:
Zitat von peanut:
Dummerweise funktioniert CreateRemoteThread auch in Gast-Zugängen auf allen Prozessen, die mit diesen Rechten laufen. Kann man das irgendwie unterbinden
Ändere die Sicherheitsbeschreibung deines Prozesses.
Wie kann man die Sicherheitsbeschreibung ändern?
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#6

Re: BaseAddress aller Threads einer Anwendung bestimmen

  Alt 22. Jun 2006, 12:34
Zitat von peanut:
Wie kann ich in einer DLL erkennen ob ein Thread in der Anwendung erzeugt wird?
Du kannst in deiner LibraryProc auf DLL_THREAD_ATTACH/DLL_THREAD_DETACH reagieren (setz voraus, dass in deiner DLL die Funktion DisableThreadLibraryCalls() nicht aufgerufen wurde).

Zitat von peanut:
Ich bekomme dort doch nur Nachrichten mit, die die DLL betreffen oder kann man dort auch erfahren, wo ein neuer Thread im Speicher liegt?
Du wirst nur informiert, dass ein Thread erzeugt oder beendet wurde. Die restliche Logik musst du schon selbst implementieren.
(kleiner Tipp: in TThreadEntry32.th32OwnerProcessID steht wahrscheinlich das was du suchst)

Zitat von peanut:
Wie kann man die Sicherheitsbeschreibung ändern?
Zum Beispiel mit SetSecurityInfo.
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#7

Re: BaseAddress aller Threads einer Anwendung bestimmen

  Alt 22. Jun 2006, 12:50
Vielen Dank NicoDE für die Hinweise - ich muss noch einiges lernen...
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#8

Re: BaseAddress aller Threads einer Anwendung bestimmen

  Alt 23. Jun 2006, 12:50
Zitat von NicoDE:
Zitat von peanut:
Ich bekomme dort doch nur Nachrichten mit, die die DLL betreffen oder kann man dort auch erfahren, wo ein neuer Thread im Speicher liegt?
Du wirst nur informiert, dass ein Thread erzeugt oder beendet wurde. Die restliche Logik musst du schon selbst implementieren.
(kleiner Tipp: in TThreadEntry32.th32OwnerProcessID steht wahrscheinlich das was du suchst)
Das habe ich versucht, leider enthält TThreadEntry32.th32OwnerProcessID immer die ProzessID der Anwendung, in der ein solcher Thread ausgeführt wird - irgendwie ist das ja auch logisch, denn über CreateRemoteThread wird eine ThreadProc im anderen Prozess aufgerufen => muss dann auch dessen ProzessID sein.

Die einzige Information die man eventluell auswerten könnte wäre die ThreadID. Ich frage mich bloß, wie man von dieser ausgehend an den Speicherbereich kommt, in dem der ausführbare Code des Threads steht?
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#9

Re: BaseAddress aller Threads einer Anwendung bestimmen

  Alt 24. Jun 2006, 12:20
Hab`s hinbekommen.... GetThreadContext(). In EAX steht die Startadresse des Threads drin. Klappt aber nur, wenn man den Prozess debuggt. Ich muss noch testen, ob das auch über eine DLL mit DLL_THREAD_ATTACH funktioniert, denn das wäre leichter.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:12 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