Hast du Skype oder ähnliches, wo man schnell schreiben kann? Oder Steam.
Mac Limit umgehen
-
-
-
Anscheindend wurde die DLL wieder rausgenommen. Mit deren aktuellstem Patch wird die DLL nicht mehr geladen ...
-
Ich hab irgendwo was gelesen, dass sich Leute über das MAC Limit oder dessen Umgehung (?) beschwert haben. Ich meine das war auf elitepvpers.
-
-
Ich hab in deren Forum eine Anleitung zum Umgehen gefunden ... der helle Wahnsinn
http://forum.pioneer-sro.com/viewtopic.php?f=3&t=1427 -
Na toll
-
Hallo,
florian dar du es offensichtlich geschafft hast das HWID Limit auf Pioneer zu umgehen wollte ich mal fragen ob du das auch für nen andren Server machen kannst, bzw. mir sagen ob ich das einfach anpaasen könnte.Server:
http://www.play-onyx.com/ -
-
Hab grad mal reingeschaut,
ist die selbe 0815-Kacke wie vorher auch. Den Client-Side-Packet-Injection Kartoffel-Code von Drew copy&pasted und Themida drübergejagt. Selbst die Debugausgaben sind immernoch drin, man muss nur die Konsole anschalten (den EP ein paar Byte nach oben und CALL AllocConsole).
Runtime-Protection gibts wiedermal keine. Einmal Themida umgangen debuggts sich ganz angenehm.Security by Obscurity ... Ein Proof of Concept
Das größte Problem ist eher, das unter Windows 10 mein geliebtes OllyDBG nicht mehr so richtig wörkt.
Inzwischen kann das Ding auch Anti-VM, d.H. man kann nicht mehr auf einer virtuellen Maschine botten. Gelöst wurde das ganze per String-Vergleich auf Device- und BIOS-Namen. Nach Auffassung der Entwickler kommt hier aber nur VirtualBox in Frage, daher sollten alle anderen VM-Platformen weiterhin funktionieren. VirtualBox wird nach minimalen Änderungen ebenfalls funktionieren, wie man gleich sieht:
Code- /* Pseudo-code, sitze in der Bahn ... */
- int CheckSystemName(void) {
- int hEntry = 0;
- char* cValue;
- RegOpenKeyA(hEntry, HKLM, "SYSTEM/HARDWARE/DESC/BIOS");
- RegQueryValueExA( hEntry, cValue, "ProductName", ... );
- if (strncmp("VirtualBox",cValue, sizeof("VirtualBox")))
- return 1;
- return 0;
- }
- void UserOnWndProc() {
- if (Timerbla == abgelaufen) {
- if (CheckSystemName())
- return x;
- if (CheckSystemManufacturer())
- return x;
- if (CheckVideoCard())
- return x;
- if (CheckCDROM())
- return x;
- /* ... */
- }
- }
Die "Hardware-ID" selbst habe ich noch nicht genauer untersucht. Es findet sich im Handler des Timers ein auffällig riesiger Codeblock der entweder aus Copy&Paste oder aus Loop-unrolling (Optimierung des Compilers) entstanden ist. In meiner Boshaftigkeit unterstelle ich den Entwicklern gerne ersteres
Es sind ~ 16 Durchläufe die sich scheinbar mit einem String in 16 Byte Blöcken beschäftigen und danach nochmal einige Durchläufe auf die ich noch keine Lust hatte. Woher die Daten kommen, habe ich ebenfalls noch nicht untersucht. Aus dem VM-Check vermutlich nicht, der hat nur einen Rückgabewert über VM=true/false, alles andere scheint in den Funktionen zu bleiben.
Die kryptografische Funktion dahinter, wenn da überhaupt was krytografisch ist, zu reversen lohnt warscheinlich nur für einen Lacher
Während der DllMain erfolgt ein unbekannter Library-Call mit "C:\" als Parameter. Könnte wieder meine Lieblingsfunktion GetVolumeInformation(), die wir ja schon aus der Vorgängerversion kennen, sein.FUNFACT: Die DLL enthält einige male den String "Electus" aber exakt 0x den String "Onyx". Meines Wissens gehört die DLL doch zu einem Paket das man auf epvpers kaufen kann ... hat da etwa einer ... Recycling betrieben?
Gruß
florian0 -
Die dll checkt ein paar Registryeinträge, z.B. SystemManufacturer, BiosVersion, etc.
Darunter auch Registryeinträge von VMWare. Also wenn man VMWare installiert hat, dann kann man sich nicht einloggen.Einfachste Lösung wäre, die Registryeinträge bei jedem Start von SRO zu ändern. Hab ich auf einem anderen PServer schonmal softwareunterstützt gemacht, aber den Weg direkt über die dll zu gehen, indem man sie modifiziert, ist da eventuell angenehmer.
E: Das mit der VolumeID ist mir auch aufgefallen ;D
-
So ist es möglich?
-
-
ja, aber ob sich das ganze noch lohnt ist ne andere sache
-
Ja, ist möglich. Sogar gar nicht so schwer florian0 arbeitet schon daran. Er machts mindestens genausogut wie ich, also muss ich mich dann nicht extra ransetzen.
-
Obs sich lohnt sei mal dahingestellt Spaß machts (mir) auf alle Fälle:
Der Code für den Paketaufbau lässt sich in etwa so zusammenfassen:
Code- datenpaket = VolumeID_der_Platte + "--Electus--" + 33_random_zeichen;
- /* beginn unbekannter kram der absolut nichts tut */
- x = x;
- y = y;
- z = z;
- if (0 == 1)
- bullshit();
- /* ende unbekannter kram der absolut nichts tut */
- datenpaket = base64(base64(base64(base64(base64(base64(base64(base64(base64(base64(base64(datenpaket)))))))))));
- datenpaket += weitere_X_randomzeichen;
Das ganze lässt sich also tatsächlich wieder auf die VolumeID reduzieren. Leider geht nach meinem ersten Patch die Dll garnicht mehr ... schade. Ich schau morgen mal weiter.Gruß
florian0 -
-
Obs sich lohnt sei mal dahingestellt Spaß machts (mir) auf alle Fälle:
Der Code für den Paketaufbau lässt sich in etwa so zusammenfassen:
Code- datenpaket = VolumeID_der_Platte + "--Electus--" + 33_random_zeichen;
- /* beginn unbekannter kram der absolut nichts tut */
- x = x;
- y = y;
- z = z;
- if (0 == 1)
- bullshit();
- /* ende unbekannter kram der absolut nichts tut */
- datenpaket = base64(base64(base64(base64(base64(base64(base64(base64(base64(base64(base64(datenpaket)))))))))));
- datenpaket += weitere_X_randomzeichen;
Das ganze lässt sich also tatsächlich wieder auf die VolumeID reduzieren. Leider geht nach meinem ersten Patch die Dll garnicht mehr ... schade. Ich schau morgen mal weiter.
Gruß
florian0Könnte es sein, dass bei der .dll auch noch nach dem Hash eben jener .dll geschaut wird?
-
Ja, das tut die Dll dank Themida (die Schutz-Software außenrum) sowieso. Daher fällt eine gepatchte Dll sowieso raus, außer ich lerne übernacht Themida zu entpacken (etwa auf einem Level mit Sanskrit in 24h erlernen).
Ich hab die Dll geladen und einfach stumpf die gelesene VolumeID überschrieben, dann ändert sich die Checksumme der Dll nicht. Das hatte bei der simpleren Vorgängerversion auch geklappt (siehe ein paar Seiten vorher), nur hier anscheinend nicht. Keine Ahnung ob Themida da seine Finger im Spiel hatte, oder ob ich einfach nur zu blöd war
Edit: War zu blöd. Geht jetzt:
C: dllmain.c- /*
- * Written by florian0 for StageTwo.eu
- * Code and binary may be shared, modified and published as
- * long as this notice and the printf stays intact
- */
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <Windows.h>
- #define VOLUMEID_OFFSET 0x965C
- void execHook(void);
- BOOL WINAPI DllMain(HINSTANCE hModule, DWORD fdwReason, LPVOID lpReserved) {
- if (fdwReason == DLL_PROCESS_ATTACH) {
- execHook();
- }
- return TRUE;
- }
- void execHook(void) {
- HMODULE module;
- int* lpVolumeId;
- DWORD disk_serial;
- /* Create a fancy console */
- AllocConsole();
- freopen("CONOUT$", "w", stdout);
- /* Dont remove this :) */
- printf("Written by florian0 for stagetwo.eu - plis no stealerino\n");
- /* Get actual volume serial further checks */
- GetVolumeInformationA("C:\\", NULL, NULL, &disk_serial, NULL, NULL, NULL, NULL);
- printf("LDR> VolumeID of Drive C:\\ is 0x%08x\n", disk_serial);
- /* Load the Onyx.dll */
- printf("LDR> Loading Library ...\n");
- module = LoadLibrary("Onyx.dll");
- /* Check if anything went wrong */
- if (module == NULL) {
- perror("LDR> Could not load library :(");
- printf("LDR> Something went wrong. Better kill the client ... \n");
- exit(-1);
- } else {
- printf("LDR> Library loaded successfully!\n");
- }
- /* Setup the Pointer to the volume serial */
- lpVolumeId = (int*)(((int)module) + VOLUMEID_OFFSET);
- /* Check if the volume serial matches the serial read by GetVolumeInformation() */
- if (*lpVolumeId == disk_serial)
- {
- printf("LDR> VolumeID matches memory location, patching ...\n");
- }
- else
- {
- /* Throw a warning otherwise. The patcher may have the wrong memory address and
- * mess up everything */
- printf("LDR> WARINING: *****************************************************\n");
- printf("LDR> WARINING: VolumeID (0x%08x) does not match memory location.\n", *lpVolumeId);
- printf("LDR> WARINING: PATCH MAY NOT WORK. Patching anyways ... yolo \n");
- printf("LDR> WARINING: *****************************************************\n");
- }
- /* Init randomizer (we want real pseudo-random volume serials) */
- srand(GetTickCount());
- /* Create and write a new serial */
- *lpVolumeId = (rand() & 0xFF) |
- (rand() & 0xFF) << 8 |
- (rand() & 0xFF) << 16 |
- (rand() & 0xFF) << 24;
- printf("LDR> Randomized VolumeId: 0x%08x\n", *lpVolumeId);
- /* Goodbye message */
- printf("LDR> All done - client will continue\n");
- printf("LDR> Goodbye!\n");
- }
Hab 5 derzeit Accounts online.
Edit: Anti-AntiVM ist einfacher als gedacht.
Gruß
florian0 -
Danke florian!
Wie wende ich das jetzt an? -
-
Sie kompilieren?
-
Electus Reborn ist online ... Sie habens nicht mal versucht. Die neue DLL ist Baugleich zur Alten, man muss nicht mal das Offset ändern.
-
haha
-
-
moin leute, ich habe echt nur bahnhof verstanden was ihr da gemacht bzw was der florian da gemacht hat,
ich habe versuch bei den neuen electus-reborn mit den "tutorial" nachzumachen hat aber bei mir net funktioniert, meine frage ist nun. Kann mir einer genau sagen was ich für Programme brauche, wie ich das genau mache?
hab nix gerafft -
Mein aktuelles Setup ist:
- Windows 7
- x64dbg
- ScyllaHide
sro_client laden, PUSH, CALL und JMP erkennen. Breakpoint auf den JMP setzen. Ausführen. Wenn der Breakpoint erreicht ist, über EAX -> Rechtsklick -> Follow in Disassembler in die Dll wechseln.
Die "neue" neue Dll ist mit dem Trick von vorher nur sehr "zufällig" zu knacken, da LastThief nun die GetVolumeInformation()-Abfrage in das Timer-Event gepackt hat. Damit werden aus "beliebig viel Zeit zum patchen" etwa einge 100ns, was die ganze Sache schwierig macht.