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
Narses: 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~
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!