吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 61147|回复: 189
收起左侧

[原创] 电脑算命专家(原名:半仙算命)2010 build07.01 爆破+追码+算法分析+注册机编写

  [复制链接]
2666fff 发表于 2010-7-13 18:40
本帖最后由 2666fff 于 2010-7-13 18:44 编辑

【文章标题】: 电脑算命专家(原名:半仙算命)2010 build07.01 爆破+追码+算法分析+注册机编写
【文章作者】: 2666fff
【作者邮箱】: wan0001@brauer.vic.edu.au
【软件名称】: 电脑算命专家(软件原名:半仙算命) 2010 build 07.01
【下载地址】: http://www.onlinedown.net/soft/45454.htm
【保护方式】: 注册码
【使用工具】: OD Loadpe IR DEDE 电脑 键盘 鼠标 鼠标垫 ……
【软件介绍】:〖电脑算命专家〗软件是目前网上功能最为强大,内容最为丰富的算命工具。软件集成了多种测算选项,测算内容、测算项目极其丰富,包括姓名吉凶测算、命运推算、科学起名 ...
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  Peid查壳 PECompact 2.x -> Jeremy Collake
  exe info查 PEcompact ver.2.78a ~2.94  - www.bitsum.com
  反正就是pecompact了,脱吧。
  OD载入
  00401000 >  B8 74BA6E00     mov eax,ssbx.006EBA74
  00401005    50              push eax                                 ; 有push就esp吧
  00401006    64:FF35 0000000>push dword ptr fs:[0]
  0040100D    64:8925 0000000>mov dword ptr fs:[0],esp
  00401014    33C0            xor eax,eax
  00401016    8908            mov dword ptr ds:[eax],ecx
  00401018    50              push eax
  
  F9一次之后硬件断点不要删除,继续按,我这里是一直按了4次f9,然后就直接到了这里:
  006EBB36  - FFE0            jmp eax                                  ; 4次F9到了这里
  006EBB38    1852 58         sbb byte ptr ds:[edx+0x58],dl
  
  一个大跳,很明显就是要到oep的地方,单步一下。
  00585218    55              push ebp                                 ; 这里就是OEP了 直接dump
  00585219    8BEC            mov ebp,esp
  0058521B    83C4 F0         add esp,-0x10
  0058521E    53              push ebx
  0058521F    B8 284B5800     mov eax,ssbx.00584B28
  00585224    E8 AB20E8FF     call ssbx.004072D4
  00585229    8B1D 6C9C5800   mov ebx,dword ptr ds:[0x589C6C]          ; ssbx.0058AC38
  0058522F    8B03            mov eax,dword ptr ds:[ebx]
  00585231    E8 7241EEFF     call ssbx.004693A8
  
  loadpe 脱壳, import REC修复,PEID再查壳 Borland Delphi 6.0 - 7.0
  
  Delphi 写的,载入DEDE吧。
  
  载入后,点击 窗体 一栏,发现有很多TForm,一个个点开看下,然后,就在TForm2这里发现了 注册声明 字样,
  
  往下拉,又发现:
      object BitBtn1: TBitBtn
        Left = 12
        Top = 268
        Width = 89
        Height = 25
        Caption = 确认注册
        TabOrder = 2
        OnClick = BitBtn1Click
      end
  
  恩,BitBtn1Click 这个就是注册的按钮了, 进入 窗体 旁边的 过程 一栏,单击 TForm2, 里面果然有 BitBtn1Click
  这个,看RVA是 0056D034 很明显,这个就是按钮事件的地址了。
  ok,OD载入我们脱好壳的文件, Ctrl + G 进入 0056D034 这个地址,F2下断,F9运行。
  
  0056D034   .  55            push ebp                           //F2
  0056D035   .  8BEC          mov ebp,esp
  0056D037   .  81C4 80FEFFFF add esp,-0x180
  0056D03D   .  53            push ebx
  0056D03E   .  33C9          xor ecx,ecx
  0056D040   .  898D 80FEFFFF mov dword ptr ss:[ebp-0x180],ecx
  0056D046   .  898D 8CFEFFFF mov dword ptr ss:[ebp-0x174],ecx
  0056D04C   .  898D 88FEFFFF mov dword ptr ss:[ebp-0x178],ecx
  0056D052   .  898D 84FEFFFF mov dword ptr ss:[ebp-0x17C],ecx
  0056D058   .  898D 94FEFFFF mov dword ptr ss:[ebp-0x16C],ecx
  0056D05E   .  898D 90FEFFFF mov dword ptr ss:[ebp-0x170],ecx
  0056D064   .  898D 9CFEFFFF mov dword ptr ss:[ebp-0x164],ecx
  0056D06A   .  898D 98FEFFFF mov dword ptr ss:[ebp-0x168],ecx
  0056D070   .  898D A4FEFFFF mov dword ptr ss:[ebp-0x15C],ecx
  0056D076   .  898D A0FEFFFF mov dword ptr ss:[ebp-0x160],ecx
  0056D07C   .  8945 FC       mov dword ptr ss:[ebp-0x4],eax
  0056D07F   .  33C0          xor eax,eax
  
  程序打开了,进入注册页面,随便输入序列号以及注册码,点击注册按钮,OD已经断下来了。
  
  F8单步向下走。
  0056D0A6   .  E8 514BF0FF   call dumped_.00471BFC
  0056D0AB   .  8945 F8       mov dword ptr ss:[ebp-0x8],eax
  0056D0AE   .  BA 02000080   mov edx,0x80000002
  0056D0B3   .  8B45 F8       mov eax,dword ptr ss:[ebp-0x8]
  0056D0B6   .  E8 E14BF0FF   call dumped_.00471C9C
  0056D0BB   .  B1 01         mov cl,0x1
  0056D0BD   .  BA 68D35600   mov edx,dumped_.0056D368                 ;  SOFTWARE\Microsoft\Yhds
  0056D0C2   .  8B45 F8       mov eax,dword ptr ss:[ebp-0x8]
  0056D0C5   .  E8 364CF0FF   call dumped_.00471D00                    ;  读取注册表信息
  0056D0CA   .  8D95 A0FEFFFF lea edx,dword ptr ss:[ebp-0x160]
  0056D0D0   .  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
  0056D0D3   .  8B98 F8020000 mov ebx,dword ptr ds:[eax+0x2F8]
  0056D0D9   .  8BC3          mov eax,ebx
  0056D0DB   .  E8 60B1EDFF   call dumped_.00448240
  0056D0E0   .  8B85 A0FEFFFF mov eax,dword ptr ss:[ebp-0x160]         ;  出现注册名
  0056D0E6   .  8D95 A4FEFFFF lea edx,dword ptr ss:[ebp-0x15C]
  0056D0EC   .  E8 0BC4E9FF   call dumped_.004094FC
  0056D0F1   .  8B95 A4FEFFFF mov edx,dword ptr ss:[ebp-0x15C]
  0056D0F7   .  8BC3          mov eax,ebx
  0056D0F9   .  E8 72B1EDFF   call dumped_.00448270
  0056D0FE   .  8D95 98FEFFFF lea edx,dword ptr ss:[ebp-0x168]
  0056D104   .  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
  0056D107   .  8B98 00030000 mov ebx,dword ptr ds:[eax+0x300]
  0056D10D   .  8BC3          mov eax,ebx
  0056D10F   .  E8 2CB1EDFF   call dumped_.00448240
  0056D114   .  8B85 98FEFFFF mov eax,dword ptr ss:[ebp-0x168]
  0056D11A   .  8D95 9CFEFFFF lea edx,dword ptr ss:[ebp-0x164]         ;  出现假注册码
  0056D120   .  E8 D7C3E9FF   call dumped_.004094FC
  0056D125   .  8B95 9CFEFFFF mov edx,dword ptr ss:[ebp-0x164]
  0056D12B   .  8BC3          mov eax,ebx
  0056D12D   .  E8 3EB1EDFF   call dumped_.00448270
  0056D132   .  8D95 94FEFFFF lea edx,dword ptr ss:[ebp-0x16C]
  0056D138   .  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
  0056D13B   .  8B80 00030000 mov eax,dword ptr ds:[eax+0x300]
  0056D141   .  E8 FAB0EDFF   call dumped_.00448240
  0056D146   .  83BD 94FEFFFF>cmp dword ptr ss:[ebp-0x16C],0x0
  0056D14D   .  74 1D         je short dumped_.0056D16C
  0056D14F   .  8D95 90FEFFFF lea edx,dword ptr ss:[ebp-0x170]
  0056D155   .  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
  0056D158   .  8B80 F8020000 mov eax,dword ptr ds:[eax+0x2F8]
  0056D15E   .  E8 DDB0EDFF   call dumped_.00448240
  0056D163   .  83BD 90FEFFFF>cmp dword ptr ss:[ebp-0x170],0x0
  0056D16A   .  75 0F         jnz short dumped_.0056D17B
  0056D16C   >  B8 88D35600   mov eax,dumped_.0056D388                 ;  注册信息没有填写齐全
  0056D171   .  E8 563EEDFF   call dumped_.00440FCC
  0056D176   .  E9 6D010000   jmp dumped_.0056D2E8
  0056D17B   >  8D95 8CFEFFFF lea edx,dword ptr ss:[ebp-0x174]
  0056D181   .  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
  0056D184   .  8B80 00030000 mov eax,dword ptr ds:[eax+0x300]
  0056D18A   .  E8 B1B0EDFF   call dumped_.00448240
  0056D18F   .  8B85 8CFEFFFF mov eax,dword ptr ss:[ebp-0x174]
  0056D195   .  50            push eax
  0056D196   .  8D95 84FEFFFF lea edx,dword ptr ss:[ebp-0x17C]
  0056D19C   .  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
  0056D19F   .  8B80 F8020000 mov eax,dword ptr ds:[eax+0x2F8]
  0056D1A5   .  E8 96B0EDFF   call dumped_.00448240
  0056D1AA   .  8B85 84FEFFFF mov eax,dword ptr ss:[ebp-0x17C]
  0056D1B0   .  E8 4BC7E9FF   call dumped_.00409900
  0056D1B5   .  6BC0 70       imul eax,eax,0x70                        ;  用户名的16进制乘上70
  0056D1B8   .  8D95 88FEFFFF lea edx,dword ptr ss:[ebp-0x178]
  0056D1BE   .  E8 7DFDFFFF   call dumped_.0056CF40                    ;  关键算法call,F7进入。
  0056D1C3   .  8B95 88FEFFFF mov edx,dword ptr ss:[ebp-0x178]
  0056D1C9   .  58            pop eax                                  ;  这里堆栈出现真码,追码一直到这里就算完成了。
  0056D1CA   .  E8 217EE9FF   call dumped_.00404FF0
  0056D1CF      0F85 F3000000 jnz dumped_.0056D2C8                     ;  关键跳,跳了就死,nop掉就爆破了。
  0056D1D5   .  BA A8D35600   mov edx,dumped_.0056D3A8                 ;  ssbf.dll
  0056D1DA   .  8D85 A8FEFFFF lea eax,dword ptr ss:[ebp-0x158]
  0056D1E0   .  E8 535DE9FF   call dumped_.00402F38
  0056D1E5   .  BA 01000000   mov edx,0x1
  
  追码跟爆破都很简单,一步就完成了。
  
  进入关键call之后就是算法了:
  0056CF40  /$  55            push ebp
  0056CF41  |.  8BEC          mov ebp,esp
  0056CF43  |.  33C9          xor ecx,ecx
  0056CF45  |.  51            push ecx
  0056CF46  |.  51            push ecx
  0056CF47  |.  51            push ecx
  0056CF48  |.  51            push ecx
  0056CF49  |.  53            push ebx
  0056CF4A  |.  56            push esi
  0056CF4B  |.  8BF2          mov esi,edx
  0056CF4D  |.  8BD8          mov ebx,eax
  0056CF4F  |.  33C0          xor eax,eax
  0056CF51  |.  55            push ebp
  0056CF52  |.  68 10D05600   push dumped_.0056D010
  0056CF57  |.  64:FF30       push dword ptr fs:[eax]
  0056CF5A  |.  64:8920       mov dword ptr fs:[eax],esp
  0056CF5D  |.  81F3 F1250B00 xor ebx,0xB25F1                          ;  ebx值(用户名的16进制乘上70后)与B25F1异或
  0056CF63  |.  8BC3          mov eax,ebx
  0056CF65  |.  33D2          xor edx,edx
  0056CF67  |.  52            push edx
  0056CF68  |.  50            push eax
  0056CF69  |.  8D45 FC       lea eax,[local.1]
  0056CF6C  |.  E8 5BC9E9FF   call dumped_.004098CC                    ;  将异或得出的值转为10进制
  0056CF71  |.  8B45 FC       mov eax,[local.1]
  0056CF74  |.  0FB600        movzx eax,byte ptr ds:[eax]              ;  取结果的第一位ASCII
  0056CF77  |.  8B55 FC       mov edx,[local.1]
  0056CF7A  |.  0FB652 01     movzx edx,byte ptr ds:[edx+0x1]          ;  第二位ASCII
  0056CF7E  |.  03C2          add eax,edx                              ;  第二位ASCII加上第一位的,结果放入eax
  0056CF80  |.  B9 05000000   mov ecx,0x5                              ;  ecx为5
  0056CF85  |.  99            cdq                                      ;  置EDX为0
  0056CF86  |.  F7F9          idiv ecx                                 ;  除ecx(0x5)商保存至eax余数保存至edx
  0056CF88  |.  80C2 34       add dl,0x34                              ;  edx+34
  0056CF8B  |.  8855 F8       mov byte ptr ss:[ebp-0x8],dl             ;  +34后结果保存 注册码倒数第二位计算完成
  0056CF8E  |.  8B45 FC       mov eax,[local.1]                        ;  0056CF6C处10进制结果入eax
  0056CF91  |.  0FB640 02     movzx eax,byte ptr ds:[eax+0x2]          ;  取10进制结果的第3位ASCII
  0056CF95  |.  8B55 FC       mov edx,[local.1]
  0056CF98  |.  0FB652 03     movzx edx,byte ptr ds:[edx+0x3]          ;  取10进制结果第4位ASCII
  0056CF9C  |.  03C2          add eax,edx                              ;  相加三、四位ASCII码
  0056CF9E  |.  B9 05000000   mov ecx,0x5                              ;  ecx为5
  0056CFA3  |.  99            cdq                                      ;  edx置0
  0056CFA4  |.  F7F9          idiv ecx                                 ;  eax值除ecx(5)
  0056CFA6  |.  8BDA          mov ebx,edx
  0056CFA8  |.  80C3 33       add bl,0x33                              ;  结果+33
  0056CFAB  |.  885D F9       mov byte ptr ss:[ebp-0x7],bl             ;  存放+33后的结果 注册码最后一位计算结束
  0056CFAE  |.  8D45 F4       lea eax,[local.3]
  0056CFB1  |.  8A55 F8       mov dl,byte ptr ss:[ebp-0x8]
  0056CFB4  |.  E8 1B7EE9FF   call dumped_.00404DD4
  0056CFB9  |.  8B45 F4       mov eax,[local.3]
  0056CFBC  |.  8D55 FC       lea edx,[local.1]
  0056CFBF  |.  B9 1B000000   mov ecx,0x1B
  0056CFC4  |.  E8 C381E9FF   call dumped_.0040518C
  0056CFC9  |.  8D45 F0       lea eax,[local.4]
  0056CFCC  |.  8BD3          mov edx,ebx
  0056CFCE  |.  E8 017EE9FF   call dumped_.00404DD4
  0056CFD3  |.  8B45 F0       mov eax,[local.4]
  0056CFD6  |.  8D55 FC       lea edx,[local.1]
  0056CFD9  |.  B9 19000000   mov ecx,0x19
  0056CFDE  |.  E8 A981E9FF   call dumped_.0040518C                    ;  出现注册码
  0056CFE3  |.  8BC6          mov eax,esi
  0056CFE5  |.  8B55 FC       mov edx,[local.1]
  0056CFE8  |.  E8 5B7CE9FF   call dumped_.00404C48
  0056CFED  |.  33C0          xor eax,eax
  0056CFEF  |.  5A            pop edx
  0056CFF0  |.  59            pop ecx
  0056CFF1  |.  59            pop ecx
  0056CFF2  |.  64:8910       mov dword ptr fs:[eax],edx
  0056CFF5  |.  68 17D05600   push dumped_.0056D017
  0056CFFA  |>  8D45 F0       lea eax,[local.4]
  0056CFFD  |.  BA 02000000   mov edx,0x2
  0056D002  |.  E8 117CE9FF   call dumped_.00404C18
  0056D007  |.  8D45 FC       lea eax,[local.1]
  0056D00A  |.  E8 E57BE9FF   call dumped_.00404BF4
  0056D00F  \.  C3            retn
  
  
  总结下算法吧:
  
  用户名先转为16进制,然后与70相乘,乘出来之后的结果再与B25F1异或,结果再转为10进制,这个10进制结果就是注册码的前几位
  ,然后取10进制结果第一位数的ASCII16进制码,与第二位的ASCII16进制码相加,结果除以5,除得的余数加上34,作为倒数第二位注册码的ASCII,
  再取10进制结果第三位数的ASCII 16进制码,与第四位的ASCII 16进制码相加,结果除以5,除得的余数加上33,作为最后一位注册码的ASCII。
  
  
  下面开始写注册机,用的是易语言,大牛不要笑。
  .版本 2
  
  .局部变量 a, 整数型
  .局部变量 b, 整数型
  .局部变量 c, 文本型
  .局部变量 d1, 双精度小数型
  .局部变量 d2, 双精度小数型
  .局部变量 d3, 双精度小数型
  .局部变量 d4, 双精度小数型
  .局部变量 e, 整数型
  .局部变量 f, 整数型
  
  a = 到整数 (编辑框1.内容)  ' 给a赋值
  b = a × 112  ' a的值就是注册码的10进制,然后乘上 (16进制的70转换为10进制) 也就是112。
  c = 到文本 (位异或 (b, 730609))  ' 与B25F1异或也就等于,与10进制的730609异或,这就算出来注册码的前一部分了。
  d1 = 到小数 (取代码 (c, 1))  ' 取注册码前一部分文本的第一位的ASCII
  d2 = 到小数 (取代码 (c, 2))  ' 取注册码前一部分文本的第2位ASCII
  d3 = 到小数 (取代码 (c, 3))  ' 取注册码前一部分文本的第3位ASCII
  d4 = 到小数 (取代码 (c, 4))  ' 取注册码前一部分文本的第4位ASCII
  e = (d1 + d2) % 5 + 34 - 30  ' 这里下面有特别说明。
  f = (d3 + d4) % 5 + 33 - 30  ' 同上
  编辑框2.内容 = c + 到文本 (e) + 到文本 (f)  '拼接上最后两个数字,然后输出注册码。
  

  e 的值:
  第一位的ASCII与第二位ASCII相加,但是易语言取得的ASCII码是10进制的,所以我们加出来是10进制的,
  但是与5求余求出来的还是和16进制相等的。而除以5后的余数最大是4,所以+34后最大也就是38,对照ASCII表,
  16进制的0的ascii为30,1的为31,以此类推,所以我们只要减去30就会是结果。
  
  不知道我这么解释够不够让人郁闷的?
  
--------------------------------------------------------------------------------
【经验总结】
  这个软件是个很软很软的橡皮泥,爆破,追码,以及算法都很简单,正适合我这种新手捏,在写算法的时候又有些偷懒,所
  以看起来很奇怪,没办法,谁叫咱是菜鸟呢?
  
  给出一组注册码

  序列号 2666
  注册码 102696167

  同时送上注册机及源码。
  有不足之处请大大们指正。
  
QQ截图未命名.jpg

--------------------------------------------------------------------------------
【版权声明】: 本文原创于2666fff, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年07月13日 20:37:14

注册机源码.rar

4.45 KB, 下载次数: 661, 下载积分: 吾爱币 -1 CB

半仙算命注册机.rar

369.81 KB, 下载次数: 1621, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 2热心值 +2 收起 理由
hurric + 1 感谢发布原创作品,[吾爱破解论坛]因你更精.
颓废、冰 + 1 支持原创,吾爱因你而精彩!~

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

精品软件 发表于 2010-7-13 19:24
支持哦 谢谢
zsl01 发表于 2010-7-13 18:46
xiaoju13 发表于 2010-7-13 20:08
mlpojin 发表于 2010-7-13 20:15
:)eee好精吖~~
幻覺 发表于 2010-7-13 20:42
厉害 我就喜欢易语言写的  易懂
weizhuqiang 发表于 2010-7-13 20:50
厉害 我就喜欢易语言写的  易懂
weikaiwei 发表于 2010-7-13 20:52
我 看 下 在 诊所  我 不 相惜这个  的
guo110615 发表于 2010-7-15 02:32
。。
楼主你要是新手那我们是什么哦
jsfyin1989 发表于 2010-7-15 10:01
呵呵,不错啊,真的不错,我就喜欢易语言,不错,不错
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-18 03:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表