某辅助登录算法分析并转本地验证
本帖最后由 Sendige 于 2019-12-11 23:11 编辑大家好,我是Sendige,很久没有给大家带来算法分析了,今天闲来没事做,想玩一下桌球,但是自己技术不行,所以想找一个辅助来辅助下我的技术,记得之前自己破解过一款,
时隔多年,我又亲自对他开刀,惊喜的是,这个辅助更新了,好了,废话不多说,走起!
下面因为我注册的账号是用了自己的qq号进行注册,为了避免有打广告的嫌疑,下面的账号用了wuaipojie进行脱敏处理,实际上不是这个的,所以你们要验证我的md5加密结果和教程里的是否一样是行不通的,望知悉。
VB写的验证,不多说,可以跑VB按钮事件脚本下断点。
开始之前请自己注册好一个账号,后面用来进行数据分析使用,我们直接来到按钮事件
前面一大段都是在判断账号密码有没有输入,版本号是不是最新之类的,所以我们可以忽略,我们来到发送封包那里。
很明显了,这里是发送封包的call
这是封包数据:-----------shi-yong---------------//-zhanghao-aa// wuaipojie //un-zhanghao-//<br>//-daoqi-aa// 2019-12-10 //un-daoqi-//<br>//-key-aa// 666501d89d672cd0a05f96dfd060bc29 //un-key-//<br>www.xxxxx.com
走到这里返回了一个key,我们记为Key1
这里记为key2,是封包里的那个key。
上图这里是关键判断,判断本地的key1和返回封包的key2是不是一样
Key1=66650e7e5ff72cd0a05f96dfd060bc29
Key2=666501d89d672cd0a05f96dfd060bc29
经过分析,他是对比个大概,只要大概相似就行了。
009C16DD .50 push eax ; /var18
009C16DE .8D85 14FFFFFF lea eax,dword ptr ss: ; |
009C16E4 .50 push eax ; |var28
009C16E5 .FF15 00104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>; \__vbaVarTstGt
上网找到vbaVarTstGt ->检验指定变量大于 bpx vbaVarTstGe ->检验指定变量大于或等于
所以我们可以这样,将本地算法得出的结果,即得出的key1填写在返回的封包里面的key2里,经过测试,这个跳转也是不跳的。所以我们只要逆出算法就可以进行本地验证了。
现在我们开始逆出本地key1的算法
009C1375 .E8 B6220000 call 星空qq桌.009C3630 ;取出key1
009C137A .8BD0 mov edx,eax ;
009C137C .8D4D CC lea ecx,dword ptr ss:
我们每次断在009C1375这个地址之前先下这个断点
009C11F0 .50 push eax
009C11F1 .68 5CE54000 push 星空qq桌.0040E55C ;http://www.xxxxxx.com/login/login2015.php
009C11F6 .8D55 84 lea edx,dword ptr ss:
009C11F9 .52 push edx
009C11FA .E8 B12B0000 call 星空qq桌.009C3DB0 ;发送封包
k=oyo7fpltd9esyktg77rcjmva8t44bn1e
记下这个k值,因为计算key1的算法call需要用到这个值
009C3733 .8B3D 30104000 mov edi,dword ptr ds:[<&MSVBVM60.__vbaSt>;MSVBVM60.__vbaStrVarMove
009C3739 .8D55 B8 lea edx,dword ptr ss:
009C373C .52 push edx
009C373D .FFD7 call edi ;<&MSVBVM60.__vbaStrVarMove>
009C373F .8B1D E4114000 mov ebx,dword ptr ds:[<&MSVBVM60.__vbaSt>;
009C3745 .8BD0 mov edx,eax
009C3747 .8D4D E4 lea ecx,dword ptr ss:
这个call 进行了这个操作从K值的第9位开始取,取长度为8,记为K1
K1= oyo7fpltd9esyktg77rcjmva8t44bn1e(标记为红色部分)
009C374C .8D45 E4 lea eax,dword ptr ss:
009C374F .8D4D A8 lea ecx,dword ptr ss:
009C3752 .50 push eax
009C3753 .51 push ecx
009C3754 .E8 87020000 call 星空qq桌.009C39E0 ;将K1进行md5操作
这个call其实就是一个md5操作的函数,看下图这个数据就可以看出来了,不确定的话可以拿工具调试一下。
K1(md5)=578898cb2b2ac47708d0e7e4d19eedaf
009C377C .8D4D 88 lea ecx,dword ptr ss:
009C377F .51 push ecx
009C3780 .FFD7 call edi ;<&MSVBVM60.__vbaStrVarMove>
009C3782 .8BD0 mov edx,eax ;取K值前10位 记为K2
009C3784 .8D4D E0 lea ecx,dword ptr ss:
K2=oyo7fpltd9
009C3789 .8D55 E0 lea edx,dword ptr ss:
009C378C .8D85 78FFFFFF lea eax,dword ptr ss:
009C3792 .52 push edx
009C3793 .50 push eax
009C3794 .E8 47020000 call 星空qq桌.009C39E0 ;将k2 md5操作
这里也是同理,和上面一样的操作。
K2(md5)=91d2c5aa02f27174038bbd9036b0c56c
009C37D5 .BA C4CC4000 mov edx,星空qq桌.0040CCC4 ;qqzq
009C37DA .8D4D DC lea ecx,dword ptr ss:
009C37DD .FF15 78114000 call dword ptr ds:[<&MSVBVM60.__vbaStrCopy>] ;MSVBVM60.__vbaStrCopy
009C37E3 .8D55 DC lea edx,dword ptr ss:
009C37E6 .8D85 08FFFFFF lea eax,dword ptr ss:
009C37EC .52 push edx
009C37ED .50 push eax
009C37EE .E8 ED010000 call 星空qq桌.009C39E0 ;qqzq md5
这里把qq桌球的简写拼音(qqzq)进行md5操作
qqzq(md5)=5ae623031acc47df1d5f6f4228d8bd88
下面是开始进行合并字符串
009C37F3 .8B0D 2C509C00 mov ecx,dword ptr ds:
009C37F9 .8B35 4C114000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVarCat>] ;MSVBVM60.__vbaVarCat
009C37FF .8D55 C8 lea edx,dword ptr ss:
009C3802 .898D 90FEFFFF mov dword ptr ss:,ecx
009C3808 .8D45 A8 lea eax,dword ptr ss:
009C380B .52 push edx
009C380C .8D4D 98 lea ecx,dword ptr ss:
009C380F .50 push eax
009C3810 .51 push ecx
009C3811 .C785 88FEFFFF>mov dword ptr ss:,0x8
009C381B .FFD6 call esi ;k值前5个+md5(k1); <&MSVBVM60.__vbaVarCat>
k=oyo7fpltd9esyktg77rcjmva8t44bn1e
oyo7f578898cb2b2ac47708d0e7e4d19eedaf (k值前5个+md5(k1))
009C381D .50 push eax
009C381E .8D95 78FFFFFF lea edx,dword ptr ss:
009C3824 .8D85 68FFFFFF lea eax,dword ptr ss:
009C382A .52 push edx
009C382B .50 push eax
009C382C .FFD6 call esi ;k值前5个+md5(k1)+md5(k2); <&MSVBVM60.__vbaVarCat>
oyo7f578898cb2b2ac47708d0e7e4d19eedaf91d2c5aa02f27174038bbd9036b0c56c
009C382E .8D8D 58FFFFFF lea ecx,dword ptr ss:
009C3834 .50 push eax
009C3835 .8D95 48FFFFFF lea edx,dword ptr ss:
009C383B .51 push ecx
009C383C .52 push edx
009C383D .FFD6 call esi ;k值前5个+md5(k1)+md5(k2)+k1后三位; <&MSVBVM60.__vbaVarCat>
oyo7f578898cb2b2ac47708d0e7e4d19eedaf91d2c5aa02f27174038bbd9036b0c56cktg
009C383F .50 push eax
009C3840 .8D85 28FFFFFF lea eax,dword ptr ss:
009C3846 .8D8D 18FFFFFF lea ecx,dword ptr ss:
009C384C .50 push eax
009C384D .51 push ecx
009C384E .FFD6 call esi ;k值前5个+md5(k1)+md5(k2)+k1后三位+未知值; <&MSVBVM60.__vbaVarCat>
oyo7f578898cb2b2ac47708d0e7e4d19eedaf91d2c5aa02f27174038bbd9036b0c56cktg5a8dd11b9c99
009C3850 .50 push eax
009C3851 .8D95 08FFFFFF lea edx,dword ptr ss:
009C3857 .8D85 F8FEFFFF lea eax,dword ptr ss:
009C385D .52 push edx
009C385E .50 push eax
009C385F .FFD6 call esi ;k值前5个+md5(k1)+md5(k2)+k1后三位+未知值+md5(qqzq); <&MSVBVM60.__vbaVarCat>
oyo7f578898cb2b2ac47708d0e7e4d19eedaf91d2c5aa02f27174038bbd9036b0c56cktg5a8dd11b9c995ae623031acc47df1d5f6f4228d8bd88
009C3861 .8D8D 88FEFFFF lea ecx,dword ptr ss:
009C3867 .50 push eax
009C3868 .8D95 E8FEFFFF lea edx,dword ptr ss:
009C386E .51 push ecx
009C386F .52 push edx
009C3870 .FFD6 call esi ;k值前5个+md5(k1)+md5(k2)+k1后三位+未知值+md5(qqzq)+登录账号; <&MSVBVM60.__vbaVarCat>
oyo7f578898cb2b2ac47708d0e7e4d19eedaf91d2c5aa02f27174038bbd9036b0c56cktg5a8dd11b9c995ae623031acc47df1d5f6f4228d8bd88wuaipojie
上面就差一个未知值是哪里来的,其实这个值慢慢调试也能找到,不过你第一次调试的时候比较难发现到,所以我会用另一种思路来找出来。
我们知道这个辅助作者比较“喜欢”用md5来进行加密,所以,我们找到md5加密的call,进入里面下个断点,再重新运行软件调试,就能找到那个未知值的是来自于哪里了。
009C3754 .E8 87020000 call 星空qq桌.009C39E0 ;将K1进行md5操作
比如我们找到这句,进入这个call
009C39E0 $55 push ebp ;md5操作
009C39E1 .8BEC mov ebp,esp
009C39E3 .83EC 0C sub esp,0xC
009C39E6 .68 C6194000 push <jmp.&MSVBVM60.__vbaExceptHandler>;SE 处理程序安装
009C39EB .64:A1 0000000>mov eax,dword ptr fs:
009C39F1 .50 push eax
009C39F2 .64:8925 00000>mov dword ptr fs:,esp
009C39F9 .83EC 68 sub esp,0x68
009C39FC .53 push ebx
009C39FD .56 push esi
009C39FE .57 push edi
009C39FF .8965 F4 mov dword ptr ss:,esp
009C3A02 .C745 F8 58194>mov dword ptr ss:,星空qq桌.0040195>
009C3A09 .33C0 xor eax,eax
009C3A0B .8D4D CC lea ecx,dword ptr ss:
这段就是md5操作的call,我们在头部下个断点,重新运行软件,我们要重新记录下发送封包里的K值。
第二次调试:k=0kmwvead9gha9devgzjhwfola0sovphx
刚才下的md5断点断下来了
这个就是未知值了0kmwvead9gha9dev
k=0kmwvead9gha9devgzjhwfola0sovphx
0kmwvead9gha9dev
通过对比,可以看出未知值是取k值前16位 并进行md5操作
009C36E9 .E8 F2020000 call 星空qq桌.009C39E0 ;取k值16位 并进行md5操作
上图就是0kmwvead9gha9dev的md5结果,我们来验证一下。
看来我们的猜测是正确的,我们把这个值记为K3
k=0kmwvead9gha9devgzjhwfola0sovphx
K3=0kmwvead9gha9dev
K3(md5)= e811e7c7f665bb4c2461c07f2155da2e
K1、k2怎么来,上面已经写了,所以这次不给出加密过程
K1= 9gha9dev
K1(md5)= 02a6befe6e7ff5dc7f335ebf20b36e98K2= 0kmwvead9g
K2(md5)= 2f17263be17be77472f796abae0006b1
qqzq(md5)=5ae623031acc47df1d5f6f4228d8bd88
合并字符:
009C381B .FFD6 call esi ;k值前5个+md5(k1); <&MSVBVM60.__vbaVarCat>
结果:0kmwv02a6befe6e7ff5dc7f335ebf20b36e98
009C382C .FFD6 call esi ;k值前5个+md5(k1)+md5(k2); <&MSVBVM60.__vbaVarCat>
结果:0kmwv02a6befe6e7ff5dc7f335ebf20b36e982f17263be17be77472f796abae0006b1
009C383D .FFD6 call esi ;k值前5个+md5(k1)+md5(k2)+k1后三位; <&MSVBVM60.__vbaVarCat>
结果:0kmwv02a6befe6e7ff5dc7f335ebf20b36e982f17263be17be77472f796abae0006b1dev
009C384E .FFD6 call esi ;k值前5个+md5(k1)+md5(k2)+k1后三位++md5(k3)前12个; <&MSVBVM60.__vbaVarCat>
结果:0kmwv02a6befe6e7ff5dc7f335ebf20b36e982f17263be17be77472f796abae0006b1deve811e7c7f665
009C385F .FFD6 call esi ;k值前5个+md5(k1)+md5(k2)+k1后三位++md5(k3)前12个+md5(qqzq); <&MSVBVM60.__vbaVarCat>
结果:0kmwv02a6befe6e7ff5dc7f335ebf20b36e982f17263be17be77472f796abae0006b1deve811e7c7f6655ae623031acc47df1d5f6f4228d8bd88
009C3870 .FFD6 call esi ;k值前5个+md5(k1)+md5(k2)+k1后三位+md5(k3)前12个+md5(qqzq)+登录账号; <&MSVBVM60.__vbaVarCat>
结果:0kmwv02a6befe6e7ff5dc7f335ebf20b36e982f17263be17be77472f796abae0006b1deve811e7c7f6655ae623031acc47df1d5f6f4228d8bd88wuaipojie
009C387C .8D45 D8 lea eax,dword ptr ss:
009C387F .8D8D D8FEFFFF lea ecx,dword ptr ss:
009C3885 .50 push eax
009C3886 .51 push ecx
009C3887 .E8 54010000 call 星空qq桌.009C39E0将上面的结果再进行md5操作
最后结果得出:ea03e585c65565639fb6aabf3a2031fb
至于本地方法,我这里只提供思路,源码这些就不提供了,为了防止伸手党或者别有用心的人用来倒卖,看到这里,动手能力强的人,基本上可以写出本地源码了。
本地验证的方法请参考珈蓝夜雨大神的文章【吾爱动画大赛2019参赛作品】- 逆向分析某网络验证通信算法https://www.52pojie.cn/thread-1022758-1-1.html(出处: 吾爱破解论坛)
讲真的,我之前也是不懂怎么把网络验证转本地,我只知道思路,但是至于怎么操作真的不清楚,有幸能拜读珈蓝夜雨大神的文章,还有视频教程,视频做的不错,我也一步一步跟着调试,算是大概知道了飘零金盾的算法
这是我做的笔记:https://docs.qq.com/doc/DV01hRXFhT0ZwQWhj (写的不是很好,献丑了!!)
这个辅助本地思路:
009C11F1 .68 5CE54000 push 星空qq桌.0040E55C ;http://www.xxxx.com/login/login2015.php //将这里的地址修改为本地地址 即127.0.0.1/login/login2015.php
然后用易语言,添加一个服务器组件,创建一个_服务器1_数据到达的事件,然后截取到登录的封包,拿出k值,进行上面的加密操作得出key1,最后把返回登录成功的封包里面的key2替换,这样就可以了。
对了,虽然本地成功,登录进去,但是你进入游戏后,辅助检测不到你所玩的桌球是哪个模式,模式有8,9球和斯诺克两种,但是可以搜索字符串,找到选择模式那里,强行跳转到你所玩对应的模式,功能一样可以用的。 Sendige 发表于 2019-12-10 22:32
@朱朱你堕落了我重新编辑过文章 添加了附件了
膜拜算法大佬,向你学习!菜鸟360度无死角膜拜。 老哥,很多你都白写了,很多图片都是,[图片来源QQ空间,未经允许,禁止访问] 写这么多,辛苦了,给你一个评分吧,虽说我也看不懂 辛苦辛苦,加油 @朱朱你堕落了我重新编辑过文章 添加了附件了{:301_971:} 非常奈斯,等我考完试我也来研究一波 这个好,必须给赞{:1_927:} 您好大神 能不能帮我破解一个游戏脚本,有偿. 厉害哦哦
页:
[1]
2