"仙与魔,只在一念之间."
00.前言
最近玩一款修仙游戏,达到神力境界后提升需要周期太长。实在太闲了,就对该游戏协议进行分析。
01.抓包
该游戏提供了三个登录方式,本文使用账密登录。

祭出Fiddler抓取登录请求,经过多次测试,初步发现参数:key 随帐号以及密码变动。

02.分析
使用法宝JEB加载apk,定位key、userpwd值的生成.
通过搜索登录URL的字符串"sdkLogin",找到如下方法:

2.1、userpwd的生成
通过该段代码并印证得知,密码的密文通过des加密,密钥为:leiting
1 2 3 4 5 6 7 8 9 10 11 12 | public void doSdkLogin(String arg3, String arg4) {
UserBean v0 = new UserBean();
v0.setUsername(arg3.trim());
String v3 = DesUtil.encrypt(arg4.trim(), "leiting" );
if (TextUtils.isEmpty(v3)) {
this.loginFailNotify(String.valueOf( - 3 ), ResUtil.getString(this.mActivity, "lt_encrypt_fail_msg" ), false);
return ;
}
v0.setUserpwd(v3);
this.doSdkLogin(v0, false);
}
|

2.2、key的生成
静态分析发现,最终登录是调用handleLogin函数.
1 | this.handleLogin(this.setUserBean(arg3, arg4), arg4, 0 );
|
而参数的生成都在setUserBean函数,key也在其中.

key的生成如下
1 2 3 4 5 6 7 8 9 | arg4.setKey(CookieUtil.encryptMsgMd5(arg4.getUsername() + "|" + arg4.getUserpwd() + "|" + arg4.getGame(), "leiting" ))
public static String encryptMsgMd5(String arg3, String arg4) {
try {
return MD5Util.getMd5( "(" + arg3 + "%" + arg4 + "%" + "20210216" + ")" );
}
catch(Exception unused_ex) {
return "";
}
}
|
通过代码并印证得知key为一个md5字符串,拼接的明文则如下:
(13888888888|83578346c5474f1a7aa78c83e43aa46a|xian%leiting%20210216)

最后正确帐号的请求如下:

03.最后
通过后面的抓包发现,本篇所写的登录分析只是为了获取对应帐号绑定的的sid.
而sid才是游戏真正的帐号,且其通过另一套协议来实现游戏数据的交互等等.
后续分析请等待下一篇章的到来,谢谢观看.
End.
看雪学院推出的专业资质证书《看雪安卓应用安全能力认证 v1.0》(中级和高级)!