[Hack-Competition] Make a Hack for my Program

03/07/2011 08:03 Kaktusfresser#106
Bypass?Patch? Wozu das, wenn man die COMODO Firewall nutzt :p
Interprocess Memory Access? Verbieten^^
Physical Memory Access? Nö!
Window Messages? Erst recht nich!
Dann noch Cheat Engine als Protected Application hinzufügen und dein Programm meint nixmehr zu CE^^
Edit: merke grade, die x64 Edition von Cheat Engine 6 wird sowieso nicht detected^^ xD
03/07/2011 11:13 Mi4uric3#107
Quote:
Originally Posted by Kaktusfresser View Post
Bypass?Patch? Wozu das, wenn man die COMODO Firewall nutzt :p
Interprocess Memory Access? Verbieten^^
Physical Memory Access? Nö!
Window Messages? Erst recht nich!
Dann noch Cheat Engine als Protected Application hinzufügen und dein Programm meint nixmehr zu CE^^
Edit: merke grade, die x64 Edition von Cheat Engine 6 wird sowieso nicht detected^^ xD
Ich glaub, dass die Detection-Routine in v1.2 noch garnicht funktioniert, weil sie in einem externen Thread läuft, und da iwie nur ganz wenige Prozesse finden kann.
Ich weiß nur leider nicht, wieso..
03/07/2011 13:08 MrSm!th#108
Dass die Funktion immer 0 zurück gibt, stimmt ja nicht ganz, sie returnt einfach, d.h. es wird der Wert, der als letztes im eax register war, als Rückgabewert interpretiert.
Wenn man die Funktion hooken würde, ließe sich noch einiges mehr machen.
Erste Bytes prüfen? Klar, nur gibts zig Methoden zum Hooken, es wäre nicht wirklich effektiv.

Was die Klasse angeht: Meines Wissens gibt man den Namen der Klasse bei der Fenstererstellung an.
Außerdem lassen sich die Funktionen zum Auslesen der Klasse usw. auch leicht hooken.

Wie du es machen sollst? Wie man bei zahlreichen Anti-Cheat Programmen sieht: offline fast unmöglich.
Du könntest einen Treiber laden, der den Zugriff auf deinen Prozess verbietet und der über die Nutzung von bestimmten Api Funktionen wie WriteProcessMemory Hacks erkennt.
Zusätzlich noch Checksums vom Speicher und Dll Injection Erkennung.
Und trotzdem ließe sich all das noch relativ leicht bypassen, solange nichts von einem Server überprüft wird.

Das beste ist es immernoch, möglichst viel vom Server verwalten zu lassen und solche Dinge wie du es schon hast (obfuscation durch komplizierte berechnungen) einzubauen.
03/07/2011 13:23 Mi4uric3#109
Ouh ich glaub nicht, dass man mit .NET Treiber bauen kann..
ICH jedenfalls nicht :D
Aber das wäre natürlich ein wenig sicherer.
Meine Idee war so ähnlich..
1. Überprüfen, welche DLLs in dem Prozess sind
2. Globales Read-/Writememory Hooking
03/07/2011 17:54 MrSm!th#110
Quote:
Originally Posted by Mi4uric3 View Post
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.
03/08/2011 18:40 .Infinite#111
Äham....


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





Quote:
(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.
03/08/2011 22:08 MrSm!th#112
Das Problem daran ist ja, dass var hier eine globale Variable ist und dementsprechend geändert werden kann.
Und da du sie auch direkt so, wie sie im Speicher ist, auf dem Label anzeigen lässt, wäre es auch nicht schwer, danach zu suchen.
03/09/2011 00:16 Mi4uric3#113
Ich muss nurnoch herausfinden, wie ich den eigenen Memory überprüfen kann ohne readprocessmemory...
Aber sicherheitshashes hin oder her..
Einen funktionierenden Hack hat noch niemand gemacht :d
03/09/2011 00:42 MrSm!th#114
Mir fehlt die Motivation :P

Wieso RPM? Ist doch dein eigener Adressebereich. Du kannst ganz einfach auf den Speicher zugreifen.
In C++ sowieso und in C# müsste dass doch über das unsafe (oder war es unmanaged?) keyword gehen, damit man Pointerarithmetik anwenden kann.
RPM ist ja Blödsinn für den eigenen Speicher.

Allerdings hast du dir da echt die falsche Sprache ausgesucht, für gute (so gut es offline eben geht) Schutzmechnismen muss man tief ins Windows System eingreifen, vor allem in die NtApi, da ist das Überprüfen des eigenen Speichers über Pointer das geringste Problem, was ja wie gesagt, deutlich einfacher in einer nativen Sprache wäre ;O
03/09/2011 00:55 tim66613#115
Quote:
Originally Posted by MrSm!th View Post
Mir fehlt die Motivation :P

Wieso RPM? Ist doch dein eigener Adressebereich. Du kannst ganz einfach auf den Speicher zugreifen.
In C++ sowieso und in C# müsste dass doch über das unsafe (oder war es unmanaged?) keyword gehen, damit man Pointerarithmetik anwenden kann.
RPM ist ja Blödsinn für den eigenen Speicher.

Allerdings hast du dir da echt die falsche Sprache ausgesucht, für gute (so gut es offline eben geht) Schutzmechnismen muss man tief ins Windows System eingreifen, vor allem in die NtApi, da ist das Überprüfen des eigenen Speichers über Pointer das geringste Problem, was ja wie gesagt, deutlich einfacher in einer nativen Sprache wäre ;O
Ja, aber da hat er das Problem mit Segmention faults, falls die Page freigegeben oder nur reserved ist.
(Ich weiß jetzt nicht ob man in .NET Sprachen SEHs verwenden kann.)
Aber um ohne SEHs eine SIGSEGV zu vermeiden müsste er IsBadReadPtr oder VirtualQuery verwenden.

Mit RPM hat er dieses Problem nicht.

(Wenn er aber weiß, dass die Adresse valid ist, kann er natürlich memcpy & co. verwenden).

edit: Für .NET wohl eher RtlMoveMemory.

Kind Regards Tim
03/09/2011 01:02 MrSm!th#116
Quote:
(Wenn er aber weiß, dass die Adresse valid ist, kann er natürlich memcpy & co. verwenden).
Das gibts in C#? Achso, wusste nicht, dass man in ner managed Sprache so nen rohen Speicherzugriff vornehmen kann, außer durch dieses unmanaged keyword^^

Eventuell wäre es auch möglich, mithilfe einer Dll, die in einer nativen Sprache geschrieben wurde, die nötigen Funktionen bereitzustellen, die könnte ihm ja ein netter Anti-Cheat Begeisterter Programmierer bereitstellen :D
03/09/2011 16:14 Mi4uric3#117
Okay ich merke, dass mir der Stoff ein bisschen zu tief gräbt
Dazu bin ich glaub ich noch nicht fortgeschritten genug...
03/09/2011 20:46 bvz#118
Quote:
Originally Posted by xNopex View Post
Wenn du mir erklären würdest, wie dein "Anti-Cheat" Zeug funktioniert, könnte ich es auch leicht "detecten"/aushebeln o,ô bzw. wenn du mir den src geben würdest... Ohne Möglichkeit zu debuggen ist das schon lustig gemeint...
Besorg dir nen Reflektor
03/09/2011 23:13 xNopex#119
@Vorposter:
Wenn ich unqualifizierten Müll lesen will, schau ich mir meine Beiträge-History an. Auf solche Tipps kann ich gerne verzichten. Die Antwort passt weder in den Kontext des Gesprächs, noch ist sie auf irgendeine Art sinnvoll. Beides wüsstest du, wenn du dir den gesamten Thread durchgelesen hättest, bzw. dich auch nur Sekunden mit der Problematik auseinandergesetzt hättest.
04/18/2011 20:47 PANDA1998#120
boah immer diese scheis noobs mit ihren Trojanern!Alda ihr könnt mich mal alle am arsch lecken!