Quote:
Originally Posted by Mi4uric3
2. Globales Read-/Writememory Hooking
|
Welches eben am einfachsten via Kernelmode ist.
Ich empfehle dir trotzdem noch Checksums/Hashes der Code Section, sodass Codepatches schwieriger werden und, wenn es schon nicht offline ist, noch ein paar mehr Checkvalues für den Wert, der verändert werden soll.
Die Berechnungen sind wie gesagt schonmal ein guter Ansatz.
Wenn du global R/WPM und OpenProcess hookst, kannst du auf die Prozessenumeration verzichten, verbraucht nur unnötig Resourcen und ist eh unsicher.
Wenn du schon Prozesse auflisten willst, kannst du es mit einer sichereren Methode probieren:
Statt Aufzählen von Fentsern oder der unsicheren EnumProcesses Api kannst du auch mithilfe von NT Api Funktionen die EnumProcesses nachbauen.
Ich weiß nicht mehr genau, wie es aufgebaut ist, jedenfalls war die NtQuerySystemInformation mit einbezogen, mit der alle laufenden Prozesse ausgelesen werden können.
Ich hab auch mal davon gehört, dass man mit csrss.exe an die laufenden Prozesse kommen kann, weiß aber nichts genauers dazu.
Verzichte jedenfalls auf offensichtliche Apis wie EnumProcesses, EnumProcessModules, EnumWindows, FindWindow, IsDebuggerPresent, usw.
Was btw. eine nette Idee für deinen Check wäre:
Ein Checkvalue der in irgendeiner mathematischen Abhängigkeit zum richtigen Wert steht. Ein Hash von beiden muss immer gleich sein (klingt etwas komisch formuliert, ich weiß. Ich meine damit, wenn man die beiden in irgendeiner Form verbindet (simple Multiplikation oder irgendetwas komplizierteres) muss immer das gleiche Ergebnis herauskommen (dementsprechend wird natürlich der Checkvalue immer akualisiert, wenn der richtige mit dem Button verändert wird), sodass auch immer der gleiche Hash herauskommt).
Ein Hash deswegen, damit es für Reverser schwieriger wird, die Abhängigkeiten nachzuvollziehen, wenn sie beim Check nur irgendwelche Hashes vorfinden.
Damit der von lolkop1 angesprochen Performanceverlust nicht eintritt, könnte man diesen Check nur jede Sekunde o.Ä. durchführen.