cshow 发表于 2008-8-23 19:22

关于里诺餐饮管理软件(单机版)V1.10的算法分析

【破文标题】关于里诺餐饮管理软件(单机版)V1.10的算法分析
【破文作者】CsHoW
【作者邮箱】QQ:178092
【作者主页】http://www.lenosoft.net
【破解工具】OD
【破解平台】XP SP2
【软件名称】里诺餐饮管理软件(单机版)V1.10
【软件大小】7.29MB
【原版下载】http://www.lenosoft.net/download/cy110.zip
【保护方式】没壳(Borland Delphi 6.0 - 7.0)
【软件简介】里诺餐饮管理软件是一套适合中小型餐厅、酒店使用的餐饮管理软件,界面友好,操作简便。软件将顾客开单、增加消费、宾客结帐、会员管理以及各种营业报表的查询、汇总紧密的结合起来。科学的管理方法会给您带来无限的效益,里诺餐饮管理软件将是您明智的选择。 里诺餐饮管理软件的主要功能有: 宾客管理:顾客开单、增加消费、宾客结帐、预定管理、会员管理; 营业查询:日营业统计、收银明细查询、营业统计图; 系统设置:房间项目设置、消费项目设置;
【破解声明】本教程仅仅做学习与交流用.
【Darkst名】CsHoW
因为是重启验证
且保存在HKEY_LOCAL_MACHINE\SOFTWARE\zy\cy这里
所以根据我的跟踪
这里是注册算法~~0064B0A4
重新载入OD后
在这里下断
0064B0A4 . E8 93E0FFFF call0064913C; //注册算法

来到这里

0064913C /$ 55pushebp
0064913D |. 8BECmov ebp, esp
0064913F |. 51pushecx
00649140 |. B9 04000000 mov ecx, 4
00649145 |> 6A 00 /push0
00649147 |. 6A 00 |push0
00649149 |. 49|dec ecx
0064914A |.^ 75 F9 \jnz short 00649145
0064914C |. 51pushecx
0064914D |. 874D FC xchgdword ptr , ecx
00649150 |. 53pushebx
00649151 |. 56pushesi
00649152 |. 57pushedi
00649153 |. 8BF9mov edi, ecx
00649155 |. 8955 FC mov dword ptr , edx
00649158 |. 8B45 FC mov eax, dword ptr
0064915B |. E8 94BEDBFF call00404FF4
00649160 |. 33C0xor eax, eax

一路F8

00649175 |. 8B45 FC mov eax, dword ptr ; //机器名长度放到EAX
00649178 |. E8 87BCDBFF call00404E04
0064917D |. 8BF0mov esi, eax
0064917F |. 85F6testesi, esi
00649181 |. 7E 26 jle short 006491A9
00649183 |. BB 01000000 mov ebx, 1
00649188 |> 8D4D EC /lea ecx, dword ptr
0064918B |. 8B45 FC |mov eax, dword ptr ; //机器名放到EAX
0064918E |. 0FB64418 FF |movzx eax, byte ptr ; //机器名每一个字符的ASCII放到EAX
00649193 |. 33D2|xor edx, edx
00649195 |. E8 8213DCFF |call0040A51C
0064919A |. 8B55 EC |mov edx, dword ptr ; //机器名字符ASCII放到EDX
0064919D |. 8D45 F8 |lea eax, dword ptr ; //累加到EAX
006491A0 |. E8 67BCDBFF |call00404E0C
006491A5 |. 43|inc ebx
006491A6 |. 4E|dec esi
006491A7 |.^ 75 DF \jnz short 00649188
006491A9 |> 8B45 F8 mov eax, dword ptr ; //机器名的ASCII放到EAX

这里是第一个循环,就是算出机器码的ascii码值,叫做str1

继续F8

006491B7 |. BB 01000000 mov ebx, 1
006491BC |> 8B45 F8 /mov eax, dword ptr ; //机器名的ASCII放到EAX
006491BF |. E8 40BCDBFF |call00404E04
006491C4 |. 2BC3|sub eax, ebx ; //算出机器码ASCII的长度
006491C6 |. 8B55 F8 |mov edx, dword ptr ; //机器名的ASCII放到EDX
006491C9 |. 8A1402|mov dl, byte ptr ; //把注册码的ASCII的最后一位放到第一位,倒数第二位放到第二位,也就是逆置
006491CC |. 8D45 E8 |lea eax, dword ptr
006491CF |. E8 48BBDBFF |call00404D1C
006491D4 |. 8B55 E8 |mov edx, dword ptr
006491D7 |. 8D45 F4 |lea eax, dword ptr
006491DA |. E8 2DBCDBFF |call00404E0C ; //放到EAX里面
006491DF |. 43|inc ebx
006491E0 |. 4E|dec esi
006491E1 |.^ 75 D9 \jnz short 006491BC
006491E3 |> 8D45 F8 lea eax, dword ptr
006491E6 |. 50pusheax

这里就是把ASCII的最后一位放到第一位,倒数第二位放到第二位....如此循环

就是实现了逆置(数学里是不是这么说的?)

这里的逆置后的数据叫做str2

继续F8到这里就可以看见对str2进行了一系列操作了

006491E3 |> \8D45 F8 lea eax, dword ptr
006491E6 |. 50pusheax
006491E7 |. B9 04000000 mov ecx, 4; //4扔给ECX
006491EC |. BA 01000000 mov edx, 1; //1也顺便给了EDX
006491F1 |. 8B45 F4 mov eax, dword ptr ; //把str2给EAX
006491F4 |. E8 6BBEDBFF call00405064; //等会跟进去看看
006491F9 |. 8D45 F4 lea eax, dword ptr
006491FC |. 50pusheax
006491FD |. B9 04000000 mov ecx, 4; //4扔给ECX
00649202 |. BA 05000000 mov edx, 5; //5也顺便给了EDX
00649207 |. 8B45 F4 mov eax, dword ptr ; //把str2给EAX
0064920A |. E8 55BEDBFF call00405064; //取str2前四位
0064920F |. 8B45 F8 mov eax, dword ptr ; //给EAX
00649212 |. E8 EDBBDBFF call00404E04
00649217 |. 83F8 04 cmp eax, 4; //位数是4位
0064921A |. 7D 2F jge short 0064924B; //则跳

跳到了这里

0064924B |> \8B45 F4 mov eax, dword ptr ; //取了5-8位出来,给EAX
0064924E |. E8 B1BBDBFF call00404E04
00649253 |. 83F8 04 cmp eax, 4; //位数是4位
00649256 |. 7D 2F jge short 00649287; //则跳

继续F8

00649287 |> \8D45 F0 lea eax, dword ptr
0064928A |. BA 14936400 mov edx, 00649314 ; //出现固定字符串cyyl845yr67
0064928F |. E8 38B9DBFF call00404BCC
00649294 |. 8D45 DC lea eax, dword ptr
00649297 |. 50pusheax
00649298 |. B9 04000000 mov ecx, 4; //4给ECX
0064929D |. BA 01000000 mov edx, 1; //1给EDX
006492A2 |. 8B45 F0 mov eax, dword ptr ; //固定字符str3给EAX
006492A5 |. E8 BABDDBFF call00405064; //拿出固定字符串的前四位
006492AA |. FF75 DC pushdword ptr
006492AD |. 68 28936400 push00649328; //和-连接
006492B2 |. FF75 F8 pushdword ptr ; //后面加str2的前四位
006492B5 |. 8D45 D8 lea eax, dword ptr
006492B8 |. 50pusheax
006492B9 |. B9 05000000 mov ecx, 5; //5给ECX
006492BE |. BA 05000000 mov edx, 5; //5给EDX
006492C3 |. 8B45 F0 mov eax, dword ptr ; //从str3的第五位开始取五个字符
006492C6 |. E8 99BDDBFF call00405064; //拿出845yr,与str2前四位合并
006492CB |. FF75 D8 pushdword ptr
006492CE |. 68 28936400 push00649328; //再一次和-连接
006492D3 |. FF75 F4 pushdword ptr ; //再接着拿str2的5-8这四位
006492D6 |. 8BC7mov eax, edi
006492D8 |. BA 06000000 mov edx, 6
006492DD |. E8 E2BBDBFF call00404EC4

这里吧固定字符串cyyl845yr67和str2进行了一系列的排法~

注释的和详细了~~

这里是制作注册机的地方
0064B0AC . A1 E8E77300 mov eax, dword ptr
0064B0B1 . 8B00mov eax, dword ptr
0064B0B3 . 8B80 5C040000 mov eax, dword ptr
0064B0B9 . E8 929EDBFF call00404F50

cshow 发表于 2008-8-23 19:38

我以为他们的注册码通用

结果发现

在进销存管理软件(单机版)V3.27

里面的字符串是JXCw268d58k

但是注册的方法还是一样的`~

szdjcn 发表于 2008-8-25 00:00

我喜欢算法文章,感谢,可惜加不了分,要不给你加!

wgz001 发表于 2008-8-25 06:24

楼主分析的详细哦

学习下

辛苦了

fox2006 发表于 2008-8-25 16:37

已经亲自实践了,不过有一个问题请问一下,你这个关键算法CALL的位置定位的方法是什么?我用的方法是:利用第一次那个Pass(查找字符串里面的)的位置下断,然后慢慢往下F8,这样好像挺慢的,能不能告诉如何快速定位这类注册表重启验证的方法啊

goodluckwxl 发表于 2012-6-17 22:46

暗桩怎么办啊?

goodluckwxl 发表于 2012-6-18 10:07

感谢你的教程。受益匪浅
页: [1]
查看完整版本: 关于里诺餐饮管理软件(单机版)V1.10的算法分析