分析破解某個軟體公司出的理財東東! (14千字)

看雪資料發表於2015-11-15

分析破解某個家庭理財東東  (加強版)
    本人在很多地方看到過這個軟體的破解文獻,但好象大蝦們都沒有給出演算法分析,看來高手不屑一寫,所以只有我這種小菜來寫啦,呵呵~~~讓高手見笑了.
軟體簡介:這是某個公司出的家庭理財東東。破解它比較容易,適合初學者用來作練習題。
軟體下載:http://www.moneywise.com.cn/downcenter.htm
破解工具:FileInfo  TRW 2000(帶FPU浮點外掛)
破解過程:
(1)先用Fi檢視軟體,發現軟體沒有加殼。(呵呵~~~真是個練手的好機會,不用脫殼就能玩.)
(2)執行TRW,再把《這個家庭理財東東》軟體拖入TRW視窗,載入除錯後按CTR+N返回。
(3)填寫好註冊號碼,先隨便填寫。我的機器碼:8263-5933  我填的註冊碼:12345678
(4)按下CTR+N回到TRW中。在命令列,
    輸入:bpx hmemcpy    回車        (用記憶體複製函式給它下斷點。)
    輸入:bl            回車        (檢視下好的斷點是不是成功了)
    按下:CTR+N                      (返回《家庭理財東東》軟體,跟蹤函式的呼叫)
(5)按下注冊面版“完成註冊”鍵。
(6)這時,回到了TRW視窗。表明《這個家庭理財東東》程式呼叫了hmemcpy(記憶體複製函式),跟蹤成功了。
    在命令列,
    輸入:bc              回車      (撤消斷點)
    輸入:pmodule        回車      (函式回到程式《家庭理財東東》領空)
    這時,大家會看到一段如下的匯篇程式碼:
017F:004C5618 8B45FC          MOV      EAX,[EBP-04]
017F:004C561B E850F8FFFF      CALL    004C4E70          (這個call很關鍵)
017F:004C5620 84C0            TEST    AL,AL
017F:004C5622 744F            JZ      004C5673          (關鍵跳轉)
呵呵~~在此處改跳轉,就可以把該軟體爆破,但僅僅這樣做我們是不會滿意的,難到不是嗎?呵呵~~找出演算法並寫出序號產生器才是我們追求的最終目標。
017F:004C5624 A130EF6600      MOV      EAX,[0066EF30]
017F:004C5629 8B00            MOV      EAX,[EAX]
017F:004C562B 8B55FC          MOV      EDX,[EBP-04]
        繼續再往下走,就會跳出出錯對話方塊。
(7)來到  017F:004C561B E850F8FFFF      CALL    004C4E70  中,我們來分析作者的求註冊碼演算法分析思路。
我們會看到一段如下的匯篇程式碼:
………………此處省略了一些無關緊要的彙編程式碼………………
017F:004C4E93 8D45F4          LEA      EAX,[EBP-0C]      (把所填的註冊碼放到EAX中)
017F:004C4E96 E831FFFFFF      CALL    004C4DCC          (透過這個CALL取了機器碼:8263-5933 )
017F:004C4E9B 8B45F4          MOV      EAX,[EBP-0C]
017F:004C4E9E 8D55F8          LEA      EDX,[EBP-08]
017F:004C4EA1 E846FFFFFF      CALL    004C4DEC         
017F:004C4EA6 8B45F8          MOV      EAX,[EBP-08]      ( 在EAX中有註冊碼4339-4142)
017F:004C4EA9 E8FAFCFFFF      CALL    004C4BA8
017F:004C4EAE 8BD8            MOV      EBX,EAX
017F:004C4EB0 8B45FC          MOV      EAX,[EBP-04]     
017F:004C4EB3 E8F0FCFFFF      CALL    004C4BA8         
017F:004C4EB8 85C0            TEST    EAX,EAX
017F:004C4EBA 7504            JNZ      004C4EC0
017F:004C4EBC 33DB            XOR      EBX,EBX
017F:004C4EBE EB0A            JMP      SHORT 004C4ECA
017F:004C4EC0 3BC3            CMP      EAX,EBX
017F:004C4EC2 7504            JNZ      004C4EC8
017F:004C4EC4 B301            MOV      BL,01
017F:004C4EC6 EB02            JMP      SHORT 004C4ECA
017F:004C4EC8 33DB            XOR      EBX,EBX
017F:004C4ECA 33C0            XOR      EAX,EAX
017F:004C4ECC 5A              POP      EDX
017F:004C4ECD 59              POP      ECX
017F:004C4ECE 59              POP      ECX
017F:004C4ECF 648910          MOV      [FS:EAX],EDX
017F:004C4ED2 68EC4E4C00      PUSH    DWORD 004C4EEC
017F:004C4ED7 8D45F4          LEA      EAX,[EBP-0C]
017F:004C4EDA BA03000000      MOV      EDX,03
017F:004C4EDF E8FCF0F3FF      CALL    00403FE0
017F:004C4EE4 C3              RET                                   
(8)呵呵~~在:017F:004C4EA6 8B45F8    MOV    EAX,[EBP-08] 的 EAX我們看到了註冊碼,說明在上面的:  017F:004C4EA1 E846FFFFFF      CALL    004C4DEC  中大有蹊蹺,我們跟進去瞧瞧。
017F:004C4E0F 8B45FC          MOV      EAX,[EBP-04]
017F:004C4E12 E891FDFFFF      CALL    004C4BA8
017F:004C4E17 8BD8            MOV      EBX,EAX        發現(EAX=000E8D1C)
017F:004C4E19 85DB            TEST    EBX,EBX
017F:004C4E1B 7509            JNZ      004C4E26
017F:004C4E1D 8BC6            MOV      EAX,ESI
(9)不難發現,我們在004C4E17中發現了一個可疑的數EAX=E8D1C,暫且不管他,我們繼續往下看:
………………此處省略了一些無關緊要的彙編程式碼………………
017F:004C4E0F 8B45FC          MOV      EAX,[EBP-04]
017F:004C4E12 E891FDFFFF      CALL    004C4BA8
017F:004C4E17 8BD8            MOV      EBX,EAX            (注意此處的EAX=000E8D1C)
017F:004C4E19 85DB            TEST    EBX,EBX
017F:004C4E1B 7509            JNZ      004C4E26
017F:004C4E1D 8BC6            MOV      EAX,ESI
017F:004C4E1F E898F1F3FF      CALL    00403FBC
017F:004C4E24 EB27            JMP      SHORT 004C4E4D
017F:004C4E26 2B1DD0B96600    SUB      EBX,[0066B9D0]      (將EBX-34B263C=FCC366E0放入EBX中)
017F:004C4E2C 895DF4          MOV      [EBP-0C],EBX
017F:004C4E2F 33C0            XOR      EAX,EAX
017F:004C4E31 8945F8          MOV      [EBP-08],EAX
017F:004C4E34 DF6DF4          FILD    QWORD [EBP-0C]      (將[ebp-0c]中的數放到浮點暫存器st)
017F:004C4E37 DC0DD4B96600    FMUL    QWORD [0066B9D4]    (將st 乘於[0066b9d4]中的數,結果放到st 中)
017F:004C4E3D E8CEDEF3FF      CALL    00402D10
017F:004C4E42 8BD8            MOV      EBX,EAX
017F:004C4E44 8BD6            MOV      EDX,ESI
017F:004C4E46 8BC3            MOV      EAX,EBX
017F:004C4E48 E867FCFFFF      CALL    004C4AB4
017F:004C4E4D 33C0            XOR      EAX,EAX
017F:004C4E4F 5A              POP      EDX
017F:004C4E50 59              POP      ECX
哎~~EAX=E8D1C 很可疑呀,後來還對它進行了浮點運算,那我們不妨跟到004C4E12這個CALL中去逛逛.     
(10)這時可要仔細觀察呀,看看有什麼“新大陸”沒有!
017F:004C4C15 E88251F4FF      CALL    00409D9C
017F:004C4C1A 33C9            XOR      ECX,ECX
017F:004C4C1C 33F6            XOR      ESI,ESI
017F:004C4C1E B806000000      MOV      EAX,06              (把06放入EAX中)
017F:004C4C23 8B55F8          MOV      EDX,[EBP-08]        (把機器碼:82635933放入EDX)
017F:004C4C26 0FB65402FF      MOVZX    EDX,BYTE [EDX+EAX-01](取機器碼:82635933數中的倒數第三個數9放到EDX)
017F:004C4C2B 83EA30          SUB      EDX,BYTE +30        (39-30=9)
017F:004C4C2E 03F2            ADD      ESI,EDX              (把9放到ESI中)
017F:004C4C30 03C9            ADD      ECX,ECX             
017F:004C4C32 8D0C89          LEA      ECX,[ECX+ECX*4]      (把[ECX+ECX*4]的偏移地址放入ECX中)
017F:004C4C35 03D1            ADD      EDX,ECX              (EDX與ECX相加,再把數值放到EDX中)
017F:004C4C37 8BCA            MOV      ECX,EDX              (把EDX中的數放到ECX中)
017F:004C4C39 48              DEC      EAX                  (EAX減1,作為條件來實現一個迴圈)
017F:004C4C3A 85C0            TEST    EAX,EAX              (異或EAX,標誌位作為下面跳轉的條件)
017F:004C4C3C 75E5            JNZ      004C4C23            (為1則跳轉,為0則不會跳轉)迴圈了6次
017F:004C4C3E 33D2            XOR      EDX,EDX                 
017F:004C4C40 B808000000      MOV      EAX,08              (把08放入EAX中)
017F:004C4C45 03D2            ADD      EDX,EDX               
017F:004C4C47 8D1492          LEA      EDX,[EDX+EDX*4]       
017F:004C4C4A 8B5DF8          MOV      EBX,[EBP-08]        (把機器碼82635933放入EBX)
017F:004C4C4D 0FB65C03FF      MOVZX    EBX,BYTE [EBX+EAX-01](取機器碼:82635933數中的倒數第一個數3放到EBX)
017F:004C4C52 83EB30          SUB      EBX,BYTE +30        (33-30=3)
017F:004C4C55 03D3            ADD      EDX,EBX              (EDX與EBX相加,再把值放到EDX中)
017F:004C4C57 48              DEC      EAX                  (EAX減1)
017F:004C4C58 83F806          CMP      EAX,BYTE +06        (用EAX-6得到的值來作為跳轉的條件)
017F:004C4C5B 75E8            JNZ      004C4C45            (為1則跳轉,為0則不會跳轉)迴圈了2次
017F:004C4C5D 3BF2            CMP      ESI,EDX              (比較ESI與EDX的值)
017F:004C4C5F 7404            JZ      004C4C65
017F:004C4C61 33DB            XOR      EBX,EBX              (EAX清零)
017F:004C4C63 EB02            JMP      SHORT 004C4C67
017F:004C4C65 8BD9            MOV      EBX,ECX
017F:004C4C67 33C0            XOR      EAX,EAX
017F:004C4C69 5A              POP      EDX                  (EDX壓如棧)
017F:004C4C6A 59              POP      ECX                  (ECX壓如棧)
017F:004C4C6B 59              POP      ECX                  (ECX壓如棧)
017F:004C4C6C 648910          MOV      [FS:EAX],EDX
017F:004C4C6F 68894C4C00      PUSH    DWORD 004C4C89
017F:004C4C74 8D45F8          LEA      EAX,[EBP-08]
017F:004C4C77 BA02000000      MOV      EDX,02
017F:004C4C7C E85FF3F3FF      CALL    00403FE0
017F:004C4C81 C3              RET   
(11)呵呵,透過上面的分析,我們不難發現,作者程式中註冊碼的第一部分演算法是:把機器碼(我的機器碼是:82635933)從倒數第三個數取起,進行一系列的整除求餘運算,其中共迴圈6次,這時得到一個數(我的是:000E8D1C).這個數參加下一步的註冊碼運算.  我們這時跳出這個CALL,來到:
017F:004C4E24 EB27            JMP      SHORT 004C4E4D 這個程式塊中,
我們接著來分析下一步的演算法.
017F:004C4E26 2B1DD0B96600    SUB      EBX,[0066B9D0]      (將EBX-34B263C=FCC366E0放入EBX中)
017F:004C4E2C 895DF4          MOV      [EBP-0C],EBX
017F:004C4E2F 33C0            XOR      EAX,EAX            (EAX清零)
017F:004C4E31 8945F8          MOV      [EBP-08],EAX
017F:004C4E34 DF6DF4          FILD    QWORD [EBP-0C]      (將[ebp-0c]中的數放到浮點暫存器st)
017F:004C4E37 DC0DD4B96600    FMUL    QWORD [0066B9D4]    (將st 乘於[0066b9d4]中的數,結果放到st 中)
017F:004C4E3D E8CEDEF3FF      CALL    00402D10           
017F:004C4E42 8BD8            MOV      EBX,EAX            (EAX=F018AE56放入EBX中) 
017F:004C4E44 8BD6            MOV      EDX,ESI
017F:004C4E46 8BC3            MOV      EAX,EBX
017F:004C4E48 E867FCFFFF      CALL    004C4AB4            可疑的CALL
017F:004C4E4D 33C0            XOR      EAX,EAX
017F:004C4E4F 5A              POP      EDX       
(12)呵呵~~透過上面的浮點運算,我們得到:EAX=F018AE56 ,記下這個很重要的數字,我們來到前面說的那可疑的CALL前,然後按F8往裡走。
  哈哈……來到“004C4E48    CALL    004C4AB4 ”可疑的CALL中仔細觀察後,我們發現勝利就在眼前。
017F:004C4AD8 E8DFF4F3FF      CALL    00403FBC
017F:004C4ADD 33FF            XOR      EDI,EDI
017F:004C4ADF BB06000000      MOV      EBX,06              (把06放入 EBX中,做計數器)
017F:004C4AE4 8B45FC          MOV      EAX,[EBP-04]        (把F018AE56放入EAX中)
017F:004C4AE7 B90A000000      MOV      ECX,0A              (把0A放入ECX中,做為除數)
017F:004C4AEC 33D2            XOR      EDX,EDX            (EDX清零)
017F:004C4AEE F7F1            DIV      ECX                (EAX除ECX,餘數在EDX中)
017F:004C4AF0 8BF2            MOV      ESI,EDX            (把得到的餘數4放入ESI中)
017F:004C4AF2 03FE            ADD      EDI,ESI            (EDI+ESI結果放到EDI中)
017F:004C4AF4 8D45F0          LEA      EAX,[EBP-10]        (把[EBP-10]的偏移地址放入EAX中)
017F:004C4AF7 8D5630          LEA      EDX,[ESI+30]        (把[ESI+30]的偏移地址放入EAX中) 
017F:004C4AFA E865F6F3FF      CALL    00404164           
017F:004C4AFF 8B55F0          MOV      EDX,[EBP-10]   
017F:004C4B02 8D45F4          LEA      EAX,[EBP-0C]        (把[EBP-0C]的偏移地址放入EAX中)
017F:004C4B05 E84AF7F3FF      CALL    00404254
017F:004C4B0A 8B45FC          MOV      EAX,[EBP-04]        (把0A放入ECX中,做為除數)
017F:004C4B0D B90A000000      MOV      ECX,0A           
017F:004C4B12 33D2            XOR      EDX,EDX            (EDX清零)
017F:004C4B14 F7F1            DIV      ECX                (EAX除ECX,餘數在EDX中)
017F:004C4B16 8945FC          MOV      [EBP-04],EAX       
017F:004C4B19 4B              DEC      EBX                (用EBX-1的結果來作為迴圈的辨別條件)
017F:004C4B1A 75C8            JNZ      004C4AE4            (上面的結果為1則跳,為0則不跳)
這一段程式把透過第一部分運算得到的常數F018AE56進行了一系列的迴圈整除求餘運算,每迴圈一次,得到一位註冊碼。我透過運算依次得到的註冊碼為:4.3.3.9.4.1
017F:004C4B1C BB02000000      MOV      EBX,02              (把02放入 EBX中,做計數器) 
017F:004C4B21 8BC7            MOV      EAX,EDI            (EDI中的數放到EAX中)
017F:004C4B23 B90A000000      MOV      ECX,0A              (把0A放入ECX中,做為除數)
017F:004C4B28 33D2            XOR      EDX,EDX            (EDX清零)
017F:004C4B2A F7F1            DIV      ECX                (EAX除ECX,餘數在EDX中)
017F:004C4B2C 8BF2            MOV      ESI,EDX            (把EDX中的值放入ESI中)
017F:004C4B2E 8D45EC          LEA      EAX,[EBP-14]        (把[EBP-14]的偏移地址放入EAX中)
017F:004C4B31 8D5630          LEA      EDX,[ESI+30]        (把[EBP+30]的偏移地址放入EAX中)
017F:004C4B34 E82BF6F3FF      CALL    00404164
017F:004C4B39 8B55EC          MOV      EDX,[EBP-14]       
017F:004C4B3C 8D45F4          LEA      EAX,[EBP-0C]        (把[EBP-0C]的偏移地址放入EAX中)
017F:004C4B3F E810F7F3FF      CALL    00404254
017F:004C4B44 8BC7            MOV      EAX,EDI
017F:004C4B46 B90A000000      MOV      ECX,0A              (把0A放入ECX中,做為除數)
017F:004C4B4B 33D2            XOR      EDX,EDX            (EDX清零)
017F:004C4B4D F7F1            DIV      ECX                (EAX除ECX,餘數在EDX中)
017F:004C4B4F 8BF8            MOV      EDI,EAX         
017F:004C4B51 4B              DEC      EBX                (用EBX-1的結果來作為迴圈的辨別條件)
017F:004C4B52 75CD            JNZ      004C4B21            (上面的結果為1則跳,為0則不跳) 
這一段程式把上面運算得到的數ESI=18進行了迴圈整除求餘運算,每迴圈一次,得到一位註冊碼。我依次運算得到的註冊碼:4.2
017F:004C4B54 8D55F4          LEA      EDX,[EBP-0C]
017F:004C4B57 B905000000      MOV      ECX,05
017F:004C4B81 BA03000000      MOV      EDX,03
017F:004C4B86 E855F4F3FF      CALL    00403FE0
          哈哈……跟蹤到這裡,我們也就發現了註冊碼的另一部分重要演算法了!
(13)呵呵~~~~~接下來我們看看程式最後還要做的事情:把算出的註冊碼4.3.3.9.4.1.4.2 換成另外一種形式“4339-4142”,這就是我的註冊碼。
    透過整理這兩大部分的演算法分析,我們就能得到整個程式註冊碼的演算法了。哈哈……任務完成了!



      作者學破解時間不長,不足處還望各位朋友給予指導和幫助,在此,作者先謝謝大家了!
              歡迎各位破解愛好者來相互交流學習!Emial:bomber1949@sina.com            QQ:32069691
                                                                                                          風塵(長沙)
                                          2002年5月15日

相關文章