-
-
某非法手游协议分析与测试
-
2021-2-3 22:24
11343
-
(一)前言
一个朋友说在某个棋牌app上打麻将输了钱,怀疑是被平台坑了,想让平台付出点代价,这可把我难倒了,我哪里有这本事?但是考虑到闲着不如找点乐子,还是答应帮他看一下。
(二)整体分析
解压该apk,在lib下面发现libil2cpp.so文件,确定该程序为u3d程序。但是并没有找到global-metadata.dat文件,应该是加密了。u3d程序在il2cpp后,运行时需要解析global-metadata.dat来调用相应的函数指针,如果不拿到这个文件,很难去分析libil2cpp.so内的函数。这里直接在程序内存中搜索内存中搜素AF 1B B1 FA就能将其dump下来。如果程序是边执行边解密,那就需要去分析他的解密逻辑。
打开程序后的数据包很少,并没有向服务器请求资源文件。
抓取登录包:
http的包,除了图片中的请求头以外,还有post的参数没有截图。
(三)协议字段分析
使用Perfare大佬的 Il2CppDumper对该程序的libil2cpp.so进行dump,得到c++头文件和ida脚本,用ida脚本将字符串和结构体等信息进行导入
这里遇到了一些问题,头文件中部分结构体的字段中出现乱码:
至今还不知道是什么原因,以前也没有遇到过,希望有经验的大佬可以指点一下。 出现乱码的地方很多,导致很多结构体不能正常导入ida,这里我把一些出现乱码的重要的结构体(比如Il2CppClass ),手动删除乱码后导入了ida中。
对使用不同手机在不同网络下用不同的用户名登录的请求包进行对比,发现cty和client_id 为相同值,简单分析后确定这两个值为固定值。
QA字段:数据被URLEncode过,因为函数名已经通过ida脚本修改过了,所以直接在ida中搜索URLEncode查找到相关函数,简单分析即可定位关键代函数0xF3BD84,用frida hook该函数得到:
参数:
1 |  mobile = 15856563669 &password = 1234567890 &version = 4.0 . 18 &os = android
|
返回值:
1 |  ptenoj@ 68 = 8 ; 8 ; 6 ; 9 >)udxv|rwgb47698;: = < 5 ){hwvnrs@ 91516 ; + rx@fqiutli
|
函数先调用System_String__ToCharArray将字符串转换为字符数组,然后对其进行以下计算:
1 2 3 4 5 6 7 8 9 10 11 | il2cpp: 0000000000F3BE30 TBNZ W20,
il2cpp: 0000000000F3BE34 LDR W9, [X19,
il2cpp: 0000000000F3BE38 ADD W22, W8,
il2cpp: 0000000000F3BE3C CMP W20, W9
il2cpp: 0000000000F3BE40 B.CS loc_F3BE58
il2cpp: 0000000000F3BE44 B loc_F3BE68
il2cpp: 0000000000F3BE48 loc_F3BE48
il2cpp: 0000000000F3BE48 LDR W9, [X19,
il2cpp: 0000000000F3BE4C ADD W22, W8,
il2cpp: 0000000000F3BE50 CMP W20, W9
il2cpp: 0000000000F3BE54 B.CC loc_F3BE68
|
调用System_StringCreateString将计算后的数组创建为字符串对象,然后返回即是QA字段。
ctd字段看起来就像是几个md5值,在ida中搜索md5找到WebHttpWrapToMD5函数,hook查看md5的参数,发现ctd中的几个md5值,是以QA的原始值中的几个数据进行md5得到的。
ctth字段为固定值 + 时间戳 + signature,在QA生成函数调用的附近,即可找到signature的生成函数,这个函数很长,关键位置在函数的结尾处,F5后的代码为:
1 2 3 4 5 6 7 8 9 10 11 | if ( !v193 )
sub_59E7D0();
str0 = System_String__Substring_11453816(v193, 7LL , 9LL , 0LL );
if ( !v177 )
sub_59E7D0();
str1 = System_String__Substring_11453816(v177, 16LL , 12LL , 0LL );
if ( !v194 )
sub_59E7D0();
str2 = System_String__Substring(v194, 8LL , 0LL );
v198 = System_String__Concat_11463052(str0, str1, str2, 0LL );
return WebHttpWrap__ToMD5(v198);
|
可以看到函数截取了三个字符串,再将截取的字符串拼接成一个字符串进行md5,被截取的三个字符串是其他数据的md5值,一直反推就可以找到,这里不再描述。需要注意的是,il2cpp中,全局的静态变量,存储在 Il2CppClass 的实例上,这一点在寻找数据时会用到。
还有一个boundary字段在Content-Type中出现,这里为一个uuid值。
请求的body中无加密数据,至此该程序的请求协议已分析结束。
(四)可利用点分析
1. 获取第三方付费平台的token
程序在启动时发送一下请求:
该程序购买了ip138的付费接口,通过调用该平台的接口获取用户的ip地址,然后返回给游戏服务器,由于ip138不会限制带token的用户的请求次数,因此,我们可以使用上方请求中url的token一直调用接口,将付费接口的请求次数消耗完,或者将token保存下来,分享给需要的朋友进行使用。在这里我还是打个码吧,以防被砍。
2. 无限请求验证码接口
该平台将获取验证码的时间间隔限制写在了客户端,服务端未做限制,在接码平台找到一个手机号进行测试,请求可以成功发送:
同时接码平台也可以接收到验证码:
利用这一点,我们可以一直请求验证码,将该平台的验证码请求服务次数请求完,很多短信轰炸就是利用这一点来制作。
3 爆破用户密码
这一点实用性不大,但还是存在利用的可能性。该平台的登录接口未做请求次数和请求时间间隔的限制:
在得知用户id和用户信息的情况下,可以进行密码撞库。如果有合适的社工库,并在其中找到了该注册手机号在其他平台的密码规则,还是存在很大的可能性能撞库成功。
(五)结语:
本来还想再深入分析一下,但是注册了一个账号登录以后发现,平台充值需要加客服微信,转账给客服手动充值。没有充值接口瞬间就没了胃口。
希望有大佬能帮我解答一下Il2cppDumper生成的头文件中结构体的字段出现乱码的问题,我不想去分析源码了。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2021-2-3 22:25
被某警官编辑
,原因: