• 标 题:分析破解某个软件公司出的理财东东! (14千字)
  • 作 者:★★风尘★★
  • 时 间:2002-5-15 19:06:27
  • 链 接:http://bbs.pediy.com

分析破解某个家庭理财东东  (加强版)
    本人在很多地方看到过这个软件的破解文献,但好象大虾们都没有给出算法分析,看来高手不屑一写,所以只有我这种小菜来写啦,呵呵~~~让高手见笑了.
软件简介:这是某个公司出的家庭理财东东。破解它比较容易,适合初学者用来作练习题。
软件下载: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日