开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 7584|回复: 16
收起左侧

[技术专题] 飞客茶馆IHG APP HmacSHA256 算法分析

[复制链接]
结帖率:100% (1/1)
发表于 2018-8-25 00:40:08 | 显示全部楼层 |阅读模式   上海市上海市
本帖最后由 小范q 于 2018-8-25 00:42 编辑

PS:APP 提供来源
app 下载 地址:
http://sj.qq.com/myapp/detail.htm?apkName=com.ideal.flyerteacafes

app 提供来源:
https://bbs.125.la/forum.php?mod=viewthread&tid=14222184&highlight=APP


第一步 抓登陆抓包:

  1. POST /api/mobile/index.php?version=4&mobile=yes&cookietime=2592000&module=login&loginsubmit=yes&loginfield=auto&appkey=98bf6a79892a1148a1&token=MHwxNTM1MTI2NDQyODY1fDI3ZTEwY2IwMzJkZWVhYzc1ZThjMjcxYzQ3MTViODkwZWRiYWFiZTIyNTM2OTkzM2E1ZWRjNGM5MzNmOTM0Y2U%253D&appversion=6.24.0&transcode=yes HTTP/1.1
  2. Cookie: cu3z_a47d_saltkey=m93mC04o; cu3z_a47d_uacc=9BDCDB5AC04DB852; cu3z_a47d_lastvisit=1535121212; cu3z_a47d_dismobilemessage=1; cu3z_a47d_nofavfid=1; cu3z_a47d_lastviewtime=0%7C1535125812; acw_tc=AQAAAGMZC0HSRAsADIhP2jtOmVhBTAPH; cu3z_a47d_mobile=2; cu3z_a47d_lastact=1535126355%09index.php%09
  3. User-Agent: FKForum/6.24.0 (oppo oppo a59m; Android 5.1.1; Scale/540*960)
  4. Content-Type: application/x-www-form-urlencoded;charset=UTF-8
  5. Content-Length: 91
  6. Host: www.flyertea.com
  7. Connection: Keep-Alive
  8. Accept-Encoding: gzip

  9. username=13812345678&password=1234567890&Registrationid=1507bfd3f79390d77af&loadCache=false
复制代码


第二步 分析加密主要参数:

token=MHwxNTM1MTI2NDQyODY1fDI3ZTEwY2IwMzJkZWVhYzc1ZThjMjcxYzQ3MTViODkwZWRiYWFiZTIyNTM2OTkzM2E1ZWRjNGM5MzNmOTM0Y2U%253D


第三步 反编译逆向找到其主要算法



  1. --------------------------------------------------------------------------------------------------------------------------
  2.    private void usernameLogin(String arg5, String arg6) {
  3.         this.getDialog().proDialogShow();
  4.         XutilsHelp.clearCookie();
  5.         FlyRequestParams v1 = new FlyRequestParams(HttpRequest.HTTP_login);
  6.         v1.addQueryStringParameter("transcode", "(TV;)V");
  7.         v1.addBodyParameter("username", arg5);
  8.         v1.addBodyParameter("password", arg6);
  9.         v1.addBodyParameter("Registrationid", JPushInterface.getRegistrationID(FlyerApplication.getContext()));
  10.         XutilsHttp.Post(v1, new StringCallback() {
  11.             public void flySuccess(Object arg1) {
  12.                 this.flySuccess(((String)arg1));
  13.             }

  14.             public void flySuccess(String arg4) {
  15.                 if(LoginVideoPresenter.this.isViewAttached()) {
  16.                     Logger.i("<+TE;>;>;)", new Object[0]);
  17.                     if(JsonAnalysis.isSuccessEquals1(arg4)) {
  18.                         LoginVideoPresenter.this.loginInit(JsonAnalysis.getBean(arg4, LoginBase.class));
  19.                     }
  20.                     else {
  21.                         ToastUtils.showToast(JsonAnalysis.getMessage(arg4));
  22.                         LoginVideoPresenter.this.getDialog().proDialogDissmiss();
  23.                     }
  24.                 }
  25.             }
  26.         });
  27.     }
  28. ------------------------------------------------------------------------------------------------------------------
  29. public class FlyRequestParams extends RequestParams {
  30.     private boolean loadCache;

  31.     public FlyRequestParams(String arg11) {
  32.         super(arg11);
  33.         this.loadCache = false;
  34.         String v4 = UserManger.isLogin() ? UserManger.getUserInfo().getMember_uid() + ", locaPath=\'" + DateUtil.getDateline() : "0|" + DateUtil.getDateline();
  35.         String v3 = StringTools.encodeBase64(v4 + ", locaPath=\'" + HmacSha256.getSignature(v4, "feb0e9a398bf6a79892a114825316a93").getBytes());
  36.         this.addQueryStringParameter("appkey", "98bf6a79892a1148a1");
  37.         this.addQueryStringParameter("token", v3);
  38.         this.addQueryStringParameter("appversion", Tools.getVersion());
  39.         String v0 = UserManger.getCookie();
  40.         if(!TextUtils.isEmpty(((CharSequence)v0))) {
  41.             this.addHeader("Cookie", v0);
  42.         }

  43.         Object v2 = FlyerApplication.getContext().getSystemService("÷");
  44.         this.addHeader("User-Agent", "FKForum/" + Tools.getVersion() + " (" + Build.BRAND + " " + Build.MODEL + "; Android " + Build$VERSION.RELEASE + "; Scale/" + ((WindowManager)v2).getDefaultDisplay().getWidth() + "*" + ((WindowManager)v2).getDefaultDisplay().getHeight() + ") ");
  45.     }
  46. ------------------------------------------------------------------------------------------------------------------
  47.     public static long getDateline() {
  48.         return System.currentTimeMillis();
  49.     }
  50. ------------------------------------------------------------------------------------------------------------------
  51.     public static String getSignature(String arg7, String arg8) {
  52.         Mac v3;
  53.         SecretKeySpec v5 = new SecretKeySpec(arg8.getBytes(), "HmacSHA256");
  54.         try {
  55.             v3 = Mac.getInstance("HmacSHA256");
  56.             v3.init(((Key)v5));
  57.         }
  58.         catch(InvalidKeyException v0) {
  59.             v0.printStackTrace();
  60.         }
  61.         catch(NoSuchAlgorithmException v0_1) {
  62.             v0_1.printStackTrace();
  63.         }

  64.         return HmacSha256.byte2hex(v3.doFinal(arg7.getBytes()));
  65.     }
复制代码


第四步 算法总结

Token = Base64En(v1 + ", locaPath=\'" + HmacSha256(v1, key));

PS:
① 【
v1 = UserManger.isLogin() ? UserManger.getUserInfo().getMember_uid() + ", locaPath=\'" + DateUtil.getDateline() : "0|" + DateUtil.getDateline();
简言之 当APP处于登陆状态:  
                 v1 = uid +  ", locaPath=\'" + 现行13位时间戳();
              未登录状态 :
                 v1 = "0|" + 现行13位时间戳();


② key = "feb0e9a398bf6a79892a114825316a93";


第五步 算法移植

js 移植见附件

js移植.rar (3.69 KB, 下载次数: 90)

评分

参与人数 3精币 +3 收起 理由
zy723 + 1 感谢发布原创作品,精易因你更精彩!
soonyou + 1 希望下回说说加固脱壳 不然第一步就已经卡住了
蓝蓝2018 + 1 感谢发布原创作品,精易因你更精彩!

查看全部评分


结帖率:0% (0/1)
发表于 2022-2-24 20:57:20 | 显示全部楼层   四川省南充市
算法移植
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2022-2-24 20:56:54 | 显示全部楼层   四川省南充市
算法移植
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2019-10-8 00:53:05 | 显示全部楼层   河南省郑州市
感谢分享 谢谢大佬
回复 支持 反对

使用道具 举报

发表于 2019-10-6 22:59:15 | 显示全部楼层   河南省新乡市
看看能用不
回复 支持 反对

使用道具 举报

签到天数: 19 天

发表于 2019-8-27 08:13:43 | 显示全部楼层   浙江省金华市
支持,感谢楼主
回复 支持 反对

使用道具 举报

结帖率:63% (5/8)

签到天数: 2 天

发表于 2018-10-31 10:22:50 高大上手机用户 | 显示全部楼层   山东省青岛市
支持下,给了这么多的例子和答案,谢谢
回复 支持 反对

使用道具 举报

发表于 2018-9-13 15:05:08 | 显示全部楼层   广东省惠州市
谢谢楼主  
回复 支持 反对

使用道具 举报

发表于 2018-9-7 14:16:26 | 显示全部楼层   吉林省通化市
列害感谢分享
回复 支持 反对

使用道具 举报

结帖率:40% (4/10)

签到天数: 1 天

发表于 2018-9-5 13:40:44 | 显示全部楼层   重庆市重庆市
学习了,不错。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表