ESET crackMe na CONFidence 2012 – bruteforcing z poziomu GUI :) [VIDEO]

3 Comments

Z żalem przyjąłem informację o cenach wejściówek na tegoroczną CONFidence. Mówi się “trudno”. Jednak, jak co roku, organizatorzy postanowili zorganizować konkurs o pięć darmowych wejściówek za złamanie crackme. Nagroda jest atrakcyjna, więc podejrzewam, że co tęższe głowy polskiej sceny reversingowej ruszyły do boju i wejściówki zostały już rozdane. Ja ze swojej strony postanowiłem się trochę pobawić…

Crackme ESETu wymaga podania tylko nazwy (nazwiska?) i hasła. Jego konstrukcja jest w miarę standardowa:

Szczerze przyznam, że moje czasy reversingu (wtedy jeszcze SoftICE był na topie) minęły bezpowrotnie, więc wielu rzeczy zapomniałem. W związku z tym nie udało mi się ustalić ani pakera (PEiD wskazywał na spakowany plik), ani kompilatora. Ale ogólnie rzecz biorąc, zupełnie mnie to nie obchodziło. Ważne, że nie użyto jakichś kontrolek z kosmosu, co zaraz pokażemy.

Od razu powiem, że nie wrzucam tu kodu, bo napisałem toto na szybko, kod jest brzydki, poza tym nie jest jakimśtam wielkim odkryciem.  Po prostu uważam, że warto czasem się pobawić.

 

Co nazywam bruteforcingiem z poziomu GUI?

Wyobraźmy sobie, że mamy miliard sztuk taniej siły roboczej. No to może każdemu kazać wpisywać kolejne możliwe ciągi znaków według określonego harmonogramu? I właśnie tak możemy się pobawić, z tym, że nie mamy miliarda kiepsko opłacanych pracowników z kraju trzeciego świata, a jednego PCta.

I Visual C# Express. Bo tak.

 

I jak to ma działać?

Po prostu – generator słownika według wybranych założeń, wpisujący każde kolejne hasło do pola tekstowego crackMe i klikający przycisk sprawdzenia. No i jeszcze musi on sprawdzać, co nasze crackMe zwraca. Ale po kolei.

 

Generator słownika.

Miewam mniej lub bardziej leniwe dni. W bardziej leniwe lubię opierać się na gotowych rozwiązaniach. W związku z tym dziś StackOverflow był moim przyjacielem. Kod jest dosyć trywialny. Wystarczy jeszcze zbudować parę kontrolek do opcji generowanych słów i gotowe:

 

Zapis i odczyt.

Tu problem sprowadza się do dwóch etapów:

  1.  Uzyskanie identyfikatora kontrolki, która nas interesuje (którą chcemy edytować, klikać, lub czytać).
  2. Wysłanie do niej odpowiedniej wiadomości.

Identyfikację postanowiłem zrobić “celownikiem”, bo jest to łatwiejsze w obsłudze. Co z tego, że robię absolutnie nieprzydatny program – ma być wygodny! :)

Każda średnio obeznana z programowaniem istota zrobi coś takiego bazując na kodzie z artykułu opisującego ObjectSpy. Artykuł również można przeczytać, jeśli komuś się chce. Poza tym PINVOKE Twoim przyjacielem.

W porządku, mamy już hWnd, czy jakkolwiek inaczej nazwać ID kontrolki. Teraz chcielibyśmy coś do niej zapisać
To jest etap, na którym utknąłem na długo z niewiadomych mi obecnie powodów. Miałem poprawny identyfikator, miałem definicję SendMessage()… prawdopodobnie coś musiałem pomieszać :)

W każdym razie na chwilę obecną u mnie wygląda to tak (i działa):

[DllImport("user32.dll", SetLastError = true)]
static extern bool SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string s);
private const int WM_SETTEXT = 0x0C;
// ...
SendMessage(IDkontrolki, WM_SETTEXT, IntPtr.Zero, "blah");

Proste jak świński ogon. Teraz kolej na następny etap, czyli kliknięcie przycisku sprawdzenia poprawności danych. Tu wchodzi inna definicja i kod wygląda następująco:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
private const int WM_LBUTTONDOWN = 0x0201;
private const int WM_LBUTTONUP = 0x0202;
// ...
SendMessage((IntPtr)iButtonHandle, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
SendMessage((IntPtr)iButtonHandle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);

Lekkie, łatwe i przyjemne. co nam zostało? No tak – odczyt kontrolki wyświetlającej wiadomość “ty gópi, nie znasz hasła!”. O dziwo, robimy to również przez SendMessage(). Tu znów z pomocą przychodzi StackOverflow – sprawa załatwiona.

 

Co nam pozostaje?

Działać! Czyli:

  1. Uruchomić crackMe.
  2. Uruchomić naszego mega-hiper-inteligentnego łamacza haseł.
  3. Zidentyfikować kontrolki.
  4. Podać nazwę usera.
  5. Skonfigurować generator słownika.
  6. Rozpocząć łamanie.
  7. Czekać…
  8. Czekać…
  9. Kawa, papieros…
  10. Czekać…

Nie oszukujmy się.

Szybkość działania takiego brute-force nie jest nawet w najmniejszym stopniu zadowalająca. Stanąłbym z moim programem w szranki z prawdziwym reverserem tylko jeśli wiedzialbym, że hasło składa się z samych liter i ma maksymalnie cztery znaki :)

Ale był to dla mnie wstęp do zagadnień związanych z automatyzacją niektórych zadań, czy chociażby z robieniem sobie jaj (a jakby Wam Notatnik sam pisał?). Tak czy siak, ubaw po pachy. A samo łamanie wygląda tak (sugeruję większy rozmiar bezpośrednio na YT – TUTAJ):

 

Możliwości rozbudowy?

Proszę mnie nie rozśmieszać :)

Ale w porządku, można dorobić wątki. W sumie tyle. Tylko… po co? :)

Categories: C#, Software, Zabawy z kodem

3 thoughts on “ESET crackMe na CONFidence 2012 – bruteforcing z poziomu GUI :) [VIDEO]”

    1. No problem. I sent you an email too. Unfortunately I had to abandon the project, or at least suspend it for a while. Maybe this thread from dP (polish version of SO) could help you – I didn’t check it yet.

  1. Hi & Thanks A lot
    I had to do my Project in Win Xp . bcz I didn’t find anything about Win 7 .
    AnyWay thanks u.

Leave a Reply

Your email address will not be published. Required fields are marked *