Prozesse abfragen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JamesBond700
User
Beiträge: 8
Registriert: Sonntag 29. Januar 2012, 23:14

Guten Tag,
ich möchte in mein Python-Projekt eine Abfrage einbauen, ob ein Prozess gestartet ist. Den Prozess will ich per Namen abfragen. Das Problem ist, dass ich auf Python 2.2 angewiesen bin, und nicht auf die Win32Api zurückgreifen kann. Was bleiben mir für Möglichkeiten? Ich könnte mit os.system auch mit einem Timer alle 3 Sekunden den Prozess beenden, aber die alle 3 Sekunden aufblinkende Eingabeaufforderung ist wirklich nervig.

Lg :)
lunar

@JamesBond700: "tasklist.exe" ist so ziemlich die einzige verbleibende Möglichkeit. Im Allgemeinen ist allerdings eine Aktualisierung der Python-Version ratsam. Welche Gründe kann es denn geben, heute noch Python 2.2(!) einzusetzen?!
needsch
User
Beiträge: 15
Registriert: Donnerstag 22. Dezember 2011, 21:28

Wieso kannst du die Win32API nicht benutzen? Also ich kann verstehen, dass du einen Bogen um die pywin32-Module machen möchtest, aber zumindest das ctypes-Modul könntest du verwenden, um direkt die API anzusprechen. Beispielsweise so: http://code.activestate.com/recipes/576 ... on-on-win/

Alternativ kannst du einfach tasklist verwenden oder - wenn das von den Lizenzen her kein Problem ist - pslist von den Sysinternals-Tools zu dem Python-Skript dazupacken. Das kann dann einfach von Python aus ausgeführt werden um die aktuell laufenden Prozesse zu listen. Dann musst du dich selbst nicht um die API-Aufrufe kümmern, das wird alles von tasklist/pslist erledigt.

Aus persönlichem Interesse: Wieso musst du Python 2.2 verwenden? :wink:

Viele Grüße
JamesBond700
User
Beiträge: 8
Registriert: Sonntag 29. Januar 2012, 23:14

Ich betreibe einen P-Server und die User benutzen Bots, welche ich ausfindig machen möchte, und danach killen ;) Habe jetzt geschafft den Client des Spiels auf Python 2.3 zu updaten, und habe es auch geschafft mit ctypes Programme über die PID zu killen. Jedoch muss ich ja noch die PID des Bots ausfindig machen. Wie komme ich über den Namen eines Prozesses zur PID? Vor dem Problem stehe ich gerade.

Danke schon einmal für eure Hilfe :)

Lg
lunar

@JamesBond700: Was ist ein "P-Server"?
JamesBond700
User
Beiträge: 8
Registriert: Sonntag 29. Januar 2012, 23:14

Privater Server eines Spieles. Ähnlich wie World of Warcraft Server, welche von Privaten Personen gehostet sind.

Lg
needsch
User
Beiträge: 15
Registriert: Donnerstag 22. Dezember 2011, 21:28

JamesBond700 hat geschrieben:Ich betreibe einen P-Server und die User benutzen Bots, welche ich ausfindig machen möchte, und danach killen ;) Habe jetzt geschafft den Client des Spiels auf Python 2.3 zu updaten, und habe es auch geschafft mit ctypes Programme über die PID zu killen. Jedoch muss ich ja noch die PID des Bots ausfindig machen. Wie komme ich über den Namen eines Prozesses zur PID? Vor dem Problem stehe ich gerade.

Danke schon einmal für eure Hilfe :)

Lg
Schau dir mal das Rezept an, das ich in meinem obigen Post verlinkt habe. Ganz unten in dem main-Abschnitt wird über alle gerade laufenden Prozesse iteriert. Für jeden Prozess wird ein PROCESSENTRY32-struct zurückgegeben. Dieses enthält neben der PID auch den Namen (ich glaube th32ProcessID und szExeFile sind das).

Der richtige Einstieg für dieses Thema in der Win32-API ist hier: http://msdn.microsoft.com/en-us/library ... s.85).aspx

Viele Grüße
lunar

@JamesBond700: Und wieso müssen x-beliebige Spieler dazu Prozesse auf Deinem Server ausführen können?
JamesBond700
User
Beiträge: 8
Registriert: Sonntag 29. Januar 2012, 23:14

lunar hat geschrieben:@JamesBond700: Und wieso müssen x-beliebige Spieler dazu Prozesse auf Deinem Server ausführen können?
Ich glaube du hast mich falsch verstanden. Der Client überprüft ob auf dem PC des Anwenders irgendwelche Hacks etc. gestartet sind, und soll sie dann schließen. Der Client ist in Python 2.2 geschrieben. Habe gerade probiert pywin zu importieren, jedoch scheint das in dem Client nicht zu funtkionieren. Werde auf die Suche nach der PID auf andere Mittel zurückgreifen müssen. Wer hat noch eine Idee?

Lg
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@JamesBond700:
Wie willst Du verhindern, dass der Code im Client, der sich um Prozesserkennung und -beendigung der "Hacks" kümmert, einfach auskommentiert wird? Desweiteren ist die Namenserkennung durch Umbenennen der .exe sehr einfach zu umgehen. Über ein Speicherabbild des laufenden "smelly" Prozesses kannst Du auch nicht ohne weiteres gehen, dafür bräuchtest Du Ring0-Zugriff.

Wie sehen diese "Hacks" den aus, bzw. über welche Mechanismen wird das Spiel manipuliert?
JamesBond700
User
Beiträge: 8
Registriert: Sonntag 29. Januar 2012, 23:14

Der Python Code ist in verschlüsselten Datein verpackt, welche mit einem besonderen Code verschlüsselt sind, welcher nur mir bekannt ist. Sprich: Niemand kann den Code verändern. Die Hacks werden über .dll injection geladen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

JamesBond700 hat geschrieben:Der Python Code ist in verschlüsselten Datein verpackt, welche mit einem besonderen Code verschlüsselt sind, welcher nur mir bekannt ist. Sprich: Niemand kann den Code verändern. Die Hacks werden über .dll injection geladen.
Und wie werden diese Dateien dann ausgeführt? :K Ich meine, wenn nur Du sie entschlüsseln kannst, dann können sie ja auch nur bei Dir laufen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
JamesBond700
User
Beiträge: 8
Registriert: Sonntag 29. Januar 2012, 23:14

Der sogenannte Xtea-Code zum Entschlüsseln der Archive ist natürlich auch in der .exe zum Starten des Spiels eingetragen. Diese ist jedoch gecryptet, und es ist nahezu unmöglich den Xtea-Code rauszulesen. Ob ein Schutz vor Hacks Clientside Sinn macht... Darüber kann man streiten, aber versuchen kann man es. Also hat jetzt noch jemand eine Idee für das Herausfinden der PID über den Prozessnamen?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

JamesBond700 hat geschrieben:Der sogenannte Xtea-Code zum Entschlüsseln der Archive ist natürlich auch in der .exe zum Starten des Spiels eingetragen. Diese ist jedoch gecryptet, und es ist nahezu unmöglich den Xtea-Code rauszulesen.
Warum glaubst Du, dass das nahezu unmöglich ist, wenn der Rechner das doch sowieso bei jeder Programmausführung machen muss, um den Pythoncode ausführen zu können? Ich will nicht schon wieder eine Diskussion um vermeintliche Sicherheit anzetteln, allerdings ist sowas softwarebasiert nicht zunagelbar, da die Zustände sehr leicht auslesbar sind. Mit einem Hardware-Schlüssel sähe das schon anders aus - die wenigsten würden sich wohl die Mühe machen, ein IC vom Board löten und durchmessen zu wollen.
JamesBond700 hat geschrieben:Also hat jetzt noch jemand eine Idee für das Herausfinden der PID über den Prozessnamen?
Das geht nicht direkt mit der Win-API, Du kannst Dir aber alle Prozesse, für die Du genügend Rechte besitzt, holen und nach dem entsprechenden Namen durchsuchen. Nur frag ich mich, was Dir das bringt, Du müssest doch eher am Spieleprozess nach verdächtigen Symbolen/Bibliothekshandles suchen, wenn die über .dll-Injektion kommen.
JamesBond700
User
Beiträge: 8
Registriert: Sonntag 29. Januar 2012, 23:14

JamesBond700 hat geschrieben:Also hat jetzt noch jemand eine Idee für das Herausfinden der PID über den Prozessnamen?
Das geht nicht direkt mit der Win-API, Du kannst Dir aber alle Prozesse, für die Du genügend Rechte besitzt, holen und nach dem entsprechenden Namen durchsuchen. Nur frag ich mich, was Dir das bringt, Du müssest doch eher am Spieleprozess nach verdächtigen Symbolen/Bibliothekshandles suchen, wenn die über .dll-Injektion kommen.[/quote]
Du hast recht. Habe gerade geschaut, die Bots/Hacks haben dann logischerweise keinen eigenen Prozess, und werden nicht unter Prozess angezeigt. Jedoch steht unter Anwendungen ihr der Name des Hacks. Ich könnte nach dem Namen suchen, und wenn der Name gefunden wurde ein Boolean zurückgeben, und anschließend das gesamte Spiel schließen lassen. Ist es möglich, nach Anwedungsanmen zu suchen?

Lg
lunar

@JamesBond700: Kannst Du dieses Problem nicht dadurch lösen, dass Du Nutzer, die Bots verwenden, einfach aussperrst? Technisch kannst Du das ohnehin nicht so lösen, dass nicht ein fähiger Nutzer drum herum käme.
JamesBond700
User
Beiträge: 8
Registriert: Sonntag 29. Januar 2012, 23:14

Der Bot ist nicht wirklich erkennbar, und ich kann nicht einfach auf Verdacht irgendwelche Leute bannen...
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Codeobfuscation, Speicherüberwachung etc. taugen zwar, den direkten Angriff auf den Clientprozess zu erschweren, nur nützt das reichlich wenig gegen Bots, da die Skriptkiddies einfach eine Ebene höher gehen und Tastatur/Mouseevents simulieren können. Wahrscheinlich bis Du besser beraten, nach Verhaltenspattern zu suchen, um wenigstens die allzu offensichtlichen (schlechten) Bots zu erfassen. Richtig gute Bots wirst Du nicht entlarven können, da die Verwechslungsgefahr mit einem unbedarften Spieler hoch ist.
Antworten