看了下大佬的帖子(原贴在此:https://www.52pojie.cn/forum.php?mod=viewthread&tid=936007&page=1),新版加入了软件重启验证,之前的这个方法不太好用了,无奈只好自己动手了+1
官方下载地址:http://bill.mobcc.cn/
软件介绍:
1 咖啡小店小票打印专家体验版可以根据需要添加无数多个发票模板。
2 既可以整体设置发票字体、字号,也可以单独设置指定发票项目的字体、字号。
3 可以方便设置人民币符号、发票号码NO标志是否打印以及它们的位置及大小。
4 小数位数无需设定,可以直接输入。
5 可以添加系统中没有的项目和字符,适合经常变化的发票格式。
6 发票项目的位置调整灵活、方便。
----------------------------------------------------------------------------------------
第一步当然是先体验未注册版本有哪些限制,大体总结了一下有以下限制:
1.标题显示未注册
2.无法进行系统设置
3.无法进行店铺信息维护
4.退出时会自动弹出网页
----------------------------------------------------------------------------------------
废话到此结束了,开始动手。
老规矩还是先查壳:
大喜,没壳,上OD,搜索字符串,发现了有数据库连接字符串
找到了数据库密码为:mobcc@Ticket,往上看了下,竟然还有自毁机制!!!以及盗版提示,不得了不得了,勾起了我的兴趣
既然有了数据密码那我们就进数据库查看一下,看看有什么其他猫腻
在这个表里就是店铺的基本信息了,仔细看前面2个字段,字面意思大概是“硬盘”“序列号”之类的,那八成是用来存储机器码跟注册码的,针对机器码跟注册码存储那就跟注册有关了,
[color=]猜测还有重启验证
既然有存储就有读取,我尝试OD里搜索了一下这个
serialno关键字,太多了。。。。没耐心一个个找下去,但是有个意外收获
发现还有访问网址。。。。。。难道还有网络验证?都说好奇心害死猫,一点都没错,我尝试在这2个地方下断点,得到了完整地址(http://soft.mobcc.cn/regist.do?h ... d=1&usetype=1&cid=1)进行GET访问
结果触发了暗装。。。在打开就提示我盗版错误了(手动打码)
没办法还是先取出这个暗装,不然每次调试很麻烦搜索“盗版”关键字,找到这里,一看3好熟悉,不就是GET访问时返回的一个值么?
是直接PUSH的一个地址,应该是个常量,那就在这个地方下断,修改一下这个常量为0
再跑起来发现已经没有那个盗版提示了,但是仍然是未注册,下面就继续看注册下面有几种方案:
1.追码---得到注册码进行填写,你调试一下就知道了,注册码满天飞,你想假装看不见都很难
2.在注册按钮处改跳转,点击即可注册成功。缺点:每次都需要进行点击注册动作
3.找到重启验证的地方进行爆破:既然是重启验证作者为了方便在编写时八成都会采用一个变量或者标示来存储注册状态 (如果一个条件等于真就是已注册 反之就是为注册),找到这个变量进行修改或者赋值即可
追码难度不大就不细说了,实测也是可以的,注册码跟机器码会写入到数据库中,跟之前猜想一样注册按钮处改跳转也不搞了,没啥意义
我们找重启验证的地方,回想刚才未注册的限制,没法修改店铺名,打开默认的就是“咖啡小店”,尝试手动修改数据库仍然无效,我猜注册之后就可以自动读取上次的内容,既然是变量那么肯定在未注册的时候会有赋值,将店铺名这个位置强制为“咖啡小店”,那我们就以这个关键字搜索试试看
看下这附近有好多注册类的信息,像刚才分析的存储注册码的数据库字段,注册成功提示,标题上的【已注册】,关键还有那个很坑的网络验证下断点调试看看
果然跟预想的一样,未注册前面会强制放入一个常量“咖啡小店”,然后往下看[Asm] 纯文本查看 复制代码0041CB13 |> \68 20E64500 push TicketPr.0045E620 ; 咖啡小店
0041CB18 |. 8D4C24 14 lea ecx,dword ptr ss:[esp+14]
0041CB1C |. C687 E0130000>mov byte ptr ds:[edi+13E0],0 ;---------------------这个地方有点像之前说的那个变量标示了,前面判断好是未注册状态,然后赋值变量为0也就是逻辑“假”
0041CB23 |. E8 608D0200 call
0041CB28 |. 8B96 DC000000 mov edx,dword ptr ds:[esi+DC]
0041CB2E |. 8B86 D8000000 mov eax,dword ptr ds:[esi+D8]
0041CB34 |. 8B4C24 10 mov ecx,dword ptr ss:[esp+10]
0041CB38 |. 52 push edx
0041CB39 |. 50 push eax
0041CB3A |. 51 push ecx
0041CB3B |. 8D5424 20 lea edx,dword ptr ss:[esp+20]
0041CB3F |. 68 30E64500 push TicketPr.0045E630 ; %s-%s V%s [未注册版]
0041CB44 |. 52 push edx
为了印证判断,将mov byte ptr ds:[edi+13E0],0 改为mov byte ptr ds:[edi+13E0],1运行后发现,标题还是未注册,但是功能已经全部可以使用了,退出也不弹出网页了,吃嘛嘛香了
标题这个很正常,因为往下运行写入了“未注册”的字样,你可以手动修改为“已注册”或者任何你想显示的文字
好了,这就找到了那个关键的地方,mov byte ptr ds:[edi+13E0],0这个地址赋值0就是未注册,mov byte ptr ds:[edi+13E0],1赋值为1就是已注册,那我们知道了这个就好办了,我们搜索一下mov byte ptr ds:[edi+13E0],1
一共有3个地方进行赋值(看来作者对验证也是下了功夫的)
我们既然是想破重启验证,那就在第一个试试。在
这个地方有官方的赋值,也就是真正的注册成功的位置
我们要做的就是让程序可以执行到成功标示的地方,NOP掉上面2个跳转即可搞定一切
好了,运行起来看下效果
完美,名字也可以读取上次的记录了,注册也搞定,盗版提示也搞定了,还有一处就是自毁的。。。。
按照提示找到位置,发现只有一个往上的跳,果断改为JMP,这个我感觉就是一个提示而已,我下了断点让他走完了这个自毁程序,发现数据仍然还在。。。。难道是作者给的彩蛋么?
好了,分析过程就到此结束了。帮助一下小白梳理一下分析过程吧,破解感觉重要的还是一个思路
成品就不放了,如有大佬能分析出算法还望不吝赐教,内存注册机就算了,我尝试跟了一下算法,绕来绕去半天没理清楚。。。。。期待大神