|
You last visited: Today at 23:09
Advertisement
[Hack-Competition] Make a Hack for my Program
Discussion on [Hack-Competition] Make a Hack for my Program within the General Coding forum part of the Coders Den category.
03/07/2011, 08:03
|
#106
|
elite*gold: 0
Join Date: May 2010
Posts: 19
Received Thanks: 3
|
Bypass?Patch? Wozu das, wenn man die COMODO Firewall nutzt 
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
|
#107
|
elite*gold: 405
Join Date: Dec 2007
Posts: 6,615
Received Thanks: 6,358
|
Quote:
Originally Posted by Kaktusfresser
Bypass?Patch? Wozu das, wenn man die COMODO Firewall nutzt 
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
|
#108
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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
|
#109
|
elite*gold: 405
Join Date: Dec 2007
Posts: 6,615
Received Thanks: 6,358
|
Ouh ich glaub nicht, dass man mit .NET Treiber bauen kann..
ICH jedenfalls nicht 
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
|
#110
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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.
|
|
|
03/08/2011, 18:40
|
#111
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
Ä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:
Originally Posted by .Infinite
PHP Code:
$GUI=GUICreate("test", 200, 150, -1, -1)
$label=GUICtrlCreateLabel("", 80, 20, 22, 15)
$button_up=GUICtrlCreateButton("Up", 75, 80, 30, 22)
GUISetState()
$var=100
$factor=17
$secure_var=$var*$factor
GUICtrlSetData($label, $var)
While 1
If GUIGetMsg()=$button_up Then
$secure_var+=$factor
$var=$secure_var/$factor
GUICtrlSetData($label, $var)
EndIf
anti_hack()
WEnd
Func anti_hack()
If $var <> $secure_var/$factor Then
MsgBox(0, "ERROR", "Hack detected!")
Exit
EndIf
EndFunc
|
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.
|
Quote:
Originally Posted by .Infinite
PHP Code:
#include <Crypt.au3>
$GUI=GUICreate("test", 200, 150, -1, -1)
$label=GUICtrlCreateLabel("", 80, 20, 22, 15)
$button_up=GUICtrlCreateButton("Up", 75, 80, 30, 22)
GUISetState()
$var=100
$factor=Random(10000, 99999, 1)
$hash=_Crypt_HashData($var*$factor, $CALG_MD5)
GUICtrlSetData($label, $var)
While 1
If GUIGetMsg()=$button_up Then
$var+=1
$factor=Random(100, 999, 1)
$hash=_Crypt_HashData($var*$factor, $CALG_MD5)
GUICtrlSetData($label, $var)
EndIf
If _Crypt_HashData($var*$factor, $CALG_MD5) <> $hash Then
MsgBox(0, "ERROR", "Hack detected")
Exit
EndIf
WEnd
|
|
|
|
03/08/2011, 22:08
|
#112
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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
|
#113
|
elite*gold: 405
Join Date: Dec 2007
Posts: 6,615
Received Thanks: 6,358
|
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
|
#114
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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
|
#115
|
elite*gold: 577
Join Date: Oct 2009
Posts: 665
Received Thanks: 3,502
|
Quote:
Originally Posted by MrSm!th
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
|
#116
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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
|
|
|
03/09/2011, 16:14
|
#117
|
elite*gold: 405
Join Date: Dec 2007
Posts: 6,615
Received Thanks: 6,358
|
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
|
#118
|
elite*gold: 0
Join Date: Nov 2010
Posts: 260
Received Thanks: 266
|
Quote:
Originally Posted by xNopex
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
|
#119
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
@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
|
#120
|
elite*gold: 0
Join Date: Aug 2009
Posts: 44
Received Thanks: 1
|
boah immer diese scheis noobs mit ihren Trojanern!Alda ihr könnt mich mal alle am ***** lecken!
|
|
|
All times are GMT +1. The time now is 23:09.
|
|