傻人有傻福 发表于 2008-3-6 13:14:18

家财宝 家庭日记帐管理 V1.0算法分析(高手飘过)

【破文标题】家财宝 家庭日记帐管理 V1.0算法分析(高手飘过)
【破文作者】我的水平太菜就不写名字了
【作者邮箱】
【作者主页】
【破解工具】PEID+DEDE+OD
【破解平台】WindowsXP
【软件名称】家财宝 家庭日记帐管理
【软件大小】2.05M
【原版下载】 http://www.skycn.com/soft/42771.html
【保护方式】注册码
【软件简介】家财宝是一款适用于家庭或个人日记帐(包括收入、支出、帐户转帐、债务、债权)管理
软件。
系统提供多帐薄管理;家庭成员管理;自定义收支类别。
【破解声明】只为讨论、学习与分享破解技术,勿用于非法用途,请多多支持软件开发者!
------------------------------------------------------------------------
【破解过程】   很久没来给PYG做贡献了,今天来发篇算法,很简单的算法/:013 ,高手可以飘过了。004C8600/.55               push ebp
004C8601|.8BEC               mov ebp,esp
004C8603|.33C9               xor ecx,ecx
004C8605|.51               push ecx
004C8606|.51               push ecx
004C8607|.51               push ecx
004C8608|.51               push ecx
004C8609|.51               push ecx
004C860A|.51               push ecx
004C860B|.51               push ecx
004C860C|.53               push ebx
004C860D|.56               push esi
004C860E|.8BD8               mov ebx,eax
004C8610|.33C0               xor eax,eax
004C8612|.55               push ebp
004C8613|.68 47874C00      push Account.004C8747
004C8618|.64:FF30            push dword ptr fs:
004C861B|.64:8920            mov dword ptr fs:,esp
004C861E|.8D55 F4            lea edx,
004C8621|.8B83 0C030000      mov eax,dword ptr ds:
004C8627|.E8 20ECF8FF      call Account.0045724C                ;取注册码
004C862C|.837D F4 00         cmp ,0                      ;注册码位数和0比较
004C8630|.75 13            jnz short Account.004C8645         ;注册码不为0位就跳
004C8632|.8B83 0C030000      mov eax,dword ptr ds:
004C8638|.8B10               mov edx,dword ptr ds:
004C863A|.FF92 C4000000      call dword ptr ds:
004C8640|.E9 D2000000      jmp Account.004C8717
004C8645|>8D55 F0            lea edx,
004C8648|.8B83 10030000      mov eax,dword ptr ds:
004C864E|.E8 F9EBF8FF      call Account.0045724C                ;取机器码
004C8653|.8B45 F0            mov eax,                  ;机器码放到EAX中
004C8656|.E8 351FF4FF      call Account.0040A590                ;这个CALL是干什么的不明白啊 希望高手能指点一下
004C865B|.DD5D F8            fstp qword ptr ss:
004C865E|.9B               wait
004C865F|.DB2D 54874C00      fld tbyte ptr ds:            ;DS:[]里面的东西应
该是作者的生日19810529
004C8665|.DC45 F8            fadd qword ptr ss:            ;19810529与机器码相加,十进
制的
004C8668|.DD5D F8            fstp qword ptr ss:            ;得出一个数值我把他
叫做变换码
004C866B|.9B               wait
004C866C|.DD45 F8            fld qword ptr ss:
004C866F|.83C4 F4            add esp,-0C
004C8672|.DB3C24             fstp tbyte ptr ss:            ; |
004C8675|.9B               wait                                 ; |
004C8676|.8D45 EC            lea eax,                  ; |
004C8679|.E8 921DF4FF      call Account.0040A410                ; \Account.0040A410
004C867E|.8B45 EC            mov eax,                  ;变换码放到EAX中
004C8681|.50               push eax
004C8682|.8D55 E8            lea edx,
004C8685|.8B83 0C030000      mov eax,dword ptr ds:       ;变换码放到DS:

004C868B|.E8 BCEBF8FF      call Account.0045724C                ;取注册码
004C8690|.8B55 E8            mov edx,                  ;注册码放到EDX中
004C8693|.58               pop eax
004C8694|.E8 9BC0F3FF      call Account.00404734                ;这个是比较CALL
004C8699|.75 64            jnz short Account.004C86FF
004C869B|.B2 01            mov dl,1
004C869D|.A1 A8DC4300      mov eax,dword ptr ds:
004C86A2|.E8 0157F7FF      call Account.0043DDA8
004C86A7|.8BF0               mov esi,eax
004C86A9|.BA 02000080      mov edx,80000002
004C86AE|.8BC6               mov eax,esi
004C86B0|.E8 9357F7FF      call Account.0043DE48
004C86B5|.B1 01            mov cl,1
004C86B7|.BA 68874C00      mov edx,Account.004C8768             ;ASCII
"SOFTWARE\EStarSoft\Account\"
004C86BC|.8BC6               mov eax,esi
004C86BE|.E8 E957F7FF      call Account.0043DEAC
004C86C3|.8D55 E4            lea edx,
004C86C6|.8B83 0C030000      mov eax,dword ptr ds:
004C86CC|.E8 7BEBF8FF      call Account.0045724C
004C86D1|.8B4D E4            mov ecx,
004C86D4|.BA 8C874C00      mov edx,Account.004C878C             ;ASCII "ProductID"
004C86D9|.8BC6               mov eax,esi
004C86DB|.E8 6859F7FF      call Account.0043E048
004C86E0|.8BC6               mov eax,esi
004C86E2|.E8 B1ADF3FF      call Account.00403498
004C86E7|.B8 A0874C00      mov eax,Account.004C87A0
004C86EC|.E8 F3E7F6FF      call Account.00436EE4
004C86F1|.A1 DC0F5000      mov eax,dword ptr ds:
004C86F6|.8B00               mov eax,dword ptr ds:
004C86F8|.E8 6FEDFAFF      call Account.0047746C
004C86FD|.EB 18            jmp short Account.004C8717
004C86FF|>B8 C0874C00      mov eax,Account.004C87C0
004C8704|.E8 DBE7F6FF      call Account.00436EE4
004C8709|.8B83 0C030000      mov eax,dword ptr ds:
004C870F|.8B10               mov edx,dword ptr ds:
004C8711|.FF92 C4000000      call dword ptr ds:
004C8717|>33C0               xor eax,eax
004C8719|.5A               pop edx
004C871A|.59               pop ecx
004C871B|.59               pop ecx
004C871C|.64:8910            mov dword ptr fs:,edx
004C871F|.68 4E874C00      push Account.004C874E
004C8724|>8D45 E4            lea eax,
004C8727|.BA 02000000      mov edx,2
004C872C|.E8 1BBCF3FF      call Account.0040434C
004C8731|.8D45 EC            lea eax,
004C8734|.E8 EFBBF3FF      call Account.00404328
004C8739|.8D45 F0            lea eax,
004C873C|.BA 02000000      mov edx,2
004C8741|.E8 06BCF3FF      call Account.0040434C
004C8746\.C3               retn
------------------------------------------------------------------------------------------
我们进去算法部分看看吧,代码如下:
00404734/$53               push ebx
00404735|.56               push esi
00404736|.57               push edi
00404737|.89C6               mov esi,eax
00404739|.89D7               mov edi,edx
0040473B|.39D0               cmp eax,edx                        ;比较变换码和注册码
0040473D|.0F84 8F000000      je Account.004047D2                  ;相等则跳
00404743|.85F6               test esi,esi
00404745|.74 68            je short Account.004047AF
00404747|.85FF               test edi,edi
00404749|.74 6B            je short Account.004047B6
0040474B|.8B46 FC            mov eax,dword ptr ds:         ;变换码放到DS:[ESI
-4],变换码位数放回到EAX
0040474E|.8B57 FC            mov edx,dword ptr ds:         ;注册码放到DS:[EDI
-4],注册码位数放回到EAX
00404751|.29D0               sub eax,edx                        ;变换码位数减去注册
码位数
00404753|.77 02            ja short Account.00404757            ;变换码的位数大于注
册码的位数的话就跳
00404755|.01C2               add edx,eax                        ;如果变换码位数没有
比注册码位数大的话,这里通过加注册码位数的方法来还原变换码位数
00404757|>52               push edx                           ;变换码位数压栈
00404758|.C1EA 02            shr edx,2                            ;右移2位,相当于除4
0040475B|.74 26            je short Account.00404783            ;不等于0的话就不会
跳,即变换码的位数比1大就不跳了(应该不可能跳吧)
0040475D|>8B0E               /mov ecx,dword ptr ds:          ;变换码前4位以ASCII
的形式放到ECX中
0040475F|.8B1F               |mov ebx,dword ptr ds:          ;注册码前4位顺序以
ASCII的形式放到ECX中
00404761|.39D9               |cmp ecx,ebx                         ;两者比较
00404763|.75 58            |jnz short Account.004047BD          ;不等则跳
00404765|.4A               |dec edx                           ;EDX减一
00404766|.74 15            |je short Account.0040477D         ;EDX等于0的话就跳
00404768|.8B4E 04            |mov ecx,dword ptr ds:      ;变换码再取4位顺序
以ASCII的形式放到ECX中
0040476B|.8B5F 04            |mov ebx,dword ptr ds:      ;注册码再取4位顺序
以ASCII的形式放到ECX中
0040476E|.39D9               |cmp ecx,ebx                         ;两者比较
00404770|.75 4B            |jnz short Account.004047BD          ;不等则跳
00404772|.83C6 08            |add esi,8                           ;加8,相当于留下了8
位后的东西
00404775|.83C7 08            |add edi,8                           ;加8,相当与留下了8
位后的东西
00404778|.4A               |dec edx                           ;EDX再减一
00404779|.^ 75 E2            \jnz short Account.0040475D
0040477B|.EB 06            jmp short Account.00404783
0040477D|>83C6 04            add esi,4
00404780|.83C7 04            add edi,4
00404783|>5A               pop edx
00404784|.83E2 03            and edx,3                            ;与3取与运算,相当
于2进制的只保留最后两位
00404787|.74 22            je short Account.004047AB
00404789|.8B0E               mov ecx,dword ptr ds:         ;上面的指向的保留的
放到ECX中
0040478B|.8B1F               mov ebx,dword ptr ds:         ;上面的指向的保留的
放到EBX中
0040478D|.38D9               cmp cl,bl                            ;比较低位部分
0040478F|.75 41            jnz short Account.004047D2         ;不等则跳
00404791|.4A               dec edx
00404792|.74 17            je short Account.004047AB
00404794|.38FD               cmp ch,bh                            ;比较高位部分
00404796|.75 3A            jnz short Account.004047D2         ;不等则跳
00404798|.4A               dec edx                              ;EDX减1
00404799|.74 10            je short Account.004047AB
0040479B|.81E3 0000FF00      and ebx,0FF0000
004047A1|.81E1 0000FF00      and ecx,0FF0000
004047A7|.39D9               cmp ecx,ebx
004047A9|.75 27            jnz short Account.004047D2
004047AB|>01C0               add eax,eax
004047AD|.EB 23            jmp short Account.004047D2
004047AF|>8B57 FC            mov edx,dword ptr ds:
004047B2|.29D0               sub eax,edx
004047B4|.EB 1C            jmp short Account.004047D2
004047B6|>8B46 FC            mov eax,dword ptr ds:
004047B9|.29D0               sub eax,edx
004047BB|.EB 15            jmp short Account.004047D2
004047BD|>5A               pop edx
004047BE|.38D9               cmp cl,bl                            ;比较低位,即比较第
一位
004047C0|.75 10            jnz short Account.004047D2         ;不等则跳
004047C2|.38FD               cmp ch,bh                            ;比较高位,即比较第
二位
004047C4|.75 0C            jnz short Account.004047D2         ;不等则跳
004047C6|.C1E9 10            shr ecx,10                           ;变换码“这段”除以
1024(2的10次方),16进制右移4位
004047C9|.C1EB 10            shr ebx,10                           ;注册码“这段”除以
1024(2的10次方),16进制右移4位
004047CC|.38D9               cmp cl,bl                            ;比较低位,即比较“
这段”第三位
004047CE|.75 02            jnz short Account.004047D2         ;不等则跳
004047D0|.38FD               cmp ch,bh                            ;比较高位即比较这段
第四位
004047D2|>5F               pop edi
004047D3|.5E               pop esi
004047D4|.5B               pop ebx
004047D5\.C3               retn 算法总结:这个算法总的就是比较注册码与变换码是否相等,从0040473D到这段代码的结束其实是在分
段比较,分别分4位、4位、2位来比较,所以我上面的说明用了“这段”的说法,这段比较不等后还进行
段内的逐位比较(不明白是什么用意,除非与变换码一样才会注册成功,其他的是不行的,为什么还要这
样比较呢?希望高手能解答一下),所以总的来说就是注册码直接与变换码的直接比较。
算法注册机相信只要学过编程都可以写的出来,大家可以自己写下留做纪念*^_^*
补充一下:刚才看了tianxj的回帖 发现我一个地方写错了 算法总结说了一堆的废话却没有说到重点
注册码确实就是机器码+19810529,感谢tianxj的补充 表示感谢
------------------------------------------------------------------------
【破解总结】算法不难,碰巧让我菜鸟碰上了,不敢私藏。愿与像我这样的菜鸟分享。最好是看我的破
文之前先自己动手弄一下,实在不行了再来看我的破文,保证提升的比较快*^_^*
                      感谢PYG的培养,带我走进破解的大门
------------------------------------------------------------------------
【版权声明】破文版权归我,转载版权归你。欢迎转载,盗版不究。如果能帮我改正和补充一下的话我
会更高兴的*^_^*

[ 本帖最后由 傻人有傻福 于 2008-3-6 19:55 编辑 ]

magic659117852 发表于 2008-3-6 13:56:37

/:001 跟着楼主走一遍。。。

443989025 发表于 2008-3-6 14:08:26

楼主的解释很详细哇,我也照着来两次哇,哈哈。谢谢分享
/:014

magic659117852 发表于 2008-3-6 14:29:43

:loveliness: 菜鸟不懂算法..


004C8699   75变74
004F0615   75变74

MS这样就爆破成功了。。。

[ 本帖最后由 magic659117852 于 2008-3-6 14:44 编辑 ]

105200951 发表于 2008-3-6 16:52:34

用od载入,查找字符串ASCII,,找到注册失败,直接有一个向上跳的关键跳,在关键跳上关键CALL下断,直接追码就可以了 我的是 1213452007

mz1288 发表于 2008-3-6 17:31:41

=真晕! 我都看迷糊了!!!

tianxj 发表于 2008-3-6 19:03:06

004C8656|.E8 351FF4FF      call Account.0040A590                ;这个CALL是干什么的不明白啊 希望高手能指点一下

我不是高手,那个CALL是将字符串转为浮点数字

tianxj 发表于 2008-3-6 19:25:49

004C8694|.E8 9BC0F3FF      call Account.00404734                ;应该是算法CALL


这个不是算法 CALL,是比较CALL/:L

tianxj 发表于 2008-3-6 19:28:18

算法就是采用浮点运算
注册码=机器码+19810529

lxk836 发表于 2008-3-6 19:49:46

tianxj 好强/:good
页: [1] 2
查看完整版本: 家财宝 家庭日记帐管理 V1.0算法分析(高手飘过)