[Hack-Competition] Make a Hack for my Program

03/05/2011 17:33 dj-torrent1#91
einfach t-search (funktioniert), artmoney (billigprogramm funktioniert aber^^) benutzen!

beide programme werden nicht erkannt von deinem programm nur cheatengine wird erkannt^^ ... naja mit t-search adresse finden und dann kann man ganz easy pointer finden und nen hack draus machen ^^
03/05/2011 18:20 Kaktusfresser#92
Na dann mach mal! Sowie ich das sehe ändern sich die Adressen iwie...
03/05/2011 21:04 MrSm!th#93
Quote:
Originally Posted by Kaktusfresser View Post
Na dann mach mal! Sowie ich das sehe ändern sich die Adressen iwie...
dann kann das höchstens an .NET liegen und selbst da müsste es irgendwo nen basepointer geben.
die adresse eines wertes kann sich nicht ändern, auch wenn es sich um einen pointer handelt, dann ist der eben nicht veränderbar.
irgendwo muss ja gespeichert sein, wo sich der wert befindet, also muss es irgendwo auch immer eine statische base geben.

Quote:
Ich möchte zur Sicherheit lieber nochmal fragen obs stimmt, wenn nein versuch ich nochmal ranzugehen:
Hast du den Rijndael-Algorithmus zum verschlüsseln der Value genutzt?
Wenn ja, dann kann man meiner Meinung nach nix tun, selbst wenn man die Adresse des Rijndael-verschlüsselten Strings findet. Ich hab mal gelesen, dass man bei einer Schlüssellänge von 128 bit ein paar Milliarden Jährchen zum Brute-Forcen bräuchte^^
lol wozu bitte BF? wenn die zahl verschlüsselt ist, muss der key und der iv auch irgendwo im code sein.

@Infinite:

Wie schon gesagt wurde, wie du die Zahl darstellst ist egal, im Speicher ists eh binär, von daher macht das keinen Unterschied.
Und nein, wenn du die Kommunikation zwischen Server und Client so beeinflussen kannst, dass der Server Dinge für dich tut, die eigentlich nicht möglich sein sollen, dann ist er schlecht programmiert.
Denn dann hört der Server in gewisser Maßen auf den Client und damit wäre es auch per CE möglich, denn das was gesendet wird, muss ja auch irgendwo im Speicher sein.
Sobald das ändern von Werten (ich betone das Ändern! Klar, doch mehrmaliges Senden von Packets kann man in manchen Spielen Shops usw. exploiten, aber das meine ich nicht) per CE keine sichtbare Veränderung für andere oder auf dem Server nach sich zieht, würde die gleiche Änderung per Packet genau so wenig bringen.

@TE:

wenn dich jemand auf einen fehler hinweist, solltest du das dankend annehmen und ihn nicht aus deinem thread verweisen, nur weil er einen fehler bei dir erkennt.
und disassemblieren ist nunmal nicht gleich decompilen!
03/06/2011 00:19 Mi4uric3#94
Quote:
Originally Posted by dj-torrent1 View Post
einfach t-search (funktioniert), artmoney (billigprogramm funktioniert aber^^) benutzen!

beide programme werden nicht erkannt von deinem programm nur cheatengine wird erkannt^^ ... naja mit t-search adresse finden und dann kann man ganz easy pointer finden und nen hack draus machen ^^
Eigentlich ist ein Schutz gegen die beiden drin, jedoch scheint er nicht so ganz zu funktionieren..
*Update* xd

Quote:
Originally Posted by MrSm!th View Post
Disassemblieren ist nunmal nicht gleich decompilen!
Wenn er so ein Vollprofi ist, hätte er mir den Begriff ja auch einfach sagen können.
03/06/2011 12:20 xNopex#95
CheatEngine-Protection Patch:
Code:
#include <windows.h>

BOOL PatchEnumChildWindows()
{
    HMODULE user32Dll = GetModuleHandle( "User32.dll" );
    if( user32Dll == NULL )
        return FALSE;

    BYTE* adrEnumChildWindows = ( BYTE* )( GetProcAddress( user32Dll, "EnumChildWindows" ) );
    if( adrEnumChildWindows == NULL )
        return FALSE;

    DWORD dwOld = 0;
    VirtualProtect( adrEnumChildWindows, 3, PAGE_EXECUTE_READWRITE, &dwOld );
    adrEnumChildWindows[0] = 0xC2;
    adrEnumChildWindows[1] = 0x10;
    adrEnumChildWindows[2] = 0x00;

    return TRUE;
}

DWORD WINAPI MainThread( LPVOID lpParam )
{
    if( ! PatchEnumChildWindows() )
    {
        OutputDebugString( "PatchEnumChildWindows fehlgeschlagen" );
        return 0;
    }
    OutputDebugString( "PatchEnumChildWindows erfolgreich" );

    return 0;
}

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
    if( fdwReason == DLL_PROCESS_ATTACH )
    {
        if( CreateThread( NULL, 0, MainThread, NULL, 0, NULL ) != NULL )
            OutputDebugString( "MainThread wurde erstellt" );
        else
            OutputDebugString( "MainThread wurde nicht erstellt" );
    }

    return TRUE;
}
Jetzt könnte man weiter mit CE arbeiten.
03/06/2011 21:05 Mi4uric3#96
Quote:
Originally Posted by xNopex View Post
CheatEngine-Protection Patch:
Code:
#include <windows.h>

BOOL PatchEnumChildWindows()
{
    HMODULE user32Dll = GetModuleHandle( "User32.dll" );
    if( user32Dll == NULL )
        return FALSE;

    BYTE* adrEnumChildWindows = ( BYTE* )( GetProcAddress( user32Dll, "EnumChildWindows" ) );
    if( adrEnumChildWindows == NULL )
        return FALSE;

    DWORD dwOld = 0;
    VirtualProtect( adrEnumChildWindows, 3, PAGE_EXECUTE_READWRITE, &dwOld );
    adrEnumChildWindows[0] = 0xC2;
    adrEnumChildWindows[1] = 0x10;
    adrEnumChildWindows[2] = 0x00;

    return TRUE;
}

DWORD WINAPI MainThread( LPVOID lpParam )
{
    if( ! PatchEnumChildWindows() )
    {
        OutputDebugString( "PatchEnumChildWindows fehlgeschlagen" );
        return 0;
    }
    OutputDebugString( "PatchEnumChildWindows erfolgreich" );

    return 0;
}

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
    if( fdwReason == DLL_PROCESS_ATTACH )
    {
        if( CreateThread( NULL, 0, MainThread, NULL, 0, NULL ) != NULL )
            OutputDebugString( "MainThread wurde erstellt" );
        else
            OutputDebugString( "MainThread wurde nicht erstellt" );
    }

    return TRUE;
}
Jetzt könnte man weiter mit CE arbeiten.
Was bewirkt die "VirtualProtect" Funktion genau?
03/06/2011 21:34 xNopex#97
MSDN:
Quote:
VirtualProtect Function

Changes the protection on a region of committed pages in the virtual address space of the calling process.
Sprich:
Dadurch erlaubt mir Windows, dass ich den Speicher, in dem der Programmcode liegt, verändern darf.
03/06/2011 21:43 Mi4uric3#98
Quote:
Originally Posted by xNopex View Post
Sprich:
Dadurch erlaubt mir Windows, dass ich den Speicher, in dem der Programmcode liegt, verändern darf.
Änderst du damit Berechtigungen meines Programms, oder änderst du Speicher meines Programms, oder änderst du Speicher von Cheat Engine?
03/06/2011 21:48 xNopex#99
Ich patche die "EnumChildWindows" - Funktion aus der user32.dll, die du wahrscheinlich importiert hast, um die Fenster durchzuenumerieren, um zu schauen, ob CE offen ist. Also verändere ich letztendlich den Speicher deines Programmes.
03/06/2011 21:59 Mi4uric3#100
Quote:
Originally Posted by xNopex View Post
Ich patche die "EnumChildWindows" - Funktion aus der user32.dll, die du wahrscheinlich importiert hast, um die Fenster durchzuenumerieren, um zu schauen, ob CE offen ist. Also verändere ich letztendlich den Speicher deines Programmes.
Jap "EnumChildWindows" wird verwendet :p
Okay, ich verstehe nicht ganz, was "VirtualProtect" macht, und wie du den Rückgabewert irgendwie verändern kannst, aber ich probier mich mal dranzusetzen..

Ist das die Modifikation?:
Code:
adrEnumChildWindows[0] = 0xC2;
adrEnumChildWindows[1] = 0x10;
adrEnumChildWindows[2] = 0x00;
Bedeutet das, dass du die ersten 3 Rückgabebytes veränderst?
03/06/2011 22:04 xNopex#101
Ich hole mir die Adresse der Funktion. Dann überschreibe ich das erste Byte der Funktion mit dem Opcode für den Return Befehl (=0xC2). Die nächsten zwei bytes (=Word) sind die Returnvalue und damit der Operandenteil. Die dürften beliebig wählbar sein, nur nicht 0, wenn ich jetzt nicht völlig falsch liege. Hab sie aus einem anderen Projekt einfach mal übernommen und getestet.
Ergebnis: Die EnumChildWindows - Funktion wird nach dem Call gleich wieder verlassen, ohne dass sie ausgeführt wurde. Damit failed deine Überprüfung und man kann CE wie gewohnt verwenden.
03/06/2011 22:10 Mi4uric3#102
Quote:
Originally Posted by xNopex View Post
Ich hole mir die Adresse der Funktion. Dann überschreibe ich das erste Byte der Funktion mit dem Opcode für den Return Befehl (=0xC2). Die nächsten zwei bytes (=Word) sind die Returnvalue und damit der Operandenteil. Die dürften beliebig wählbar sein, nur nicht 0, wenn ich jetzt nicht völlig falsch liege. Hab sie aus einem anderen Projekt einfach mal übernommen und getestet.
Ergebnis: Die EnumChildWindows - Funktion wird nach dem Call gleich wieder verlassen, ohne dass sie ausgeführt wurde. Damit failed deine Überprüfung und man kann CE wie gewohnt verwenden.
:D Kool >:|
Evil ^^
Aber ist dann ja leicht zu detecten..
03/06/2011 22:13 xNopex#103
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...
03/06/2011 22:24 MrSm!th#104
Quote:
Originally Posted by xNopex View Post
Ich hole mir die Adresse der Funktion. Dann überschreibe ich das erste Byte der Funktion mit dem Opcode für den Return Befehl (=0xC2). Die nächsten zwei bytes (=Word) sind die Returnvalue und damit der Operandenteil. Die dürften beliebig wählbar sein, nur nicht 0, wenn ich jetzt nicht völlig falsch liege. Hab sie aus einem anderen Projekt einfach mal übernommen und getestet.
Ergebnis: Die EnumChildWindows - Funktion wird nach dem Call gleich wieder verlassen, ohne dass sie ausgeführt wurde. Damit failed deine Überprüfung und man kann CE wie gewohnt verwenden.
Nun, also eigentlich sind Operanden für return, wenn man sie denn angibt, nicht der Rückgabewert der Funktion, sondern die Anzahl an Bytes, um die der Stackpointer wieder zurückgeschaltet werden soll, also quasi die Freigabe von für die lokalen Variablen und Parameter alloziiertem Speicher.

Quote:
Originally Posted by Mi4uric3 View Post
:D Kool >:|
Evil ^^
Aber ist dann ja leicht zu detecten..
Meinst du das Verändern der Funktion damit? Ja ist es, genau so leicht ist es aber auch, andere Varianten zu wählen.
Die Aufzählung von Prozessen und/oder Fenstern ist immer eine schlechte Methode zur Detection von Hacks!
03/06/2011 22:41 Mi4uric3#105
Quote:
Originally Posted by MrSm!th View Post
Nun, also eigentlich sind Operanden für return, wenn man sie denn angibt, nicht der Rückgabewert der Funktion, sondern die Anzahl an Bytes, um die der Stackpointer wieder zurückgeschaltet werden soll, also quasi die Freigabe von für die lokalen Variablen und Parameter alloziiertem Speicher.
Ja dann muss ich nur die ersten Bytes dieser Funktion überprüfen..
Oder einfach gucken ob immer "0" dabei rauskommt..

Quote:
Originally Posted by MrSm!th View Post
Meinst du das Verändern der Funktion damit? Ja ist es, genau so leicht ist es aber auch, andere Varianten zu wählen.
Die Aufzählung von Prozessen und/oder Fenstern ist immer eine schlechte Methode zur Detection von Hacks!
Ich arbeite mit der GetClassName-Funktion, damit kann man Programme leicht detecten, und das ist auch recht kompliziert (glaube ich.. oO) den Klassen-Namen zu verändern..
Aber du hast recht, da es scheinbar so einfach ist, Rückgabewerte zu manipulieren (0) ist die Methode im großen und ganzen schlecht.

Ich hab nur ein paar Idee(e)n (3 e? :D)..
Aber dabei muss ich immer eine Prozessliste erstellen..
Wie soll ich sonst wissen, welche Prozesse laufen.. :/
Obwohl ich grad noch eine Idee bekomme, wie ich mein Programm schützen kann, ohne eine Prozessliste erstellen zu müssen..
Aber das hätte globale (PC weite) Auswirkungen.. :/