电脑算命专家(原名:半仙算命)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 支持哦 谢谢 新出的东东,支持 一下。 下个 牛 :)eee好精吖~~ 厉害 我就喜欢易语言写的易懂 厉害 我就喜欢易语言写的易懂 我 看 下 在 诊所我 不 相惜这个的 。。
楼主你要是新手那我们是什么哦 呵呵,不错啊,真的不错,我就喜欢易语言,不错,不错