Entwickler-Ecke

Windows API - Kann man ReadProcessMemory rausfinden?


Aya - Di 13.03.12 17:33
Titel: Kann man ReadProcessMemory rausfinden?
Hi,

mein Chef ist zur Zeit auf dem Trip das er alle erdenklichen Angriffe gegen unsere Software verhindern möchte..
Ob das bei unserer Software sinn macht oder nicht sei mal dahin gestellt, aber bei einem Thema würde es mich auch Interessieren.

Es gibt ja die Möglichkeit via ReadProcessMemory() den RAM auszulesen.
Wenn nun ein fremdes Programm den Speicher von meinem Programm ausliest, kann ich das irgendwie mitbekommen?

Die einzige Lösung die mir einfallen würde, wäre das ich die ReadProcessMemory-Funktion Hooke und überprüfe ob auf meinen Process zugegriffen wird - aber, geht das so ohne weiteres?

Oder gibt es noch andere Wege?

Das ganze ist deswegen Interessant da ich ja auch an Spielen bastle in meiner Freizeit und gewisse Werte würde ich um sie vor Cheaten zu schützen versuchen besser zu verpacken als sie einfach stupide in ne Variable zu packen. Wenn man das Cheaten über ReadProcessMemory aber einfach verhindern könnte indem man einfach das spiel beendet wenn es jemand versucht, wäre auch praktisch :)

Aya~


Moderiert von user profile iconNarses: Topic aus Off Topic verschoben am Di 13.03.2012 um 17:06


bummi - Di 13.03.12 20:25

gegf. Hookst Du eine bereits gehookte Funktion ... ich glaube nicht dass Du aus Deiner Software eine Sicherheit herstellen kannst....


Aya - Mi 14.03.12 12:03

Aber selbst wenn ich eine gehookte Funktion hooke macht das ja nix, oder?

Also ich bekomme so oder so in jedem Falle ja dann mit das die Funktion aufgerufen wurde, auch wenn da noch andere 5 Hooks mit zwischen hängen. .. oder?


bummi - Mi 14.03.12 12:09

ich meinte den Fall dass der böse Prozess bereits die Funktion gehookt hat, er kann dann aufrufen ohne dass Du es mitbekommst ...


Aya - Mi 14.03.12 12:41

Kann er?

Sagen wir der böse Prozess ist "A" und mein Prozess ist "B".

Wenn jetzt A den Hook vor B setzt, dann ist doch die Aufruf Reihenfolge folgende:


Quelltext
1:
ReadProcessMemory() -> A -> B -> Original Funktion                    


Wenn ich es zuerst Hooke:


Quelltext
1:
ReadProcessMemory() -> B -> A -> Original Funktion                    


Oder kann in dem ersten Fall A irgendwie verhindern das der Hook B noch aufgerufen wird?

Aya~


bummi - Mi 14.03.12 16:36

Ich hätte es zumindest so verstanden ...

http://assarbad.net/stuff/tutorials/hooks/hook_tutorial.pdf
8/20


uall@ogc - Mi 14.03.12 21:24

Es kommt doch ganz drauf an was du für einen Hook setzt, es gibt da ziemlich viele verschiedene Möglichkeiten:

Import-Table
Export-Table
Relocation
PageGuard und Exception Handler
Code Overwriting
SSDT

Selbst im Usermode wirst du es nicht unterbinden können, da immer der Syscall/Sysenter/int21, also der Sprung zur entsprechenden Kernelfunktion direkt aufgerufen werden kann.
z.B. für ReadProcessMemory:

DeinProgramm -> kernel32.ReadProcessMemory -> ntdll.ZwReadVirtualMemory -> Eintrag $3C in der SSDT

Um generell zu überprüfen ob jemand was bei deinem Programm ausliest: Schütze deinen Speicher mit VirtualProtect und entzieh die Read-Rechte (dann schlägt ReadProcessMemory fehl). Man kann zwar wieder mit VirtualProtectEx den Speicherbereich ändern, aber das könntest du u.U. durch pollen mitbekommen. Zusätzlich gibt es verschiedene Möglichkeiten mit denen du das Öffnen des Handles verbieten kannst.

Wenn du von einem anderen Usermode Programm verbieten willst auf deinen Speicherbereich zuzugreifen -> schreib dir nen Treiber und hooke SSDT Eintrag -> das machen die Virenscanner genau so.