吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20173|回复: 287
收起左侧

[Android 原创] 某拉雅的登录协议复现

    [复制链接]
你就是我的阳光 发表于 2022-7-7 19:15
本帖最后由 你就是我的阳光 于 2022-7-9 11:12 编辑

闲来无事想找一个APP试试手,就看到了某个APP就有了这一篇文章,第一次发帖,如写的不好请谅解第一步当然是抓包啊
1.png
可以看到一共是三个请求,仔细看看这三个请求pwd这个请求带了5个参数,一看到有加密,瞬间想知道用的什么算法。这个时候看到pwd这个请求里面有一个字段是nonce,正巧上面也有一个请求的名字也是nonce所以就去看看吧。
2.png
这个时候好像发现了一个秘密,这竟然是pwd里的nonce字段那么同样,下面还有一个请求呢,那是不是里面也存在东西
3.png
发现pwd请求中的fdsOtp正是这个请求返回的token,那么这时候暗自窃喜,已经找到两个了, 模拟一下就可以得到,那剩下三个参数不是简简单单。


打开jadx吧
5.png
看到关于登录的就这么多,一个一个看呗,也不多。
6.png
account不是出现在请求中么,先往后看一眼是什么逻辑
7.png
这跟进来看着很清晰啊
8.png
在看看ZaZJiHJbQT这个函数的逻辑是什么
9.png
哦豁 是个native函数。那打开IDA
10.png
起来就一个函数啊,那应该就是这个,加密就在里面快冲
当我双击进去的时候花的时间有点久,我就觉得可能大事不妙
11.png
好家伙,果然。看到这个流程图完全不想看啊。
这时候有一个办法 上unidbg,补环境是一个很头疼的问题。花的时间有点久
12.png
但是我这里不知道是什么原因,结果出不来,那就重头好好看看吧
13.png
嗯.......全是反射,不过上来就看到了RSA往下看也没什么好像就是一个RSA,公钥在第一行也给出来了。那么,账号密码都是RSA加密了,但是每次RSA加密的结果都是不一样的,只能往后模拟一下请求吧。
现在就剩最后一个参数了。
14.png
还是跟刚才一样找关键字呗,到了这个函数的时候一瞬间,这不就是请求的五个参数
15.png
跟到最后发现调用的是RIdAPyTgEt,不用想这个肯定也混淆了。还试试unidbg呗
哦对了忘了说,这个参数如果不知道是什么的话,先用frida看一下
[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
function hook_native() {
     Java.perform(function() {
         var i = Java.use("com.ximalaya.ting.android.loginservice.LoginEncryptUtil");
         i.RIdAPyTgEt.overload('android.content.Context', 'boolean', 'java.lang.String').implementation = function (arg1,arg2,arg3) {
            console.log('RIdAPyTgEt arg1 = ' + arg1)
            console.log('RIdAPyTgEt arg2 = ' + arg2)
            console.log('RIdAPyTgEt arg3 = ' + arg3)
            var ret = this.RIdAPyTgEt(arg1,arg2,arg3)
            console.log('RIdAPyTgEt ret = ' + ret)
            return ret
        }
 
        i.ZaZJiHJbQT.overload('java.lang.String').implementation = function (arg1) {
            console.log('ZaZJiHJbQT arg1 = ' + arg1)
            // console.log('arg2 = ' + arg2)
            var ret = this.ZaZJiHJbQT(arg1)
            console.log('ZaZJiHJbQT ret = ' + ret)
            return ret
        }
     });
}

16.png
这样子参数不就很清晰了嘛,就只接用unidbg模拟一下吧
17.png
但是很不幸,死在了系统调用。没有办法,拿出同事的脚本。
18.png
这时候我发现了跟我传进来的格式差不多,但是多了一串东西
19.png
继续往下发现,全大写了。
20.png
紧接着直接做了加密,那么就没错了,那就是传进来的东西拼接一个东西,在做一个加密,那么这个加密是啥啊,40个字节的一个加密,像sha1啊,找个在线的试试去
21.png
一模一样啊,那就是sha1
这个时候算法已经很清晰了啊。
1.先发送一个请求,在服务器返回包中拿到 fdsOtp
2.发送第二个请求,在服务器返回包中拿到nonce
3.在使用ZaZJiHJbQT加密账号密码算法是RSA,加密以后的格式要确保一致
4.用同一个so中的RIdAPyTgEt加密得到signature,在so中拼接了一个字符串,使用sha1加密。
5.上面步骤完成以后才可以正确请求到。写代码写代码。

[Python] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# -*- coding:utf-8 -*-
 
import json
import time
import hashlib
import requests
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from base64 import b64decode
from base64 import b64encode
 
proxy = {'http': 'http://139.155.48.55:1089', 'https': 'http://139.155.48.55:1089'}
 
def get_nonce():
    """
    :return: nonce的值
    """
    t = time.time()
    data_time = int(round(t * 1000))  # 毫秒级时间戳
    url = "https://passport.ximalaya.com/mobile/nonce/" + str(data_time)
    header = {
        "Cookie": "1&_device=android&59683601-c043-33af-95d4-413ba0788573&9.0.22;channel=Avril22;impl=com.ximalaya.ting.android;osversion=29;fp=009314627x2222q2v644v0500b0000022002000000000000200000000000;device_model=MI+8;XIM=;c-oper=%E6%9C%AA%E7%9F%A5;net-mode=WIFI;freeFlowType=0;res=1080%2C2029;AID=n+Ew49Cv/1Y=;manufacturer=Xiaomi;XD=NSRvWEdehdyqqdzAdbPbJbOfbPFruUAJe3HFBaJ0z438KV7oI/Q/czqtjV2TmpUvQtc0VKk72doYCGDVyUUkqe+kAr9y9XC5FdiYPvv8e66Wf7z4JEulczsJmwNd27g/;umid=0e42f21fc3f4e8704728805785e97255od;xm_grade=0;minorProtectionStatus=0;oaid=5d3cfedc6c1bd5aa;domain=.ximalaya.com;path=/;",
        "Cookie2": "$version=1",
        "Accept": "*/*",
        "user-agent": "ting_9.0.22(MI+8,Android29)",
        "x-xuid": "78c5c143-aa52-3f77-b3b6-fb4d0c289c3a",
        "Host": "passport.ximalaya.com",
        "Connection": "Keep-Alive",
        "Accept-Encoding": "gzip"
    }
    req = requests.get(url, headers=header)
    print("nonce响应结果 = ",req.text)
    nonce = json.loads(req.text)
    nonce = nonce["nonce"]
    print('nonce = ', nonce)
    return nonce
 
def get_fdsOtp():
    """
    :return: fdsOtp的值
    """
    t = time.time()
    data_time = int(round(t * 1000))  # 毫秒级时间戳
    get_token_url = "https://mobile.ximalaya.com/captcha-web/check/slide/get?bpId=139&sessionId=59683601-c043-33af-95d4-413ba0788573" + str(data_time) + "&requestType=xmClient"
    get_token_header = {
        "Cookie": "1&_device=android&59683601-c043-33af-95d4-413ba0788573&9.0.22;channel=Avril22;impl=com.ximalaya.ting.android;osversion=29;fp=009314627x2222q2v644v0500b0000022002000000000000200000000000;device_model=MI+8;XIM=;c-oper=%E6%9C%AA%E7%9F%A5;net-mode=WIFI;freeFlowType=0;res=1080%2C2029;AID=n+Ew49Cv/1Y=;manufacturer=Xiaomi;XD=NSRvWEdehdyqqdzAdbPbJbOfbPFruUAJe3HFBaJ0z438KV7oI/Q/czqtjV2TmpUvQtc0VKk72doYCGDVyUUkqe+kAr9y9XC5FdiYPvv8e66Wf7z4JEulczsJmwNd27g/;umid=0e42f21fc3f4e8704728805785e97255od;xm_grade=0;minorProtectionStatus=0;oaid=5d3cfedc6c1bd5aa;domain=.ximalaya.com;path=/;",
        "Cookie2": "$version=1",
        "Accept": "*/*",
        "user-agent": "ting_9.0.22(MI+8,Android29)",
        "x-xuid": "78c5c143-aa52-3f77-b3b6-fb4d0c289c3a",
        "Accept-Encoding": "gzip"
    }
    req = requests.get(get_token_url, headers=get_token_header)
    print("fdsOtp响应结果 = ",req.text)
    fdsOtp = json.loads(req.text)
    fdsOtp = fdsOtp['token']
    print("fdsOtp = ", fdsOtp)
    return fdsOtp
 
def sha1_secret_str(s):
    """
    :param s: 需要加密的字符串
    :return: 做完sha1的结果
    """
    sha = hashlib.sha1(s.encode('utf-8'))
    encrypts = sha.hexdigest()
    return encrypts
 
def login(account,password,fdsOtp,nonce):
    """
    :param account: 用户名
    :param password: 密码
    :param fdsOtp: fdsOtp
    :param nonce: nonce
    :return:
    """
    post_url = "https://passport.ximalaya.com/mobile/login/pwd/v3"
    post_header = {
        "Cookie": "1&_device=android&59683601-c043-33af-95d4-413ba0788573&9.0.22;channel=Avril22;impl=com.ximalaya.ting.android;osversion=29;fp=009314627x2222q2v644v0500b0000022002000000000000200000000000;device_model=MI+8;XIM=;c-oper=%E6%9C%AA%E7%9F%A5;net-mode=WIFI;freeFlowType=0;res=1080%2C2029;AID=n+Ew49Cv/1Y=;manufacturer=Xiaomi;XD=NSRvWEdehdyqqdzAdbPbJbOfbPFruUAJe3HFBaJ0z438KV7oI/Q/czqtjV2TmpUvQtc0VKk72doYCGDVyUUkqRWBD1AcqgIlS9o5aEQyWw97unfTMyod0vYnavI0Tm/o;umid=0e42f21fc3f4e8704728805785e97255od;xm_grade=0;minorProtectionStatus=0;oaid=5d3cfedc6c1bd5aa;domain=.ximalaya.com;path=/;",
        "Cookie2": "$version=1",
        "Accept": "*/*",
        "user-agent": "ting_9.0.22(MI+8,Android29)",
        "x-xuid": "78c5c143-aa52-3f77-b3b6-fb4d0c289c3a",
        "Host": "passport.ximalaya.com",
        "Content-Type": "application/json; charset=utf-8",
        "Accept-Encoding": "gzip",
        "Connection": "Keep-Alive"
 
    }
 
    signature = "ACCOUNT=" + account.upper() + "&FDSOTP=" + fdsOtp + "&NONCE=" + nonce.upper() + "&PASSWORD=" + password.upper() + "&MOBILE-V1-PRODUCT-7D74899B338B4F348E2383970CC09991E8E8D8F2BC744EF0BEE94D76D718C089"
    print("signature = ", signature)
    print("signature sha1 =", sha1_secret_str(signature.upper()))
 
    signature_sha1 = sha1_secret_str(signature)
 
    post_dict = {
        "password": password,
        "fdsOtp": fdsOtp,
        "signature": signature_sha1,
        "nonce": nonce,
        "account": account
    }
    print("Body = ",post_dict)
 
    req = requests.post(post_url, data=json.dumps(post_dict).encode("utf-8"), headers=post_header)
    print("登录结果 = ",req.text)
 
 
def get_end_username(account):
    """
    :param account: 没有组成官方格式的用户名
    :return: 按照官方格式组成的加密结果
    """
    account_1 = account[:76]
    account_2 = account[76:152]
    account_3 = account[152:]
    print("account = ",account)
    # print("account_1 = ",account_1)
    # print("account_2 = ",account_2)
    # print("account_3 = ",account_3)
 
    return account_1 + "\n" + account_2 + "\n" + account_3
 
def get_end_password(password):
    """
    :param password: 没有组成官方格式的密码
    :return: 按照官方格式组成的加密结果
    """
    password_1 = password[:76]
    password_2 = password[76:152]
    password_3 = password[152:]
    print("password = ", password)
    # print("password_1 = ", password_1)
    # print("password_2 = ", password_2)
    # print("password_3 = ", password_3)
 
    return password_1 + "\n" + password_2 + "\n" + password_3
 
 
public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVhaR3Or7suUlwHUl2Ly36uVmboZ3+HhovogDjLgRE9CbaUokS2eqGaVFfbxAUxFThNDuXq/fBD+SdUgppmcZrIw4HMMP4AtE2qJJQH/KxPWmbXH7Lv+9CisNtPYOlvWJ/GHRqf9x3TBKjjeJ2CjuVxlPBDX63+Ecil2JR9klVawIDAQAB";
def rsa_encrypt(s):
    key = b64decode(public_key)
    # print(key)
    key = RSA.importKey(key)
 
    cipher = PKCS1_v1_5.new(key)
    ciphertext = b64encode(cipher.encrypt(bytes(s, "utf-8")))
 
    return ciphertext
 
def main(event, context):
 
    # 获取fdsOtp
    fdsOtp = get_fdsOtp()
 
    # 获取nonce
    nonce = get_nonce()
 
    # 账号密码加密
    account = rsa_encrypt("xxxxxx").decode()
    password = rsa_encrypt("xxxxxx").decode()
 
    # # 重组account
    # account = get_end_username(account)
    # # password
    # password = get_end_password(password)
    # print(account)
    # print(password)
 
    # 登录
    login(account,password,fdsOtp,nonce)
 
if __name__ == '__main__':
    main('','')



21.png

总体来说呢,花的时间有点长了,还是因为太菜了。很多图也是后来补的,大概的一个思路就是这个样子,可能写的不太好,轻喷。




改了代码,Python不用调用java了,但是我这里登陆出现滑块验证了...token拿不到报错了,不知道是为什么。。。。。

免费评分

参与人数 99吾爱币 +90 热心值 +91 收起 理由
xieyi2003 + 1 我很赞同!
dxw1819 + 1 我很赞同!
c070955 + 1 谢谢@Thanks!
qq5649350 + 1 + 1 用心讨论,共获提升!
deffun + 1 + 1 我很赞同!
天空宫阙 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fsunmoon + 1 谢谢@Thanks!
poiujk001 + 1 + 1 热心回复!
tianya113 + 1 我很赞同!
seal2000 + 1 + 1
xgzzzzz + 1 + 1 我很赞同!
zjkedy + 1 + 1 谢谢@Thanks!
satan2022 + 1 + 1 我很赞同!
Bizhi-1024 + 1 用心讨论,共获提升!
victos + 1 + 1 谢谢@Thanks!
anya123 + 1 谢谢@Thanks!
hxw555 + 1 + 1 我很赞同!期待会员账号
baiyunem + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
pxw1985 + 1 + 1 我很赞同!
Garfiel + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
buchanghua + 1 + 1 我很赞同!
鸣蜩十四 + 1 + 1 我很赞同!
zhangheyi + 1 我很赞同!
Tiffany11 + 1 + 1 我很赞同!
Dd112233 + 1 + 1 热心回复!
xulonglong1998 + 1 谢谢@Thanks!
timeFriend + 1 + 1 我很赞同!
eveofm + 1 + 1 <font style="vertical-align: inherit;"><font style=
2580369 + 1 我很赞同!
liyinan327 + 1 + 1 用心讨论,共获提升!
YxiaoxuanL + 1 + 1 我很赞同!
李佑辰 + 1 + 1 我很赞同!
pelephone + 1 + 1 我很赞同!
you920928 + 1 + 1 谢谢@Thanks!
mis落为 + 1 热心回复!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
xlwllm + 1 + 1 我很赞同!
zk7274 + 1 + 1 热心回复!
温馨提示 + 1 + 1 我很赞同!
li302573596 + 1 + 1 热心回复!
4oo4 + 1 + 1 用心讨论,共获提升!
conquerorfy + 1 + 1 我很赞同!
zhang_yj + 1 + 1 我很赞同!
harryczqp + 1 + 1 热心回复!
gaosld + 1 + 1 用心讨论,共获提升!
lyslxx + 1 + 1 我很赞同!
ggsir + 1 + 1 热心回复!
YuanFang0w0 + 1 用心讨论,共获提升!
zhengsg5 + 1 我很赞同!
yixi + 1 + 1 谢谢@Thanks!
youme10000 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Akihi6 + 1 我很赞同!
bigmouse + 1 + 1 我很赞同!
人家故里 + 1 + 1 热心回复!
azcolf + 1 + 1 热心回复!
hhtvcn + 1 + 1 谢谢@Thanks!
clite + 1 + 1 用心讨论,共获提升!
skywx88 + 1 谢谢@Thanks!
bossangel + 1 + 1 用心讨论,共获提升!
louchen1994 + 1 + 1 我很赞同!
kodashen + 1 + 1 用心讨论,共获提升!
水平平 + 1 + 1 我很赞同!
miaoj29 + 1 谢谢@Thanks!
tiankexingli + 1 + 1 我很赞同!
独行风云 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Tulinzero + 1 + 1 谢谢@Thanks!
gunxsword + 1 + 1 热心回复!
zudeng + 1 热心回复!
it_harry + 1 + 1 热心回复!
zk0017 + 1 + 1 我很赞同!
Coocle + 1 我很赞同!
Himalaya + 1 我很赞同!
lyq87 + 1 + 1 谢谢@Thanks!
无息的悲伤 + 1 + 1 谢谢@Thanks!
shouwanglove + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
1MajorTom1 + 1 热心回复!
tunis + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
朝太阳奔跑 + 1 + 1 热心回复!
说再见 + 1 用心讨论,共获提升!
小黑侠 + 1 + 1 用心讨论,共获提升!
kiopc + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fridax + 1 + 1 热心回复!
czcmuou + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
A神 + 1 + 1 我很赞同!
amo今天学习了吗 + 1 + 1 我很赞同!
jiuyiss + 1 + 1 我很赞同!
linux69 + 1 + 1 我很赞同!
xzhtx + 1 + 1 用心讨论,共获提升!
努力加载中 + 1 + 1 谢谢@Thanks!
notifier + 1 + 1 我很赞同!
leokyer + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xiaoyin2018 + 1 + 1 热心回复!
Light紫星 + 2 + 1 用心讨论,共获提升!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
头铁又刚 + 1 热心回复!
zgy150010318 + 1 + 1 我很赞同!
我是不会改名的 + 4 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
三滑稽甲苯 + 2 + 1 用心讨论,共获提升!
sam喵喵 + 1 感谢大佬,期待大佬更多作品

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

正己 发表于 2022-7-7 21:56
大佬第一帖,加个精,期待大佬后续佳作
简猿 发表于 2022-7-7 22:11
aozo13 发表于 2022-7-7 22:10
Baiii 发表于 2022-7-7 22:28
老哥牛批啊,能帮忙看下小黑盒的那个加密吗
李杨 发表于 2022-7-7 22:28
就应该这样嘛 多出来走走
yuqic987 发表于 2022-7-7 22:36
这是大佬啊,学习下大佬的思路
zgy150010318 发表于 2022-7-7 22:47
这是大佬啊,学习下大佬的思路
此子非池中之物 发表于 2022-7-7 22:59
woaipaojie
L1ni_0i 发表于 2022-7-7 23:21
牛逼,学习一下大佬的思路
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-22 01:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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