第一次尝试Crack(逆向异或算法)

【详细过程】
用peid查壳,无壳,运行,收集足够信息用OD载入,通过bp GetDlgItemTextA下断点,断点在USER32领空下,
从堆栈区Follow in Disassembler找到 call 调用函数地址为[004010B0],果断F7跟进

004010B0  |.  E8 14000000   CALL crackme.004010C9
004010B5  |>  EB 09         JMP SHORT crackme.004010C0
004010B7  |>  B8 00000000   MOV EAX,0
004010BC  |.  C9            LEAVE
004010BD  |.  C2 1000       RET 10
004010C0  |>  B8 01000000   MOV EAX,1
004010C5  |.  C9            LEAVE
004010C6  /.  C2 1000       RET 10
004010C9  /$  56            PUSH ESI
004010CA  |.  57            PUSH EDI
004010CB  |.  51            PUSH ECX
004010CC  |.  33F6          XOR ESI,ESI
004010CE  |.  33FF          XOR EDI,EDI
004010D0  |.  B9 08000000   MOV ECX,8                              ;定义循环次数
004010D5  |.  BE 44304000   MOV ESI,crackme.00403044               ;载入输入的密码
004010DA  |>  8036 32       /XOR BYTE PTR DS:[ESI],32              ;各个位进行与32的异或
004010DD  |.  46            |INC ESI                               ;esi递增
004010DE  |.^ E2 FA         /LOOPD SHORT crackme.004010DA          ;loop循环
004010E0  |.  BE 44304000   MOV ESI,crackme.00403044               ;下面是把变化后的密码前后取异或
004010E5  |.  B9 04000000   MOV ECX,4                              ;8变4

004010EA  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]             
004010EC  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]          
004010EF  |.  32C3          |XOR AL,BL                     ;将异或后的esi寄存器内容再次进行4次异或
004010F1  |.  8887 4C304000 |MOV BYTE PTR DS:[EDI+40304C],AL       ;将起始结果存入地址[0040304c]
004010F7  |.  83C6 02       |ADD ESI,2                             ;esi递增2
004010FA  |.  47            |INC EDI                               ;edi递增
004010FB  |.^ E2 ED         /LOOPD SHORT crackme.004010EA          ;loop循环
004010FD  |.  BE 4C304000   MOV ESI,crackme.0040304C       ;下面再次把变化后的四位进行前后异或
00401102  |.  8A06          MOV AL,BYTE PTR DS:[ESI]              
00401104  |.  8A5E 01       MOV BL,BYTE PTR DS:[ESI+1]
00401107  |.  32C3          XOR AL,BL                               ;再次异或取值4位变2位
00401109  |.  8A5E 02       MOV BL,BYTE PTR DS:[ESI+2]
0040110C  |.  8A4E 03       MOV CL,BYTE PTR DS:[ESI+3]
0040110F  |.  32D9          XOR BL,CL
00401111  |.  32C3          XOR AL,BL                             ;再次异或取值2位变成1位
00401113  |.  B9 08000000   MOV ECX,8                             ;定义循环次数
00401118  |.  BE 44304000   MOV ESI,crackme.00403044              ;将用户输入值存放在esi寄存器
0040111D  |>  3006          /XOR BYTE PTR DS:[ESI],AL             ;然后再同上面异或过32的8个数异或
0040111F  |.  46            |INC ESI                              ;esi递增
00401120  |.^ E2 FB         /LOOPD SHORT crackme.0040111D         ;loop循环
00401122  |.  B9 08000000   MOV ECX,8                             ;下面是比较
00401127  |.  BE 44304000   MOV ESI,crackme.00403044              ;将用户输入值存放在esi
0040112C  |.  BF 08304000   MOV EDI,crackme.00403008              ;将00403008处的值存放在edi(密码)
00401131  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]             ;将

00401133  |.  3A07          |CMP AL,BYTE PTR DS:[EDI]             ;将用户输入与原密码逐位对比
00401135  |.  75 1D         |JNZ SHORT crackme.00401154           ;不对就跳转至sorry(爆破点!!!)
00401137  |.  46            |INC ESI                              ;esi递增
00401138  |.  47            |INC EDI                              ;edi递增
00401139  |.^ E2 F6         /LOOPD SHORT crackme.00401131         ;loop循环
0040113B  |.  6A 40         PUSH 40                   
0040113D  |.  68 35304000   PUSH crackme.00403035                  ; |Title = "Crackme 1.0"
00401142  |.  68 10304000   PUSH crackme.00403010                  ; |Text = "Good Work Cracker"
00401147  |.  FF35 54304000 PUSH DWORD PTR DS:[403054]             ; |hOwner = NULL
0040114D  |.  E8 3C000000   CALL          ; /MessageBoxA
00401152  |.  EB 17         JMP SHORT crackme.0040116B
00401154  |>  6A 30         PUSH 30 
00401156  |.  68 35304000   PUSH crackme.00403035                  ; |Title = "Crackme 1.0"
0040115B  |.  68 22304000   PUSH crackme.00403022                  ; |Text = "Bad Serial, Sorry!"
00401160  |.  FF35 54304000 PUSH DWORD PTR DS:[403054]             ; |hOwner = NULL
00401166  |.  E8 23000000   CALL          ; /MessageBoxA
0040116B  |>  5F            POP EDI
0040116C  |.  5E            POP ESI
0040116D  |.  59            POP ECX
0040116E  /.  C3            RET

【算法解密】

如果输入12345678
机器码 31 32 33 34 35 36 37 38
与32异或 03 00 01 06 07 04 05 0A —-(1)
8变4为 03 07 03 0F
4变2为 04 0C
2变1为 08 —-(2)
(1)与08取异或 0B 08 09 0E 0F 0C 0D 02

00403008 内正确的为 71 18 59 1B 79 42 45 4C
根据正确反推注册码: (关键是如何计算(2))
由算法可知(2)是由机器码反复取异或得到,其实由它的正确的密码重复这一算法也可求的(2),实验得出。缺少证明。

机器码 71 18 59 1B 79 42 45 4C
8变4为 69 42 3B 09
4变2为 2B 32
2变1为 19 —-正确的密码的(2)值应为19

接着反推正确的注册码:
机器码 71 18 59 1B 79 42 45 4C
与19取异或 68 01 40 02 60 5B 5C 55
与32取异或 5A 33 72 30 52 69 6E 67
查表得正确的注册码为: Z 3 r 0 R i n g (Z3r0Ring)

你可能感兴趣的:(逆向)