开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 12978|回复: 37
收起左侧

[技术专题] 豆瓣APP 登陆sign算法分析

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

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

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

第一步 抓登陆抓包:
  1. POST /service/auth2/token HTTP/1.1
  2. User-Agent: api-client/1 com.douban.frodo/6.1.0(139) Android/19 product/hammerhead vendor/LGE model/Nexus 5  rom/android  network/wifi
  3. Content-Type: application/x-www-form-urlencoded
  4. Host: frodo.douban.com
  5. Connection: Keep-Alive
  6. Accept-Encoding: gzip
  7. Content-Length: 392

  8. client_id=0dad551ec0f84ed02907ff5c42e8ec70&client_secret=9e8bb54dc3288cdf&redirect_uri=frodo%3A%2F%2Fapp%2Foauth%2Fcallback%2F&disable_account_create=false&grant_type=password&username=13812345678&password=1234560&channel=Yingyongbao_Market&os_rom=android&apikey=0dad551ec0f84ed02907ff5c42e8ec70&udid=596aec52fe72086faa056c1ac42a72ecd5d783d9&_sig=EQ2z1upchKZqXmbwsf1yQlrMx3o%3D&_ts=1535823784
复制代码

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

client_id0dad551ec0f84ed02907ff5c42e8ec70
client_secret9e8bb54dc3288cdf
redirect_urifrodo://app/oauth/callback/
disable_account_createfalse
grant_typepassword
username13812345678
password1234560
channelYingyongbao_Market
os_romandroid
apikey0dad551ec0f84ed02907ff5c42e8ec70
udid596aec52fe72086faa056c1ac42a72ecd5d783d9
_sigEQ2z1upchKZqXmbwsf1yQlrMx3o=
_ts1535823784


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

  1.         @JavascriptInterface public String decoratorUrl(String arg5) {
  2.             try {
  3.                 Uri v0_1 = Uri.parse(arg5);
  4.                 if(!TextUtils.equals(v0_1.getHost(), "frodo.douban.com") && !TextUtils.equals(v0_1.getHost(), "api.douban.com") && !TextUtils.equals(v0_1.getHost(), "read.douban.com")) {
  5.                     return arg5;
  6.                 }

  7.                 Uri$Builder v0_2 = Uri.parse(arg5).buildUpon().appendQueryParameter("udid", FrodoUtils.a()).appendQueryParameter("rom", Utils.g()).appendQueryParameter("apikey", FrodoUtils.b()).appendQueryParameter("s", "rexxar_new");
  8.                 if(AppContext.b() != null) {
  9.                     v0_2.appendQueryParameter("channel", AppContext.b().market);
  10.                 }

  11.                 Pair v1 = ApiSignatureHelper.a(arg5, "GET", null);
  12.                 if(v1 != null) {
  13.                     v0_2.appendQueryParameter("_sig", v1.first);
  14.                     v0_2.appendQueryParameter("_ts", v1.second);
  15.                 }

  16.                 arg5 = v0_2.build().toString();
  17.             }
  18.             catch(Exception v0) {
  19.                 v0.printStackTrace();
  20.             }

  21.             return arg5;
  22. ------------------------------------------------------------------------------------------------------------------
  23.     public static Pair a(String arg5, String arg6, String arg7) {
  24.         Pair v1 = null;
  25.         if(TextUtils.isEmpty(((CharSequence)arg5))) {
  26.             return v1;
  27.         }

  28.         String v0 = FrodoApi.a().e.b;
  29.         if(TextUtils.isEmpty(((CharSequence)v0))) {
  30.             return v1;
  31.         }

  32.         StringBuilder v2 = new StringBuilder();
  33.         v2.append(arg6);
  34.         arg5 = HttpUrl.parse(arg5).encodedPath();
  35.         if(arg5 == null) {
  36.             return v1;
  37.         }

  38.         arg5 = Uri.decode(arg5);
  39.         if(arg5 == null) {
  40.             return v1;
  41.         }

  42.         if(arg5.endsWith("/")) {
  43.             arg5 = arg5.substring(0, arg5.length() - 1);
  44.         }

  45.         v2.append("&");
  46.         v2.append(Uri.encode(arg5));
  47.         if(!TextUtils.isEmpty(((CharSequence)arg7))) {
  48.             v2.append("&");
  49.             v2.append(arg7);
  50.         }

  51.         long v5 = System.currentTimeMillis() / 1000;
  52.         v2.append("&");
  53.         v2.append(v5);
  54.         return new Pair(HMACHash1.a(v0, v2.toString()), String.valueOf(v5));
  55.     }
  56. ------------------------------------------------------------------------------------------------------------------

  57. public class HMACHash1 {
  58.     public static final String a(String arg2, String arg3) {
  59.         try {
  60.             SecretKeySpec v0 = new SecretKeySpec(arg2.getBytes(), "HmacSHA1");
  61.             Mac v2_1 = Mac.getInstance("HmacSHA1");
  62.             v2_1.init(((Key)v0));
  63.             return Base64.encodeToString(v2_1.doFinal(arg3.getBytes()), 2);
  64.         }
  65.         catch(Exception v2) {
  66.             v2.printStackTrace();
  67.             return null;
  68.         }
  69.     }
  70. }
复制代码

第四步 算法总结

_sign = HmacSHA1(v1 ,v2);

其中  v1 = "9e8bb54dc3288cdf";  (key)
        v2 = "POST&%2Fservice%2Fauth2%2Ftoken&" + 取现行10位时间戳();
--------------------------------------------------------------
附录一组原始数据

v1 = "9e8bb54dc3288cdf"
v1 = "POST&%2Fservice%2Fauth2%2Ftoken&1535823848"
sign = "bX22/PeX4rpTUGNrlyH3EN2CXZU="

第五步 算法移植

见附件哈
算法js.rar (3.02 KB, 下载次数: 148)

评分

参与人数 3精币 +4 收起 理由
zy723 + 1 很赞同,谢谢!
soonyou + 1 小小红包献上,希望能讲讲脱壳啊 你做了好几课乐固的 也不知道咋脱
¢刀丛里的诗 + 2 感谢分享,很给力!~

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (5/5)

签到天数: 21 天

发表于 2023-5-7 18:12:04 | 显示全部楼层   广东省惠州市
登录成功没
回复 支持 反对

使用道具 举报

发表于 2021-6-27 09:59:20 | 显示全部楼层   河南省信阳市
厉害了,下载看看,谢谢楼主大大
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 2 天

发表于 2021-1-9 22:49:57 | 显示全部楼层   安徽省芜湖市
谢谢分享。
回复 支持 反对

使用道具 举报

签到天数: 6 天

发表于 2019-12-14 10:17:17 | 显示全部楼层   福建省龙岩市
休息学习了
回复 支持 反对

使用道具 举报

发表于 2019-12-5 17:51:13 | 显示全部楼层   湖南省湘潭市
这就厉害了
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2019-11-4 21:44:21 | 显示全部楼层   山东省枣庄市
算法是干嘛的
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2019-10-17 00:37:12 | 显示全部楼层   上海市上海市
牛逼啊,我找了好久都没发现
回复 支持 反对

使用道具 举报

结帖率:25% (1/4)
发表于 2019-3-28 16:48:46 | 显示全部楼层   安徽省合肥市
感谢分享!!
回复 支持 反对

使用道具 举报

发表于 2019-3-7 01:01:03 | 显示全部楼层   江苏省南通市
牛逼!!!虽然看不懂,但是看起来思路好清晰啊
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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