2666fff 发表于 2010-7-13 18:40

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

本帖最后由 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:
0040100D    64:8925 0000000>mov dword ptr fs:,esp
00401014    33C0            xor eax,eax
00401016    8908            mov dword ptr ds:,ecx
00401018    50            push eax

F9一次之后硬件断点不要删除,继续按,我这里是一直按了4次f9,然后就直接到了这里:

006EBB36- FFE0            jmp eax                                  ; 4次F9到了这里
006EBB38    1852 58         sbb byte ptr ds:,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:          ; ssbx.0058AC38
0058522F    8B03            mov eax,dword ptr ds:
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:,ecx
0056D046   .898D 8CFEFFFF mov dword ptr ss:,ecx
0056D04C   .898D 88FEFFFF mov dword ptr ss:,ecx
0056D052   .898D 84FEFFFF mov dword ptr ss:,ecx
0056D058   .898D 94FEFFFF mov dword ptr ss:,ecx
0056D05E   .898D 90FEFFFF mov dword ptr ss:,ecx
0056D064   .898D 9CFEFFFF mov dword ptr ss:,ecx
0056D06A   .898D 98FEFFFF mov dword ptr ss:,ecx
0056D070   .898D A4FEFFFF mov dword ptr ss:,ecx
0056D076   .898D A0FEFFFF mov dword ptr ss:,ecx
0056D07C   .8945 FC       mov dword ptr ss:,eax
0056D07F   .33C0          xor eax,eax

程序打开了,进入注册页面,随便输入序列号以及注册码,点击注册按钮,OD已经断下来了。

F8单步向下走。

0056D0A6   .E8 514BF0FF   call dumped_.00471BFC
0056D0AB   .8945 F8       mov dword ptr ss:,eax
0056D0AE   .BA 02000080   mov edx,0x80000002
0056D0B3   .8B45 F8       mov eax,dword ptr ss:
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:
0056D0C5   .E8 364CF0FF   call dumped_.00471D00                  ;读取注册表信息
0056D0CA   .8D95 A0FEFFFF lea edx,dword ptr ss:
0056D0D0   .8B45 FC       mov eax,dword ptr ss:
0056D0D3   .8B98 F8020000 mov ebx,dword ptr ds:
0056D0D9   .8BC3          mov eax,ebx
0056D0DB   .E8 60B1EDFF   call dumped_.00448240
0056D0E0   .8B85 A0FEFFFF mov eax,dword ptr ss:         ;出现注册名
0056D0E6   .8D95 A4FEFFFF lea edx,dword ptr ss:
0056D0EC   .E8 0BC4E9FF   call dumped_.004094FC
0056D0F1   .8B95 A4FEFFFF mov edx,dword ptr ss:
0056D0F7   .8BC3          mov eax,ebx
0056D0F9   .E8 72B1EDFF   call dumped_.00448270
0056D0FE   .8D95 98FEFFFF lea edx,dword ptr ss:
0056D104   .8B45 FC       mov eax,dword ptr ss:
0056D107   .8B98 00030000 mov ebx,dword ptr ds:
0056D10D   .8BC3          mov eax,ebx
0056D10F   .E8 2CB1EDFF   call dumped_.00448240
0056D114   .8B85 98FEFFFF mov eax,dword ptr ss:
0056D11A   .8D95 9CFEFFFF lea edx,dword ptr ss:         ;出现假注册码
0056D120   .E8 D7C3E9FF   call dumped_.004094FC
0056D125   .8B95 9CFEFFFF mov edx,dword ptr ss:
0056D12B   .8BC3          mov eax,ebx
0056D12D   .E8 3EB1EDFF   call dumped_.00448270
0056D132   .8D95 94FEFFFF lea edx,dword ptr ss:
0056D138   .8B45 FC       mov eax,dword ptr ss:
0056D13B   .8B80 00030000 mov eax,dword ptr ds:
0056D141   .E8 FAB0EDFF   call dumped_.00448240
0056D146   .83BD 94FEFFFF>cmp dword ptr ss:,0x0
0056D14D   .74 1D         je short dumped_.0056D16C
0056D14F   .8D95 90FEFFFF lea edx,dword ptr ss:
0056D155   .8B45 FC       mov eax,dword ptr ss:
0056D158   .8B80 F8020000 mov eax,dword ptr ds:
0056D15E   .E8 DDB0EDFF   call dumped_.00448240
0056D163   .83BD 90FEFFFF>cmp dword ptr ss:,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:
0056D181   .8B45 FC       mov eax,dword ptr ss:
0056D184   .8B80 00030000 mov eax,dword ptr ds:
0056D18A   .E8 B1B0EDFF   call dumped_.00448240
0056D18F   .8B85 8CFEFFFF mov eax,dword ptr ss:
0056D195   .50            push eax
0056D196   .8D95 84FEFFFF lea edx,dword ptr ss:
0056D19C   .8B45 FC       mov eax,dword ptr ss:
0056D19F   .8B80 F8020000 mov eax,dword ptr ds:
0056D1A5   .E8 96B0EDFF   call dumped_.00448240
0056D1AA   .8B85 84FEFFFF mov eax,dword ptr ss:
0056D1B0   .E8 4BC7E9FF   call dumped_.00409900
0056D1B5   .6BC0 70       imul eax,eax,0x70                        ;用户名的16进制乘上70
0056D1B8   .8D95 88FEFFFF lea edx,dword ptr ss:
0056D1BE   .E8 7DFDFFFF   call dumped_.0056CF40                  ;关键算法call,F7进入。
0056D1C3   .8B95 88FEFFFF mov edx,dword ptr ss:
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:
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:
0056CF5A|.64:8920       mov dword ptr fs:,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,
0056CF6C|.E8 5BC9E9FF   call dumped_.004098CC                  ;将异或得出的值转为10进制
0056CF71|.8B45 FC       mov eax,
0056CF74|.0FB600      movzx eax,byte ptr ds:            ;取结果的第一位ASCII
0056CF77|.8B55 FC       mov edx,
0056CF7A|.0FB652 01   movzx edx,byte ptr ds:          ;第二位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:,dl             ;+34后结果保存 注册码倒数第二位计算完成
0056CF8E|.8B45 FC       mov eax,                        ;0056CF6C处10进制结果入eax
0056CF91|.0FB640 02   movzx eax,byte ptr ds:          ;取10进制结果的第3位ASCII
0056CF95|.8B55 FC       mov edx,
0056CF98|.0FB652 03   movzx edx,byte ptr ds:          ;取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:,bl             ;存放+33后的结果 注册码最后一位计算结束
0056CFAE|.8D45 F4       lea eax,
0056CFB1|.8A55 F8       mov dl,byte ptr ss:
0056CFB4|.E8 1B7EE9FF   call dumped_.00404DD4
0056CFB9|.8B45 F4       mov eax,
0056CFBC|.8D55 FC       lea edx,
0056CFBF|.B9 1B000000   mov ecx,0x1B
0056CFC4|.E8 C381E9FF   call dumped_.0040518C
0056CFC9|.8D45 F0       lea eax,
0056CFCC|.8BD3          mov edx,ebx
0056CFCE|.E8 017EE9FF   call dumped_.00404DD4
0056CFD3|.8B45 F0       mov eax,
0056CFD6|.8D55 FC       lea edx,
0056CFD9|.B9 19000000   mov ecx,0x19
0056CFDE|.E8 A981E9FF   call dumped_.0040518C                  ;出现注册码
0056CFE3|.8BC6          mov eax,esi
0056CFE5|.8B55 FC       mov edx,
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:,edx
0056CFF5|.68 17D05600   push dumped_.0056D017
0056CFFA|>8D45 F0       lea eax,
0056CFFD|.BA 02000000   mov edx,0x2
0056D002|.E8 117CE9FF   call dumped_.00404C18
0056D007|.8D45 FC       lea eax,
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

同时送上注册机及源码。
有不足之处请大大们指正。



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

                                                       2010年07月13日 20:37:14

精品软件 发表于 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

呵呵,不错啊,真的不错,我就喜欢易语言,不错,不错
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 电脑算命专家(原名:半仙算命)2010 build07.01 爆破+追码+算法分析+注册机编写