bart^xt napisał(a)
wyzywam cie przy wszystkich na pojedynek crackerski!
Przyjmuję wyzwanie w duchu, w jakim zostało złożone. Bart, jak delfiny kocham, tym razem przesadziłeś...
bart^xt napisał(a)
jestem ciekaw czy teraz tez ci bedzie do smiechu hihi
hmm... ja chcę jeszcze raz [rotfl] Nad poprzednim Twoim cm /IHMO znacznie prostszym/ siedziałem 2 dni, nad tym natomiast kilka godzin. Zabawne, że jeszcze niedawno stawiałeś mnie na równi z sobą, teraz zaś jestem tylko newbie.
Muszę przyznać iż tak ciekawego cm chyba jeszcze w życiu nie łamałem /w końcu autor jest IMO najlepszym crackerem w Polsce i jednym z najlepszych na świecie/. Coś a'la maszyna wirtualna? Dlatego odmówiłem prawdziwemu diabłowi bo wiedziałem kto jest faktycznym autorem tego cacka - rzut oka na tablicę importów i wszystko jasne, VEH /nie znam żadnego innego crackera stosującego VEH, Ty zaś w wielu rozmowach o tej technice wspominałeś/. To, że nie znałem tej technologii 2 m-ce temu nie oznacza iż nie jestem w stanie jej zrozumieć. Pozwolę sobie wrzucić silnik tej zabawki przepisany na C++ /gdybym tego nie zrobił, skończyłbym wcześniej/:
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define INST(code) asm (".byte 0xcc, " #code);
#define ASM_INT3 0xcc
enum INSTRUCTIONS // nie czepiac sie nazewnictwa - pisane na szybko, bez zastanowienia ;)
{
NOP = 0, INFO_BAD, CMP_A_EBCF62D2_IDP, XOR_A_FFFFFF3C_IDP, XOR_A_B_B0,
SUB_A_B_XOR_A5, ADD_A_B_XOR_138, JAB0_EXIT, MOV_B_C, MOV_A_D_IDP,
CMP_CD_BYTES_0, GET_S, INFO_INPUT
};
typedef struct _INSTRUCTION {
BYTE int3;
BYTE ControlCode;
} INSTRUCTION, *PINSTRUCTION;
typedef struct _VM_REGS
{
DWORD A;
DWORD B;
DWORD C;
DWORD D;
} VM_REGS;
LONG WINAPI GetInstruction (PEXCEPTION_POINTERS);
LONG WINAPI ExecuteInstruction (PEXCEPTION_POINTERS);
DWORD Instruction (0x15);
VM_REGS REG;
int main (int argc, const char **argv, const char *envp)
{
PVOID handler1, handler2;
handler1 = AddVectoredExceptionHandler(1, GetInstruction);
handler2 = AddVectoredExceptionHandler(0, ExecuteInstruction);
#include "vm_code.h"
RemoveVectoredExceptionHandler (handler2);
RemoveVectoredExceptionHandler (handler1);
return 0;
};
LONG WINAPI GetInstruction (PEXCEPTION_POINTERS ExceptPtrs)
{
PINSTRUCTION pCode = (PINSTRUCTION) ExceptPtrs->ContextRecord->Eip;
if (pCode->int3 == ASM_INT3) switch (pCode->ControlCode)
{
case 0x00: Instruction = SUB_A_B_XOR_A5; break;
case 0x01: Instruction = JAB0_EXIT; break;
case 0x03: Instruction = ADD_A_B_XOR_138; break;
case 0x05: Instruction = MOV_A_D_IDP; break;
case 0x11: Instruction = INFO_INPUT; break;
case 0x41: Instruction = CMP_A_EBCF62D2_IDP; break;
case 0x46: Instruction = INFO_BAD; break;
case 0x56: Instruction = MOV_B_C; break;
case 0x68: Instruction = GET_S; break;
case 0x70: Instruction = XOR_A_B_B0; break;
case 0x8D: Instruction = XOR_A_FFFFFF3C_IDP; break;
case 0xFF: Instruction = CMP_CD_BYTES_0; break;
default: Instruction = NOP;
};
return 0;
};
LONG WINAPI ExecuteInstruction (PEXCEPTION_POINTERS ExceptPtrs)
{
switch (Instruction)
{
case NOP:
break;
case INFO_BAD:
{
printf ("Niepoprawne haslo,jestes LAMEREM!\n");
getch();
exit(1);
}
case CMP_A_EBCF62D2_IDP:
{
if (REG.A == 0xEBCF62D2)
{
printf ("Poprawne haslo,niespodziewanka co!!!!!!!!!!!!!!!!!!");
getch();
exit (0);
}
Instruction = IsDebuggerPresent();
break;
}
case XOR_A_FFFFFF3C_IDP:
{
REG.A ^= 0xFFFFFF3C;
ExceptPtrs->ContextRecord->Eip -= IsDebuggerPresent();
break;
}
case XOR_A_B_B0:
{
REG.A ^= REG.B ^ 0xB0;
break;
}
case SUB_A_B_XOR_A5:
{
REG.A -= REG.B ^0xA5;
break;
}
case ADD_A_B_XOR_138:
{
REG.A += REG.B ^ 0x138;
break;
}
case JAB0_EXIT:
{
if (!(REG.A | REG.B)) exit (1);
break;
}
case MOV_B_C:
{
REG.B = REG.C;
break;
}
case MOV_A_D_IDP:
{
REG.A = REG.D;
ExceptPtrs->ContextRecord->Eip += IsDebuggerPresent();
break;
}
case CMP_CD_BYTES_0:
{
PBYTE pBytes = (PBYTE)®.C;
while (*pBytes)pBytes++;
DWORD len = (DWORD)(pBytes -(DWORD)(®.C));
if ( len != 8) exit (1);
break;
}
case GET_S:
{
gets((char*)®.C);
break;
}
case INFO_INPUT:
{
printf ("diabel cm 2oo6 N0T4N00BS\n\nPodaj haslo noobie:");
break;
};
default:
exit (0);
}
return -1;
};
Teraz może małe wyjaśnienie - VEH to taka przyjemniejsza pochodna SEHa. W kodzie po ustawieniu handlerów występuje ciąg bodaj 766 instrukcji czy też może bytecode'u o takim formacie:
db 0xcc ; int3
db 0xXX ; gdzie XX to kod czynnosci do wykonania
GetInstruction sprawdza kod i zapisuje w zmiennej Instruction numer czynnosci do wykonania. Zwracając 0 informuje system, że wyjątek nie został obsłużony - wywoływany jest następny handler czyli ExecuteInstruction. Ten jak nazwa wskazuje wykonuje zadaną operację, przesuwa eip emulowanego kodu o 2 /int3 + db 0xXX/ i informuje system o uporaniu się z wyjątkiem. I co napotyka system po przeładowaniu kontekstu? Kolejnego breakpointa. VM operuje na 4 dwordach, można więc przyjąć, iż mamy do czynienia z z wirtualnym 32b procesorem o 4 rejestrach /+eip oczywiście/. Pliku "vm_code.h" nie zamieszczam - nawet po odsyfieniu\zoptymalizowaniu trochę to zajmuje... Czytelność przedstawionego przeze mnie kodu pozostawia wiele do życzenia, ale nie był on do końca pisany z myślą o publikacji... Ale nie jest tak źle :-) Sprawa jest o tyle ciekawa, że w praktyce tylko 2 rejestry /A i B/ bają znaczenie, B zaś nie jest modyfikowany /niby wygląda to inaczej, ale... / Serial musi mieć dokładnie 8 znaków - za sprawdzanie tego odpowiada 'case CMP_CD_BYTES_0' w ExecuteInstruction. Resztę doczytacie sobie sami :>
Obfuscator i proste coś a'la vm to za mało aby mnie powstrzymać. Czy dwóch bartów to o jednego za dużo? Kiedyś skończysz w puszkach. Udowodniłem swoją wartość w sposób jaki sam wybrałeś, zamiast skompromitować mnie, skompromitowałeś siebie. Oczekuję iż albo odzyskam dawne uprawnienia na ^D - full member, moderator /'fachowego' maila gdybyś był taki miły również/ i oczywiście zdjęcie bana albo ew. pozwolisz mi odejść w spokoju z naszego fachu. Tak, to prawda - chciałem się wycołać... do dzisiaj. Zmusiłeś mnie do powrotu. I wiesz co? Jak tak na to patrzę to dobrze mi robi takie małe crackerskie współzawodnictwo :>
Może teraz przedstawię naszą gwiazdę - słynny bart z xt, redaktor naczelny TAC-a /przeprowadził wywiad m.in. ze mną/, administrator serwisu ctrl-d / www.woodmann.com/bart/ / i najlepszy zawodnik na naszej rodzimej crackscenie. Jak widać lubi podszywać się pod innych /zwłaszcza newbie - tak jak teraz, pod współpracującego z nim niejakiego diabła/. Dosyć nerwowy. Jako pierwszy polak połamał RSA i sprowadził na świat klątwę 'Pajączka' /btw. niech ktoś pozdrowi Rafala Platka/. Co by tu jeszcze? Hm... jest sporo ciekawych informacji, ale źle by się skończyło gdybym cokowiek ciekawszego wypomniał.
Next - dlaczego kolejna prowokacja? W listopadzie nie wytrzymałem nerwowo jego komentarzy nt. deus vs. StarForce. Moja riposta skończyła się utratą uprawnień i banem... ale to jak widać Bartoszowi nie wystarczyło :/ Nieoficjalnie obiecał przebaczenie za złamanie tego cm - pożyjemy zobaczymy.
Marooned napisał(a)
a głosuję na "tak" bo wiem, że deus zarwie miesiąc, wyklnie go rodzina, a lokalny pastor będzie się dobijał drzwiami i oknami by odprawić egzorcyzmy, ale radę da
heh, M. nie przesadzaj, to już nie te czasy - na co mi miesiąc... ;P Hm, wszyscy są za mną, dzięki za wiarę ludzie. Sam nie głosowałem - gdybym głosował to pewnie padłaby odpowiedź 'Nie, spanikuje', o taka sobie solidarność z tym tu - bartem - bratem po fachu :-)
CyberKid napisał(a)
.text:0040148D mov esi, ds:AddVectoredExceptionHandler
.text:00401493 call esi ; AddVectoredExceptionHandler
rotfl, czego was uczom w tej szkole hakierów? [rotfl]
nie śmiej się - ten kod jest wygenerowany przez VC++ a bart ma łeb. Inna sprawa, że 2 minuty analizowałem jeden fragment kodu aby stwierdzić, że to zwykły switch [rotfl] .
Jeśli zaś chodzi o orty Bartosza - nieźle udaje styl oryginalnego diabła ;)
Następnym razem /oby NIE!/ potraktuj cm pelockem - będziesz miał większe szanse :-) Najlepszy protector jaki widziałem... oby miał lepszą VM niż aktualne cm.
Bart, to jak - chcesz dalej ciągnąć tą bezsensowną wojnę czy może będzie jak dawniej? Myślę, że bardziej nam obu na zdrowie wyjdzie współpraca.
a, zapomniałbym:
tnM3
czyli słownie cztery spacje i 'tnM3'...
p.s. Potem może coś więcej napiszę - aktualnie to przypaliłem frytki... wypadałoby jednak je zjeść :/
p.s. 2: temat może do perełek?
p.s. 3: @ ten cwaniak co przniósł temat do [Innych] - jak to nie jest nietuzinkowy temat to ja jestem ksiądz proboszcz; czekam na key z niecierpliwością /razem z bartem ;P/- podstawy masz podane na tacy. Poprzedniego cm niejakiego Donia jakoś nikt inny nie złamał... i wisi w NT :/