- 标题显示未注册
- 无法进行系统设置
- 无法进行店铺信息维护
- 退出时会自动弹出网页
废话到此结束了,开始动手。
老规矩还是先查壳:
大喜,没壳,上OD,搜索字符串,发现了有数据库连接字符串
找到了数据库密码为:mobcc@Ticket,往上看了下,竟然还有自毁机制!!!以及盗版提示,不得了不得了,勾起了我的兴趣
既然有了数据密码那我们就进数据库查看一下,看看有什么其他猫腻
发现还有访问网址。。。。。。
难道还有网络验证?都说好奇心害死猫,一点都没错,我尝试在这2个地方下断点,得到了完整地址
进行GET访问
http://soft.mobcc.cn/regist.do?harddisk=96EB2308221800FFDA274085&serialno=&version=10.2.2&whichone=2&pid=1&usetype=1&cid=1
结果触发了暗装。。。在打开就提示我盗版错误了(手动打码)
没办法还是先取出这个暗装,不然每次调试很麻烦搜索“盗版”关键字,找到这里,一看3好熟悉,不就是GET访问时返回的一个值么?
是直接PUSH的一个地址,应该是个常量,那就在这个地方下断,修改一下这个常量为0
- 追码---得到注册码进行填写,你调试一下就知道了,注册码满天飞,你想假装看不见都很难
- 在注册按钮处改跳转,点击即可注册成功。缺点:每次都需要进行点击注册动作
- 找到重启验证的地方进行爆破:既然是重启验证作者为了方便在编写时八成都会采用一个变量或者标示来存储注册状态
- (如果一个条件等于真就是已注册 反之就是为注册),找到这个变量进行修改或者赋值即可
看下这附近有好多注册类的信息,像刚才分析的存储注册码的数据库字段,注册成功提示,标题上的【已注册】,关键还有那个很坑的网络验证下断点调试看看
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 <jmp.&MFC42.#CString::operator=_860>
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
果然跟预想的一样,未注册前面会强制放入一个常量“咖啡小店”,然后往下看
0041CB13 |> \68 20E64500 push TicketPr.0045E620 ; 咖啡小店
为了印证判断,将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就是已注册,那我们知道了这个就好办了
我们要做的就是让程序可以执行到成功标示的地方,NOP掉上面2个跳转即可搞定一切
好了,运行起来看下效果
完美,名字也可以读取上次的记录了,注册也搞定,盗版提示也搞定了,还有一处就是自毁的。。。。
按照提示找到位置,发现只有一个往上的跳,果断改为JMP,这个我感觉就是一个提示而已,我下了断点让他走完了这个自毁程序,发现数据仍然还在。。。。难道是作者给的彩蛋么?
评论