本帖最后由 lazy心宿 于 2018-9-12 21:51 编辑
拿到 apk,国陆惯例,抓取请求
POST http://mobile.xxxx.tv/kapp/m_login.php?appid=39&appkey=O5PaX031BTwDbY6H6b5KuSxYFVygui89&client_id_android=a891d3737aa370941af5988e059e98be&device_token=7f886d67b630fd32139daf28130862ae&_member_id=&version=1.0.4&app_version=1.0.4&app_version=1.0.4&package_name=com.hoge.android.kanzhengzhou&system_version=6.0&phone_models=Nexus5HTTP/1.1 复制代码 X-API-TIMESTAMP: 1536742899112asJQht
X-API-SIGNATURE:Y2Y2MWE2N2MxNTYxYzM5ZjJjZjVmZDZlMTRhMjc3MzliYzY2Y2EzYQ==
User-Agent: Dalvik/2.1.0 (Linux; U; Android6.0; Nexus 5 Build/MRA58K) m2oSmartCity_266 1.0.0
X-API-VERSION: 1.0.4
X-AUTH-TYPE: sha1
X-API-KEY: f7664060cc52bc6f3d620bcedc94a4b6
Content-Type:application/x-www-form-urlencoded
Content-Length: 129
Host: mobile.xxx.tv
Connection: Keep-Alive
Accept-Encoding: gzip
Cookie: SERVERID=fcbf3d63324e16d517214e160848ff32|1536742868|1536742798
client_secret=111111&password=a123456&client_id=111111&client_id_android=a891d3737aa370941af5988e059e98be&member_name=18816645888 复制代码
使用 jadx 反编译 apk, 搜索 X-API-SIGNATURE
看到协议头中的时间戳X-API-TIMESTAMP ,使用的方法
SecurityUtil.getRandomData(6);
public static String[] chars_array = newString[]{"0", "1", "2", "3","4", "5", Constants.VIA_SHARE_TYPE_INFO, "7",Constants.VIA_SHARE_TYPE_PUBLISHVIDEO, "9", g.al, "b","c", g.am, "e", "f", "g","h", g.aq, "j", "k", "l","m", "n", "o", "p", "q","r", g.ap, "t", "u",MttTokenProvider.URL_PARAM_ENCRYPT_VERSION, "w", "x","y", "z", "A", "B", "C",QLog.TAG_REPORTLEVEL_DEVELOPER, QLog.TAG_REPORTLEVEL_USER, "F","G", "H", "I", "J", "K", "L", "M","N", "O", "P", "Q", "R","S", NDEFRecord.TEXT_WELL_KNOWN_TYPE, NDEFRecord.URI_WELL_KNOWN_TYPE,"V", QLog.TAG_REPORTLEVEL_COLORUSER, "X", "Y","Z"};
public static String getRandomData(int num) {
long microsecond = System.currentTimeMillis();
StringBuilder charsbuilder = new StringBuilder();
for (int i = 0; i < num; i++) {
charsbuilder.append(chars_array[(int) (Math.random() * ((double)chars_array.length))]);
}
return microsecond + charsbuilder.toString();
} 复制代码
可以看出时间戳是在后面加上了 6位的随机字符串
OK,回过头继续看协议头中的sign
可以看到,它是反射调用了com.xxx.android.jni.Utils 类中的signature 方法 ,OK,去类中看一看
可以看到signature是native方法,在m2o_jni这个so文件中
好,使用ida看看这个so
在ida中,查看导出函数表,搜索java
看到它是静态注册的 verify 方法 ,跟过去,并 F5转换伪 C看看
可以看到,它使用了sprintf函数进行了数据的拼装 ,再调用了sha1 方法
但在函数的顶部,还有一条判断语句
if ( !is_initialised )
exit(1);
下面并没有用到这个初始化的值,为了方便自己写个同包名apk调用测试这个so,还是把这个判断干掉吧
OK,改掉之后,自己写个同包名的apk,进行调用调试,查看它sha1之前的数据拼装,对了,通过分析,可以知道它带入signature的两个参数是,版本号和协议头中的时间戳
那么本次带入的两个参数就是1.0.4 和 1536742899112asJQht
写apk调用修改过的so
打包apk,把修改过的so推送到这个包下的lib目标下
Y2Y2MWE2N2MxNTYxYzM5ZjJjZjVmZDZlMTRhMjc3MzliYzY2Y2EzYQ== 复制代码 解码得到
cf61a67c1561c39f2cf5fd6e14a27739bc66ca3a 复制代码
可以看到与Toast弹出的结果一致
好了,数据对上,现在就开始调试
Ida调试so的过程就不写了,省略过程ing ,直接看结果;
可以看到带入sha1的原文就是
f7664060cc52bc6f3d620bcedc94a4b6&MkdtZXpoRU56NkRmSXFjNTlkdmV3MHpoT1UwbHFZbkc=&1.0.4&1536742899112asJQht 复制代码
本篇文章分析仅供学习交流,请勿用作违法用途,后果自负, 若有侵犯权益 联系我或论坛删除
长期接APP算法 脱壳 SO算法 等 手游/直播类/敏感违法类不碰.联系QQ:46660816