Password Keeper v6.3破解過程 (8千字)

看雪資料發表於2002-04-12

Password Keeper v6.3破解過程      (難度:較易)


你是否有一大堆的密碼,email,5460,rar檔案.....。讓人頭大。也許Password Keeper可以幫你一個忙。它是一個管理密碼的優秀軟體,只要記住一個密碼,你就可以管理你所有的帳號和密碼了。以下是其破解過程。
    下斷點bpx GetDlgItemTexta,填入姓名gearboy,組織energy,假序列號654321,點OK,立即被TRW2000攔下。鍵入命令pmodule,若干F10返回到呼叫的Call處,即00414962。

017F:0041495F 6A65            PUSH    BYTE +65
017F:00414961 55              PUSH    EBP
017F:00414962 E88978FFFF      CALL    0040C1F0    //由此Call返回,此Call取組織名 
017F:00414967 8D7E32          LEA      EDI,[ESI+32]  //停在此處,EDI指向組織名energy
017F:0041496A 6A32            PUSH    BYTE +32
017F:0041496C 57              PUSH    EDI
017F:0041496D 6A66            PUSH    BYTE +66
017F:0041496F 55              PUSH    EBP
017F:00414970 E87B78FFFF      CALL    0040C1F0
017F:00414975 8D442430        LEA      EAX,[ESP+30]
017F:00414979 6800010000      PUSH    DWORD 0100
017F:0041497E 50              PUSH    EAX
017F:0041497F 6A67            PUSH    BYTE +67
017F:00414981 55              PUSH    EBP
017F:00414982 E86978FFFF      CALL    0040C1F0        //此Call取假序列號
017F:00414987 8D4C2440        LEA      ECX,[ESP+40]  //ECX指向假序列號654321
017F:0041498B 51              PUSH    ECX            //ECX傳遞引數
017F:0041498C E8BE7A0000      CALL    0041C44F    //將假序列號轉化為十六進位制數放入EAX
017F:00414991 56              PUSH    ESI
017F:00414992 8BD8            MOV      EBX,EAX      //將假序列號的十六進位制形式放入EBX
017F:00414994 E8574A0000      CALL    004193F0    //將姓名長度放入EDX,並計算根據姓名計算出的部分和,具體在後面分析
017F:00414999 83C438          ADD      ESP,BYTE +38
017F:0041499C 3D92A71901      CMP      EAX,0119A792  //檢驗部分和是否為0119A792,可能是個超級使用者名稱產生的部分和,只要是滿足這個條件,任何密碼都能註冊,具體沒有深入研究,一般的使用者名稱都不會滿足這個條件,所以都直接跳到004149BB
017F:004149A1 7518            JNZ      004149BB      //不等則跳
017F:004149A3 8B1D68414200    MOV      EBX,[00424168] 
017F:004149A9 68588B4200      PUSH    DWORD 00428B58
017F:004149AE 56              PUSH    ESI
017F:004149AF FFD3            CALL    EBX            //call lstrcpya,使EAX指向Gregory Braun
017F:004149B1 68488B4200      PUSH    DWORD 00428B48
017F:004149B6 57              PUSH    EDI
017F:004149B7 FFD3            CALL    EBX            //call lstrcpya,使EAX指向Software Design
017F:004149B9 EB07            JMP      SHORT 004149C2
017F:004149BB 3D3CCE5F0D      CMP      EAX,0D5FCE3C  //又是一個超級使用者名稱比較
017F:004149C0 750C            JNZ      004149CE    //不等則跳
017F:004149C2 57              PUSH    EDI
017F:004149C3 56              PUSH    ESI
017F:004149C4 E8575E0000      CALL    0041A820
017F:004149C9 83C408          ADD      ESP,BYTE +08
017F:004149CC 8BD8            MOV      EBX,EAX
017F:004149CE 57              PUSH    EDI
017F:004149CF 56              PUSH    ESI
017F:004149D0 E84B5E0000      CALL    0041A820  //關鍵的Call,計算密碼,用F8跟入
017F:004149D5 83C408          ADD      ESP,BYTE +08
017F:004149D8 3BD8            CMP      EBX,EAX    //EBX中為假序列號的十進位制形式,EAX中為真序列號的十進位制形式,D EBX和D EAX可分別看到   
017F:004149DA 5F              POP      EDI
017F:004149DB 741D            JZ      004149FA    //不跳則出錯
017F:004149DD 68CFEA0000      PUSH    DWORD EACF
017F:004149E2 6888130000      PUSH    DWORD 1388
017F:004149E7 55              PUSH    EBP
017F:004149E8 E87375FFFF      CALL    0040BF60    //出錯對話方塊
-----------------------------------------------------------------------------------------
004149D0處用F8跟入後,程式碼如下

017F:0041A820 8B442404        MOV      EAX,[ESP+04]  //使EAX指向姓名gearboy
017F:0041A824 56              PUSH    ESI
017F:0041A825 8B3584D14300    MOV      ESI,[0043D184]
017F:0041A82B 50              PUSH    EAX          //引數傳遞給子程式
017F:0041A82C 81CE78030000    OR      ESI,0378
017F:0041A832 E8B9EBFFFF      CALL    004193F0  //計算部分和的子程式,結果入EAX,關鍵,用F8跟入
017F:0041A837 8B4C2410        MOV      ECX,[ESP+10]  //使ECX指向組織名energy
017F:0041A83B 03F0            ADD      ESI,EAX      //ESI和EAX相加,結果入ESI,註冊碼中間結果
017F:0041A83D 51              PUSH    ECX          //引數傳遞給子程式
017F:0041A83E E8ADEBFFFF      CALL    004193F0      //呼叫同一個計算部分和的子程式,所使用的是組織名
017F:0041A843 83C408          ADD      ESP,BYTE +08
017F:0041A846 03C6            ADD      EAX,ESI      //ESI和EAX相加,結果入EAX,此時EAX中即為正確註冊碼的十六進位制形式
017F:0041A848 5E              POP      ESI
017F:0041A849 C3              RET   
-----------------------------------------------------------------------------------------

0041A832處用F8跟入後,程式碼如下
017F:004193F0 51              PUSH    ECX
017F:004193F1 53              PUSH    EBX
017F:004193F2 8B5C240C        MOV      EBX,[ESP+0C]        //EBX指向姓名gearboy
017F:004193F6 56              PUSH    ESI
017F:004193F7 33F6            XOR      ESI,ESI
017F:004193F9 53              PUSH    EBX
017F:004193FA 8974240C        MOV      [ESP+0C],ESI
017F:004193FE FF1560414200    CALL    `KERNEL32!lstrlenA`    //得到姓名長度,結果入EAX 
017F:00419404 85DB            TEST    EBX,EBX              //測試姓名是否為空
017F:00419406 744F            JZ      00419457            //不言而喻
017F:00419408 85C0            TEST    EAX,EAX              //測試姓名長度是否為零
017F:0041940A 744B            JZ      00419457          //懶得說了
017F:0041940C 33D2            XOR      EDX,EDX
017F:0041940E 85C0            TEST    EAX,EAX
017F:00419410 7E45            JNG      00419457
017F:00419412 55              PUSH    EBP
017F:00419413 57              PUSH    EDI
017F:00419414 BE00974200      MOV      ESI,00429700      //ESI指向金鑰, D 00429700可看到
    金鑰為|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw,這是第一個金鑰,下面還有一個
017F:00419419 BF01000000      MOV      EDI,01    //EDX作計數器,相當於i,i從1到姓名長度n
017F:0041941E 2BF3            SUB      ESI,EBX
017F:00419420 8BCB            MOV      ECX,EBX
017F:00419422 2BFB            SUB      EDI,EBX
017F:00419424 0FBE1C0E        MOVSX    EBX,BYTE [ESI+ECX] //金鑰1的第i字元ASC碼符號擴充套件入EBX
017F:00419428 0FBEAC10C8964200 MOVSX    EBP,BYTE [EAX+EDX+004296C8] //004296C8指向第二個
                金鑰,D 004296C8可看到#serB&nz|mfM1/5(!sd$Mq.{s]+sFjtKpzSdtzoXqmb^Al@dv:s?x/
從金鑰向後第n+i(n=姓名長度)個字元ASC碼入EBP
017F:00419430 0FAFDD          IMUL    EBX,EBP  //兩者帶符號相乘
017F:00419433 8D2C0F          LEA      EBP,[EDI+ECX//計數值i入EBP
017F:00419436 0FAFDD          IMUL    EBX,EBP  //和上面的計算結果帶符號相乘
017F:00419439 0FBE29          MOVSX    EBP,BYTE [ECX//姓名的第i個字元的ASC碼符號擴充套件入EBP
017F:0041943C 0FAFDD          IMUL    EBX,EBP      //再和以上結果相乘入EBX
017F:0041943F 8B6C2410        MOV      EBP,[ESP+10]  //將上次的結果入EBP
017F:00419443 03EB            ADD      EBP,EBX      //上次結果和這次相加
017F:00419445 42              INC      EDX            //計數器加1
017F:00419446 41              INC      ECX              //姓名指標向後移動1位
017F:00419447 3BD0            CMP      EDX,EAX            //檢驗計數值是否小於姓名長度
017F:00419449 896C2410        MOV      [ESP+10],EBP    //這次計算的中間結果入[ESP+10]
017F:0041944D 7CD5            JL      00419424      //小於姓名長度,迴圈
017F:0041944F 8BC5            MOV      EAX,EBP      //計算結果入EAX
017F:00419451 5F              POP      EDI
017F:00419452 5D              POP      EBP
017F:00419453 5E              POP      ESI
017F:00419454 5B              POP      EBX
017F:00419455 59              POP      ECX
017F:00419456 C3              RET   

所以這個子程式是由金鑰1,金鑰2和姓名(或組織名)完成的求和運算過程。最後將這些結果相加,就是正確的註冊碼了。




              歡迎轉載,謝謝。
                              By 季風(gearboy)
                                              2002.4.12

相關文章