Jak zama CrackMe 1.0 by Cyberdemon? by Marcus

Co bdzie potrzebne:
- SoftIce
- oczywicie CrackMe 1.0 by Cyberdemon
- i MASM jeeli chcesz ujrze haso

Od razu zaczynam od konkretw. Na pocztek piszemy w SI "bpx GetWindowTextA", a potem...

004011CD 6A0D                    push 0000000D
004011CF 68D6314000              push 004031D6                  ; (1)
004011D4 FF35CE314000            push dword ptr [004031CE]

  * Reference To: user32.GetWindowTextA, Ord: 014Ah

004011DA E8E9000000              Call 004012C8
004011DF 33F6                    xor esi, esi
004011E1 80B6D63140007F          xor byte ptr [esi+004031D6], 7F ; (2)
004011E8 46                      inc esi
004011E9 83FE0C                  cmp esi, 0000000C               ; (3)
004011EC 75F3                    jne 004011E1
004011EE 33F6                    xor esi, esi
004011F0 BF0B000000              mov edi, 0000000B
004011F5 8A86D6314000            mov al, byte ptr [esi+004031D6] ; (4)
004011FB 8AA7D6314000            mov ah, byte ptr [edi+004031D6] ; (5)
00401201 32C4                    xor al, ah                      ; (6) 
00401203 8886EE314000            mov byte ptr [esi+004031EE], al ; (7)
00401209 46                      inc esi                         ; (8)
0040120A 4F                      dec edi                         ; (9)
0040120B 83FE06                  cmp esi, 00000006               ; (10)
0040120E 75E5                    jne 004011F5
00401210 B903000000              mov ecx, 00000003               ; (11)
00401215 33F6                    xor esi, esi
00401217 BF05000000              mov edi, 00000005
0040121C 8A86EE314000            mov al, byte ptr [esi+004031EE] ; (12)
00401222 8AA7EE314000            mov ah, byte ptr [edi+004031EE] ; (13)
00401228 32C4                    xor al, ah                      ; (14)
0040122A 8886F4314000            mov byte ptr [esi+004031F4], al ; (15)
00401230 46                      inc esi                         ; (16)
00401231 4F                      dec edi                         ; (17)
00401232 E2E8                    loop 0040121C                   ; (18)
00401234 A0F4314000              mov al, byte ptr [004031F4]     ; (19)
00401239 0205F5314000            add al, byte ptr [004031F5]     ; (20)
0040123F 2A05F6314000            sub al, byte ptr [004031F6]     ; (21)
00401245 66B90C00                mov cx, 000C
00401249 33F6                    xor esi, esi
0040124B 3086D6314000            xor byte ptr [esi+004031D6], al ; (22)
00401251 46                      inc esi
00401252 E2F7                    loop 0040124B                   ; (23)
00401254 33F6                    xor esi, esi
00401256 B90C000000              mov ecx, 0000000C
0040125B 8A862F304000            mov al, byte ptr [esi+0040302F] ; (24)
00401261 3A86D6314000            cmp al, byte ptr [esi+004031D6] ; (25)
00401267 751B                    jne 00401284                    ; (26)
00401269 46                      inc esi                         ; (27)
0040126A E2EF                    loop 0040125B

1. Pod 004031D6 zostaje zaadowane nasze haso.
2. Tutaj kada literka naszego hasa XOR`owana jest z 7Fh=127.
3. Tutaj sprawdzanie, czy zXOR`owano 12 znakw, wic haso musi ich tyle zawiera, jeeli nie to XOR`uje kolejny znak.
4. Do al adowana jest pierwsza litera.
5. Do ah adowana jest ostatnia litera.
6. Tutaj nastpuje XOR`owanie tych liter.
7. A tutaj zapisanie do bufora pod pozycj 1-6.
8. Zwikszenie o 1 esi, gdzie pniej w al bdzie 2, 3, itd. litera.
9. Zmniejszenie o 1 edi, gdzie pniej w ah bdzie 11, 10, itd. litera
10. Ptla bdzie wykonywana 6 razy, po tej ptli nasze haso zawiera ju 6 znakw.
11. Wrzucenie do ecx 3 co oznacza, e tyle razy bdzie wykonywana ptla loop znajdujca si niej.
12. Nastpuje powtrka z mielenia, do al pierwszy znak.
13. Do ah ostatni.
14. Nastpuje XOR`owanie tych znakw.
15. I zapisane do bufora pod pozycje 7-9.
16. Zwikszenie esi o 1, wiadomo po co.
17. Zmniejszenie edi o 1, tu te wiadomo.
18. Wykonywanie ptli tyle razy ile jest w ecx.
19. adowanie 7 znaku do al.
20. Dodanie do niego znaku 8.
21. Odjcie od niego znaku 9.
22. Tutaj nastpuje XOR`owanie kadego znaku naszego hasa z tym co otrzymalimy pod al.
23. XOR`owanie wykonywane 12 razy.
24. adowanie pierwszego znaku oryginalnego hasa.
25. adowanie pierwszego znaku naszego zmielonego hasa.
26. Jak nie rwne to bye, bye.
27. Zwikszenie esi o 1, wiadomo po co.

Aby otrzyma podan warto, wystarczy przepuci prawidowe haso przez szereg tych operacji wymienionych wyej. Oto kod pod MASM`a jak otrzyma ju gotowe haso, taki may bruteforce o ile mona to tak nazwa:

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
Tyt      db "BruteForce dla CrackMe 1.0 by Cyberdemon",0
wartosc  db 9,44,63,38,109,12,59,40,35,42,40,63,0

.data?
temp     db 15 dup(?)
wynik    db 15 dup(?)

.code
start:
 push esi
 push ecx
 xor esi,esi
 mov ecx,12
 @Czynnosc1:
 mov al,byte ptr [wartosc]+esi
 xor al,127
 mov byte ptr [wartosc]+esi,al
 inc esi
 loop @Czynnosc1
 mov ecx,6
 xor esi,esi
 @Czynnosc2:
 mov al,byte ptr [wartosc]+esi
 mov ah,byte ptr [wartosc]+ecx+5
 xor al,ah
 mov byte ptr [temp]+esi,al
 inc esi
 loop @Czynnosc2
 mov ecx,3
 xor esi,esi
 @Czynnosc3:
 mov al,byte ptr [temp]+esi
 mov ah,byte ptr [temp]+ecx+2
 xor al,ah
 mov byte ptr [temp]+esi+6,al
 inc esi
 loop @Czynnosc3
 mov al,byte ptr [temp]+6
 add al,byte ptr [temp]+7
 sub al,byte ptr [temp]+8
 mov ecx,12
 xor esi,esi
 @Czynnosc4:
 mov ah,byte ptr [wartosc]+esi
 xor ah,al
 mov byte ptr [wynik]+esi,ah
 inc esi
 loop @Czynnosc4
 pop ecx
 pop esi
 invoke MessageBox,0,offset wynik,offset Tyt,MB_OK + MB_ICONINFORMATION
end start