嗯,2021年快结束了,学习忙碌一年了,年底了写点文章,总结性学习成果吧!

今天我们要分析的app是贝壳 版本号:v2.66.0,小伙伴们可以去各大应用商定自行下载,也是一个很好的逆向分析案例。

转载文章,请注明出处,谢谢!https://blog.csdn.net/weixin_38819889/article/details/122058454

参考链接:https://core.vivcms.com/2021/10/25/637.html

同系列文章推荐下:
1.聚美app之 _sign参数分析
2.大润发优鲜app之paramsMD5参数分析
3.美图秀秀 sig参数分析
4.贝壳app Authorization参数分析
5.豆瓣app sig参数分析
6.半次元app之data参数分析

1.抓包找参数

第一步,打开我们的charles直接抓包,发现这个时候没有抓到对应的包。好吧,那我们换一种vpn抓包的方式。先打开postern,然后再开启charles,这个时候就成功的抓到数据包了,如下图所示,Authorization 就是要分析研究的字段,经过多次的测试,发现其他字段可以去掉,但唯独这个字段是不能的。

2.反编译和静态分析

找到这个加密参数 Authorization ,接下来就是反编译apk,来把我们的贝壳app拖进去jadx里面,看看加密逻辑是咋写的。

搜索一波,感觉这里很像的样子map2.put("Authorization", getSignString(str3, null)); ,点进去看一看。然后我们来到这里了,可以看到(下图)这里是调用一个getSignString()方法,并传入参数str3 和null,然后计算出结果当做Authorization 的值。


跟进去看看 getSignString()方法是咋实现的,然后就来到了这里。

具体代码如下,没错,可以大胆的猜测下,这就是最核心的加密方法。首先,我们先静态分析一波逻辑,然后再用frida动态调试下,验证下我们的猜想对不对。

  public String getSignString(String str, Map<String, String> map2) {Map<String, String> urlParams = getUrlParams(str);HashMap hashMap = new HashMap();if (urlParams != null) {hashMap.putAll(urlParams);}if (map2 != null) {hashMap.putAll(map2);}ArrayList arrayList = new ArrayList(hashMap.entrySet());Collections.sort(arrayList, new Comparator<Map.Entry<String, String>>() { // from class: com.bk.base.netimpl.a.1public int compare(Map.Entry<String, String> entry, Map.Entry<String, String> entry2) {return entry.getKey().compareTo(entry2.getKey());}});String httpAppSecret = ModuleRouterApi.MainRouterApi.getHttpAppSecret();boolean notEmpty = Safe.C2266e.notEmpty(httpAppSecret);String str2 = BuildConfig.FLAVOR;if (!notEmpty) {try {httpAppSecret = JniClient.GetAppSecret(APPConfigHelper.getContext());} catch (Exception e) {e.printStackTrace();httpAppSecret = str2;}}String httpAppId = ModuleRouterApi.MainRouterApi.getHttpAppId();if (Safe.C2266e.notEmpty(httpAppId)) {str2 = httpAppId;} else {try {str2 = JniClient.GetAppId(APPConfigHelper.getContext());} catch (Exception e2) {e2.printStackTrace();}}StringBuilder sb = new StringBuilder(httpAppSecret);for (int i = 0; i < arrayList.size(); i++) {Map.Entry entry = (Map.Entry) arrayList.get(i);sb.append(((String) entry.getKey()) + "=" + ((String) entry.getValue()));}String str3 = TAG;LjLogUtil.m30128d(str3, "sign origin=" + ((Object) sb));String SHA1ToString = DeviceUtil.SHA1ToString(sb.toString());String encodeToString = Base64.encodeToString((str2 + ":" + SHA1ToString).getBytes(), 2);String str4 = TAG;LjLogUtil.m30128d(str4, "sign result=" + encodeToString);return encodeToString;}

可以看到getSignString()方法传入两个参数,一个是string字符串类型参数,另外一个是hashmap类型参数。首先调用getUrlParams()方法,这个方法就是就是得到请求url后面那一堆参数的。

  private Map<String, String> getUrlParams(String str) {if (str == null || str.length() == 0) {return null;}HashMap hashMap = new HashMap();Uri parse = Uri.parse(str);for (String str2 : parse.getQueryParameterNames()) {String str3 = str2.toString();hashMap.put(str3, parse.getQueryParameter(str3));}return hashMap;}

接着尼就是声明一个hashmap,分别把urlParamsmap2放进去,然后又定义一个arrayList数组,并对数组排个序。之后又定义了两个变量 httpAppSecrethttpAppId,具体是干嘛的,值到底是多少,没事,目前不知道 不要紧 ,我们继续往下看。

接着又定一个字符串sb,先把httpAppSecret加进去,再接着把arrayList数组里面的元素取出来,做一个拼接的操作。然后来到这个方法处DeviceUtil.SHA1ToString(sb.toString());,看关键词就能够大概的猜想到这一个sha1算法。

  public static String SHA1ToString(String str) {try {MessageDigest instance = MessageDigest.getInstance("SHA-1");instance.update(str.getBytes());byte[] digest = instance.digest();StringBuffer stringBuffer = new StringBuffer();for (byte b : digest) {String hexString = Integer.toHexString(b & 255);if (hexString.length() < 2) {stringBuffer.append(0);}stringBuffer.append(hexString);}return stringBuffer.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return BuildConfig.FLAVOR;}}

最后把sha1计算的结果和str2参数拼接(Base64.encodeToString((str2 + ":" + SHA1ToString).getBytes(), 2);),并做了一个base64操作,这个str2 就是之前 httpAppId,计算出来的值就是最后加密结果,也就是Authorization。

3.frida动态调试

静态分析已经差不多了,是时候拿出我们的frida了,看看实际传参和结果到底是个什么样子的,以及 httpAppSecrethttpAppId到底是什么。

js代码如下:

Java.perform(function(){var getSig = Java.use("com.bk.base.netimpl.a");getSig.getSignString.implementation = function (v1, v2) {console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");console.log("Sig参数1: " + v1);var it = v2.keySet().iterator();var result = "";while(it.hasNext()){var keystr = it.next().toString();var valuestr = v2.get(keystr).toString();result += keystr + valuestr + "        ";}console.log("Sig参数2: " + result);var res = this.getSignString(v1,v2)console.log("Sig加密后的数据:", res)console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");return res;}var api = Java.use("com.bk.base.router.ModuleRouterApi");api.getHttpAppSecret = function (){console.log("getHttpAppSecret" + api.getHttpAppSecret());return api.getHttpAppSecret();}api.getHttpAppId = function () {console.log("getHttpAppId" + api.getHttpAppId());return api.getHttpAppId();}var jni = Java.use("com.homelinkndk.lib.JniClient");jni.GetAppId.implementation = function (v1) {var res  = this.GetAppId(v1);console.log("appId Jni param1: " + v1);console.log("appId Jni: " + res);return res;}var log = Java.use("com.bk.base.util.bk.LjLogUtil");log.d.overload('java.lang.String', 'java.lang.String').implementation = function (v1,v2){console.log("Log.d(): " + "v1:", v1, "v2:", v2);}var encrypt = Java.use('com.bk.base.util.bk.DeviceUtil');encrypt.SHA1ToString.implementation = function(parm1){console.log("SHA1加密前参数:", parm1)var res = this.SHA1ToString(parm1)console.log("SHA1加密后结果:", res)return res;}
});

httpAppId是一个固定值 20180111_android:,来源就是如下:

继续分析httpAppSecret的来源,先看看sha1加密的过程:

SHA1加密前参数: d5e343d453aecca8b14b2dc687c381cacity_id=110000home_ab_group=Bis_first_entry=0latitude=39.974194longitude=116.416306page=1tab_id=rentV2
SHA1加密后结果: 69afab7f7275b2b49f4b7790033498fcae22f343

可以看到在执行sha1加密传参之前,先拼接一个固定字符串d5e343d453aecca8b14b2dc687c381ca,然后是拼接请求的url后面的参数,没错 这个固定值 就是httpAppSecret。

然后说一说get和post 请求方式的不同。get请求的时候,hashmap为null,而post请求把请求的body参与计算。



然后分析就是到此结束了。

4 代码还原:

具体代码就不公布了,毕竟对别人不太友好。看看最后拿到的数据。有兴趣的可以自己尝试分析一波,肯定是会有很多收获的。

贝壳app Authorization参数分析相关推荐

  1. 豆瓣app sig参数分析

    今天我们要分析的app 是豆瓣, 版本号7.18.0,下载链接小伙伴们可以去各大应用商定自行下载.怕自己忘,赶紧记录下分析流程,是作为一个逆向分析的很好案例. 参考链接: https://blog.c ...

  2. 某某虾App加密参数分析

    0x01 写在前面 对于AppHook这项技术,说难不难,说简单也不简单,唯一的特点就是比较费头发.因为你需要在别人浩如烟海的代码中推导出你想要的东西,而且最终的推导结果还不一定如你所愿.所以搞这种东 ...

  3. 某美颜app sig参数分析

    之前转载过该app的文章,今天翻版重新整理下,版本号:576O5Zu+56eA56eAYXBwIHY5MDgw (base64 解码). 上来先抓个包: jadx搜索关键词 "sigTime ...

  4. 汽车之家APP口碑--参数分析

    环境: win10 ,Contos7.4 python3.6.1 pycharm2017 retrying=1.3.3 requests=2.22.0 fake_useragent 抓取口碑数据接口: ...

  5. 某次元app之data参数分析

    今天我们要分析的app 是5Y2K5qyh5YWD54mI5pys5Y+3djUuMC44 ,小伙伴们可以去各大应用商定自行下载. 同系列文章推荐下: 1.聚美app之 _sign参数分析 2.大润发 ...

  6. 聚美app之 _sign参数分析

    今天我们要分析的app 是聚美优品, 版本号v8.781 (当前最新版),小伙伴们可以去各大应用商定自行下载. 转载请注明出处: https://blog.csdn.net/weixin_388198 ...

  7. 大润发优鲜app之paramsMD5参数分析

    今天我们要分析的app 是大润发优鲜, 版本号1.4.0,小伙伴们可以去各大应用商定自行下载,软件使用360壳且混淆,APP校验了HTTPS证书,需要使用xposed的JustTrustMe模块. 参 ...

  8. 飞瓜快数app之sign参数分析

    趁着还有一些记忆,赶紧记录下. 今天我们要分析的app 是飞瓜快数,版本号v1.0.8 ,小伙伴们可以去各大应用商定自行下载. 只做参数分析,用来学习,如有侵权,请联系博主,第一时间删除. 转载请注明 ...

  9. 美图秀秀 sig参数分析

    转载一篇好的博客,原始链接 https://mp.weixin.qq.com/s/5kUDmlPvIOw-6mdzywvyFA 推荐一波,这是博主的网站:https://www.qinless.com ...

最新文章

  1. 用Leangoo管理你的项目
  2. Java NIO 学习笔记 缓冲区补充
  3. php smtp报文_PHP 使用 SMTP 发送邮件教程(PEAR Mail 包)
  4. java自定义线程池池,线程池使用及自定义线程池
  5. Java Web模块——验证码模块
  6. Flutter 页面滚动吸顶详解(NestedScrollView)
  7. Mac上搭建Go语言环境及第一个hello.go程序
  8. 面试官:谈谈你对Spring AOP的了解?请加上这些内容,绝对加分!
  9. 算法笔记_面试题_22. 图与搜索(BFS/DFS)相关_模板及示例十几道
  10. 黑马程序员-android视频播放器
  11. 我做的通用象棋连线器,可以连接到游戏大厅
  12. 圆柱体积计算机公式,圆柱体积计算公式
  13. 23位子网掩码是多少_子网掩码23位的是多少
  14. 台式机局域网电脑通过笔记本的无线网络上网
  15. 一个mysql事务引发的思考(血案)
  16. linux服务器安装mysql步骤详解
  17. python怎么换背景_python – 我如何在Mac OS X中编程改变背景?
  18. 如何在php中添加音乐播放器,window_Win10自带Groove音乐播放器怎么使用?,《Groove音乐》是微软在Win10系 - phpStudy...
  19. 美团CodeM2018资格赛赛题官方版本详解(二)——可乐
  20. MULE DW Function 使用expression transformer解析嵌套MEL

热门文章

  1. 配置jvm堆最大内存eden区与s0或者s1区域比例
  2. Treiber Stack简单分析
  3. vue.js的一些小语法v-bind,v-if,v-show,v-else
  4. 嵌入式产品开发设计需要考虑的问题总结
  5. 马云致投资者公开信:大数据云计算是阿里未来十年核心战略之一
  6. Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象
  7. 图像特效——摩尔纹 moir
  8. ZOJ 3430 Detect the Virus 【AC自动机+解码】
  9. [转] 爱情的隐式马尔可夫模型(Love in the Hidden Markov Model)
  10. Win7重启后IP地址无效