Xnview 1.68.1 |
||
Data |
by "|GeO|" |
|
25/03/2005 |
Published by Quequero |
|
Miao |
Grazie tante Geo |
Bao |
.... |
|
.... |
Difficoltà |
(X)NewBies ( )Intermedio ( )Avanzato ( )Master |
Introduzione |
Tools usati |
URL o FTP del programma |
Notizie sul programma |
Essay |
00469570 . SUB ESP,168 00469576 . LEA EAX,DWORD PTR SS:[ESP+68] 0046957A . PUSH ESI ; xnview.00560718 0046957B . MOV ESI,DWORD PTR SS:[ESP+170] 00469582 . PUSH EDI ; ntdll.77F4164E 00469583 . MOV EDI,DWORD PTR DS:[<&USER32.GetDlgItemTextA>] ; USER32.GetDlgItemTextA 00469589 . PUSH 100 ; /Count = 100 (256.) 0046958E . PUSH EAX ; |Buffer = NULL 0046958F . PUSH 7D0 ; |ControlID = 7D0 (2000.) 00469594 . PUSH ESI ; |hWnd = 00560718 00469595 . CALL EDI ; \GetDlgItemTextA 00469597 . LEA ECX,DWORD PTR SS:[ESP+10] 0046959B . PUSH 20 ; /Count = 20 (32.) 0046959D . PUSH ECX ; |Buffer = 0012FFB0 0046959E . PUSH 7D1 ; |ControlID = 7D1 (2001.) 004695A3 . PUSH ESI ; |hWnd = 00560718 004695A4 . CALL EDI ; \GetDlgItemTextA 004695A6 . MOV AL,BYTE PTR SS:[ESP+70] 004695AA . TEST AL,AL ; controlla che non sia vuoto 004695AC . JE xnview.004696EC 004695B2 . MOV AL,BYTE PTR SS:[ESP+10] 004695B6 . TEST AL,AL ; come prima 004695B8 . JE xnview.004696EC 004695BE . LEA EDX,DWORD PTR SS:[ESP+8] 004695C2 . LEA EAX,DWORD PTR SS:[ESP+70] 004695C6 . PUSH EDX 004695C7 . PUSH EAX 004695C8 . CALL xnview.0040B410 ; calcoli sull'user |
[CALL NUMERO 1]:
0040B410 MOV EDX,DWORD PTR SS:[ESP+4] ; xnview.0056B804 0040B414 PUSH EBX 0040B415 PUSH EBP 0040B416 PUSH ESI 0040B417 PUSH EDI 0040B418 MOV EDI,EDX 0040B41A OR ECX,FFFFFFFF 0040B41D XOR EAX,EAX 0040B41F REPNE SCAS BYTE PTR ES:[EDI] 0040B421 NOT ECX 0040B423 DEC ECX ; numero di char 0040B424 MOV ESI,xnview.0056B798 0040B429 MOV EBP,ECX ; num di char in ebp 0040B42B MOV ECX,5 0040B430 MOV EDI,xnview.0058BA08 0040B435 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 0040B437 MOV ESI,EAX 0040B439 JE SHORT xnview.0040B45C 0040B43B /MOV CL,BYTE PTR DS:[ESI+EDX] ; prende il primo char 0040B43E |MOV BL,CL ; lo copia in bl 0040B440 |XOR BL,BYTE PTR DS:[EAX+58BA08] ; xora un char con un altro 0040B446 |INC EAX ; aumenta eax 0040B447 |CMP EAX,5 ; lo confronta con 5 0040B44A |MOV BYTE PTR DS:[ESI+EDX],BL ; salva il risultato dello xor 0040B44D |MOV BYTE PTR DS:[EAX+58BA07],CL ; salva il primo parametro dello xor 0040B453 |JNZ SHORT xnview.0040B457 ; se eax non � 5 salta 0040B455 |XOR EAX,EAX ; altrimenti azzera eax... 0040B457 |INC ESI ; ...e aumenta esi di 1 0040B458 |CMP ESI,EBP ; confronta il num di giri con il num di char 0040B45A \JB SHORT xnview.0040B43B ; se � meno del num dei char salta all'inizio 0040B45C XOR EDI,EDI ; azzera edi 0040B45E XOR ECX,ECX ; azzera ecx 0040B460 TEST EBP,EBP 0040B462 JBE SHORT xnview.0040B48A 0040B464 /MOV BL,BYTE PTR DS:[EDI+58BA0D] ; mette il valore da usare per lo xor in bl 0040B46A |MOV ESI,EBP ; muove il contenuto di ebp in esi 0040B46C |SUB ESI,ECX ; sottrae ecx a esi e stora il risultato in esi 0040B46E |DEC ESI ; decrementa esi 0040B46F |MOV AL,BYTE PTR DS:[ESI+EDX] ; muove il risultato dello xor precedente in al 0040B472 |XOR BL,AL ; xora bl con al 0040B474 |INC EDI ; aumenta edi 0040B475 |MOV BYTE PTR DS:[ESI+EDX],BL ; salva il risultato dello xor 0040B478 |MOV BYTE PTR DS:[EDI+58BA0C],AL ; salva il risultato dello xor del 1� giro 0040B47E |CMP EDI,5 ; confronta edi con 5 0040B481 |JNZ SHORT xnview.0040B485 ; se � minore di 5 salta a 0040B485 0040B483 |XOR EDI,EDI ; altrimenti azzera edi 0040B485 |INC ECX ; aumenta di uno ecx 0040B486 |CMP ECX,EBP ; se ecx = num di char dell'user esce dal ciclo 0040B488 \JB SHORT xnview.0040B464 ; altrimenti salta all'inizio del ciclo 0040B48A XOR ESI,ESI ; azzera esi 0040B48C XOR EDI,EDI ; azzera edi 0040B48E TEST EBP,EBP 0040B490 JBE SHORT xnview.0040B4B3 0040B492 /MOV AL,BYTE PTR DS:[EDI+EDX] ; mette il risultato del 2� xor in al 0040B495 |MOV CL,BYTE PTR DS:[ESI+58BA12] ; mette il char per lo xor in cl 0040B49B |XOR CL,AL ; xora al e cl e salva il risultato in al 0040B49D |INC ESI ; aumenta di uno esi 0040B49E |MOV BYTE PTR DS:[EDI+EDX],CL ; salva il risultato del 3� xor 0040B4A1 |MOV BYTE PTR DS:[ESI+58BA11],AL ; salva il risultato del 2� xor 0040B4A7 |CMP ESI,5 ; confronta esi con 5 0040B4AA |JNZ SHORT xnview.0040B4AE ; se non � uguale salta a 0040B4AE 0040B4AC |XOR ESI,ESI ; altrimenti azzera esi 0040B4AE |INC EDI ; aumenta di uno edi 0040B4AF |CMP EDI,EBP ; se ha xorato tutti i char esce dal ciclo 0040B4B1 \JB SHORT xnview.0040B492 0040B4B3 XOR EDI,EDI ; azzera edi 0040B4B5 XOR ECX,ECX ; azzera ecx 0040B4B7 TEST EBP,EBP 0040B4B9 JBE SHORT xnview.0040B4E1 0040B4BB /MOV BL,BYTE PTR DS:[EDI+58BA17] ; mette il valore per lo xor in bl 0040B4C1 |MOV ESI,EBP ; num di char in esi 0040B4C3 |SUB ESI,ECX ; sottrae ecx a esi 0040B4C5 |DEC ESI ; decrementa esi 0040B4C6 |MOV AL,BYTE PTR DS:[ESI+EDX] ; mette il risultato del 3� xor in al 0040B4C9 |XOR BL,AL ; xora bl e al 0040B4CB |INC EDI ; aumenta edi di uno 0040B4CC |MOV BYTE PTR DS:[ESI+EDX],BL ; salva il risultato del 4� xor 0040B4CF |MOV BYTE PTR DS:[EDI+58BA16],AL ; salva il risultato del 3� xor 0040B4D5 |CMP EDI,5 ; se edi = 5 non salta e... 0040B4D8 |JNZ SHORT xnview.0040B4DC ; ...azzera edi 0040B4DA |XOR EDI,EDI ; qui azzera edi 0040B4DC |INC ECX ; aumenta ecx 0040B4DD |CMP ECX,EBP ; se ha xorato tutti i char non ripete ed esce 0040B4DF \JB SHORT xnview.0040B4BB 0040B4E1 MOV EDI,DWORD PTR SS:[ESP+18] 0040B4E5 XOR EAX,EAX ; azzera eax 0040B4E7 TEST EBP,EBP 0040B4E9 MOV DWORD PTR DS:[EDI],0 0040B4EF JBE SHORT xnview.0040B508 0040B4F1 /MOV ECX,EAX ; azzera ecx 0040B4F3 |AND ECX,3 0040B4F6 |MOV BL,BYTE PTR DS:[ECX+EDI] ; mette il char da sommare in bl 0040B4F9 |LEA ESI,DWORD PTR DS:[ECX+EDI] ; mette l'indirizzo del char da sommare in esi 0040B4FC |MOV CL,BYTE PTR DS:[EAX+EDX] ; mette in cl l'altro char da sommare 0040B4FF |ADD BL,CL ; li somma 0040B501 |INC EAX ; aumenta eax 0040B502 |CMP EAX,EBP ; finch� non ripete il giro 5 volte loopa 0040B504 |MOV BYTE PTR DS:[ESI],BL ; scrive il risultato della somma 0040B506 \JB SHORT xnview.0040B4F1 0040B508 POP EDI ; xnview.005913C3 0040B509 POP ESI ; xnview.005913C3 0040B50A POP EBP ; xnview.005913C3 0040B50B POP EBX ; xnview.005913C3 0040B50C RETN
|
[FINE CALL NUMERO 1]
004695CD . LEA ECX,DWORD PTR SS:[ESP+18] ; mette il serial in ecx 004695D1 . PUSH ECX ; e lo mette nello stack 004695D2 . CALL xnview.00473553 ; calcoli sul serial |
[CALL NUMERO 2]:
00473553 PUSH EBX 00473554 PUSH EBP 00473555 PUSH ESI ; xnview.0056B804 00473556 PUSH EDI ; xnview.005913C3 00473557 MOV EDI,DWORD PTR SS:[ESP+14] 0047355B /CMP DWORD PTR DS:[576AD8],1 ; sempre 1 quindi salta sempre 00473562 |JLE SHORT xnview.00473573 00473564 |MOVZX EAX,BYTE PTR DS:[EDI] 00473567 |PUSH 8 00473569 |PUSH EAX 0047356A |CALL xnview.00473BD6 0047356F |POP ECX ; xnview.0040B5DB 00473570 |POP ECX ; xnview.0040B5DB 00473571 |JMP SHORT xnview.00473582 00473573 |MOVZX EAX,BYTE PTR DS:[EDI] ; mette il 1� char del serial in eax 00473576 |MOV ECX,DWORD PTR DS:[5768CC] ; xnview.005768D6 0047357C |MOV AL,BYTE PTR DS:[ECX+EAX*2] ; 5768D6+31*2 0047357F |AND EAX,8 00473582 |TEST EAX,EAX 00473584 |JE SHORT xnview.00473589 00473586 |INC EDI ; xnview.005913C3 00473587 \JMP SHORT xnview.0047355B 00473589 MOVZX ESI,BYTE PTR DS:[EDI] ; primo char del serial in esi 0047358C INC EDI ; legge il char dopo 0047358D CMP ESI,2D ; confronta il char con 2D 00473590 MOV EBP,ESI ; copia il char in ebp 00473592 JE SHORT xnview.00473599 ; se � 2D salta 00473594 CMP ESI,2B ; confronta il char con 2B 00473597 JNZ SHORT xnview.0047359D ; se non � 2B salta 00473599 MOVZX ESI,BYTE PTR DS:[EDI] ; se � 2B lo scarta e legge il char dopo 0047359C INC EDI ; considera il char ancora dopo in edi 0047359D XOR EBX,EBX ; azzera ebx 0047359F /CMP DWORD PTR DS:[576AD8],1 ; sempre 1 quindi salta sempre 004735A6 |JLE SHORT xnview.004735B4 004735A8 |PUSH 4 004735AA |PUSH ESI ; xnview.0056B804 004735AB |CALL xnview.00473BD6 004735B0 |POP ECX ; xnview.0040B5DB 004735B1 |POP ECX ; xnview.0040B5DB 004735B2 |JMP SHORT xnview.004735BF 004735B4 |MOV EAX,DWORD PTR DS:[5768CC] 004735B9 |MOV AL,BYTE PTR DS:[EAX+ESI*2] 004735BC |AND EAX,4 004735BF |TEST EAX,EAX ; legge finch� non finisce il serial 004735C1 |JE SHORT xnview.004735D0 ; salta solo se c'� il terminatore nullo 004735C3 |LEA EAX,DWORD PTR DS:[EBX+EBX*4] 004735C6 |LEA EBX,DWORD PTR DS:[ESI+EAX*2-30] 004735CA |MOVZX ESI,BYTE PTR DS:[EDI] ; mette il char dopo in esi 004735CD |INC EDI ; legge il char successivo 004735CE \JMP SHORT xnview.0047359F 004735D0 CMP EBP,2D ; se il primo char e' 2D inverte il segno ; ad eax, frutto dei calcoli 004735D3 MOV EAX,EBX ; sposta il risultato dei calcoli da ebx a eax 004735D5 JNZ SHORT xnview.004735D9 ; se non e' 2D salta 004735D7 NEG EAX ; altrimenti inverte il segno 004735D9 POP EDI ; xnview.0040B5DB 004735DA POP ESI ; xnview.0040B5DB 004735DB POP EBP ; xnview.0040B5DB 004735DC POP EBX ; xnview.0040B5DB 004735DD RETN
|
[FINE CALL NUMERO 2]
004695D7 . MOV ECX,DWORD PTR SS:[ESP+14] ; mette i calcoli sull'user in ecx 004695DB . ADD ESP,0C 004695DE . CMP ECX,EAX ; se i calcoli serial/user coincidono ok 004695E0 . JE SHORT xnview.0046963F 004695E2 . MOV EAX,DWORD PTR DS:[5913A0] ; se non sono uguali registrazione non valida 004695E7 . LEA EDX,DWORD PTR SS:[ESP+30] 004695EB . PUSH 40 ; /Count = 40 (64.) 004695ED . PUSH EDX ; |Buffer = 7FFE0304 004695EE . PUSH 1393 ; |RsrcID = STRING "Invalid registration" 004695F3 . PUSH EAX ; |hInst = NULL 004695F4 . CALL DWORD PTR DS:[<&USER32.LoadStringA>] ; \LoadStringA 004695FA . PUSH 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL 004695FC . LEA ECX,DWORD PTR SS:[ESP+34] ; | 00469600 . PUSH xnview.0058B9FC ; |Title = "" 00469605 . PUSH ECX ; |Text = ".d�w�.�w�...\t" 00469606 . PUSH ESI ; |hOwner = 00560718 00469607 . CALL DWORD PTR DS:[<&USER32.MessageBoxA>] ; \MessageBoxA 0046960D . PUSH 7D0 ; /ControlID = 7D0 (2000.) 00469612 . PUSH ESI ; |hWnd = 00560718 00469613 . CALL DWORD PTR DS:[<&USER32.GetDlgItem>] ; \GetDlgItem 00469619 . PUSH EAX ; /hWnd = NULL 0046961A . CALL DWORD PTR DS:[<&USER32.SetFocus>] ; \SetFocus 00469620 . PUSH xnview.0058B9FC ; /Text = "" 00469625 . PUSH 7D1 ; |ControlID = 7D1 (2001.) 0046962A . PUSH ESI ; |hWnd = 00560718 0046962B . CALL DWORD PTR DS:[<&USER32.SetDlgItemTextA>] ; \SetDlgItemTextA 00469631 . POP EDI ; kernel32.77E614C7 00469632 . MOV EAX,1 00469637 . POP ESI ; kernel32.77E614C7 00469638 . ADD ESP,168 0046963E . RETN 0046963F > LEA EDX,DWORD PTR SS:[ESP+70] ; se coincidono la registrazione � ok 00469643 . PUSH 100 00469648 . PUSH EDX 00469649 . PUSH 7D0 0046964E . PUSH ESI ; xnview.00560718 0046964F . CALL EDI ; ntdll.77F4164E 00469651 . LEA EAX,DWORD PTR SS:[ESP+10] 00469655 . PUSH 20 00469657 . PUSH EAX 00469658 . PUSH 7D1 0046965D . PUSH ESI ; xnview.00560718 0046965E . CALL EDI ; ntdll.77F4164E 00469660 . LEA ECX,DWORD PTR SS:[ESP+70] 00469664 . PUSH ECX 00469665 . PUSH xnview.0056B840 ; ASCII "LicenseName" 0046966A . PUSH 0 0046966C . CALL xnview.0043E040 00469671 . LEA EDX,DWORD PTR SS:[ESP+1C] 00469675 . PUSH EDX 00469676 . PUSH xnview.0056B830 ; ASCII "LicenseNumber" 0046967B . PUSH 0 0046967D . CALL xnview.0043E040 00469682 . MOV EAX,DWORD PTR DS:[5913A4] 00469687 . ADD ESP,18 0046968A . MOV DWORD PTR DS:[5913C8],1 00469694 . PUSH 1 ; /Flags = MF_BYCOMMAND|MF_GRAYED|MF_STRING 00469696 . PUSH 0DE ; |ItemID = DE (222.) 0046969B . PUSH EAX ; |/hWnd = NULL 0046969C . CALL DWORD PTR DS:[<&USER32.GetMenu>] ; |\GetMenu 004696A2 . PUSH EAX ; |hMenu = NULL 004696A3 . CALL DWORD PTR DS:[<&USER32.EnableMenuItem>]; \EnableMenuItem 004696A9 . MOV EDX,DWORD PTR DS:[5913A0] 004696AF . LEA ECX,DWORD PTR SS:[ESP+30] 004696B3 . PUSH 40 ; /Count = 40 (64.) 004696B5 . PUSH ECX ; |Buffer = 0012FFB0 004696B6 . PUSH 1394 ; |RsrcID = STRING "Registration succesfull" 004696BB . PUSH EDX ; |hInst = 7FFE0304 004696BC . CALL DWORD PTR DS:[<&USER32.LoadStringA>] ; \LoadStringA 004696C2 . PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL 004696C4 . LEA EAX,DWORD PTR SS:[ESP+34] ; | 004696C8 . PUSH xnview.0058B9FC ; |Title = "" 004696CD . PUSH EAX ; |Text = NULL 004696CE . PUSH ESI ; |hOwner = 00560718 004696CF . CALL DWORD PTR DS:[<&USER32.MessageBoxA>] ; \MessageBoxA 004696D5 . PUSH 0 ; /Result = 0 004696D7 . PUSH ESI ; |hWnd = 00560718 004696D8 . CALL DWORD PTR DS:[<&USER32.EndDialog>] ; \EndDialog 004696DE . POP EDI ; kernel32.77E614C7 004696DF . MOV EAX,1 004696E4 . POP ESI ; kernel32.77E614C7 004696E5 . ADD ESP,168 004696EB . RETN 004696EC > MOV EDX,DWORD PTR DS:[5913A0] 004696F2 . LEA ECX,DWORD PTR SS:[ESP+30] 004696F6 . PUSH 40 ; /Count = 40 (64.) 004696F8 . PUSH ECX ; |Buffer = 0012FFB0 004696F9 . PUSH 1393 ; |RsrcID = STRING "Invalid registration" 004696FE . PUSH EDX ; |hInst = 7FFE0304 004696FF . CALL DWORD PTR DS:[<&USER32.LoadStringA>] ; \LoadStringA 00469705 . PUSH 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL 00469707 . LEA EAX,DWORD PTR SS:[ESP+34] ; | 0046970B . PUSH xnview.0058B9FC ; |Title = "" 00469710 . PUSH EAX ; |Text = NULL 00469711 . PUSH ESI ; |hOwner = 00560718 00469712 . CALL DWORD PTR DS:[<&USER32.MessageBoxA>] ; \MessageBoxA 00469718 . POP EDI ; kernel32.77E614C7 00469719 . MOV EAX,1 0046971E . POP ESI ; kernel32.77E614C7 0046971F . ADD ESP,168 00469725 . RETN |
In sintesi:
Il programma compie vari xor sui char dell'username e poi all'ultimo per
evitare che i numeri del serial siano troppi li
somma con questo criterio: ((numero di char dell'user + (5 * n)) + ((numero
di char dell'user + (5 * n)) etc; dove n
aumenta di uno ogni 5 char dell'user. Es: se l'user ha 15 caratteri il
risultato dello xor del 1� char, del 6� (1 + 5) e
dell'11� char (1 + (5 * 2)) vengono sommati. Una volta ricavato questo
numero calcolato dall'user lo confronta con il serial, se sono uguali
registra il programma, altrimenti segnala che c'� qualcosa che non va.
A questo punto basta "pescare" il serial qui:
004695D7 . MOV ECX,DWORD PTR SS:[ESP+14] ; mette i calcoli sull'user in ecx |
Una volta che avete il serial in esadecimale (da ecx) non dovete far altro che trasformarlo in decimale e inserirlo in fase di registrazione =).
Note finali |
Saluto tutte le persone su #crack-it e #asm e ringrazio Quequero per il vop su #crack-it :D
Disclaimer |
Questo readme/tutorial � solo a scopo dimostrativo/informativo, non mi assumo nessuna responsabilit� per le vostre azioni n� tantomeno per eventuali danni (diretti o indiretti che siano) causati dall'applicazione di quanto trattato qui.
Reversiamo al solo scopo informativo e per migliorare la nostra conoscenza del linguaggio Assembly.