安卓逆向分析百世來取app接口及其實現


安卓逆向分析百世來取app接口及其實現

1.解壓縮apk文件,得到三個dex文件

 

2.反編譯出3個jar包

 

3.fiddler抓包相關的接口

以這個登錄接口為例。

登錄url為https://laiqu.800best.com/lqapi/Security/UserLogin

請求體為json格式的字符串

{
    "password":"Ps6q3ZDX4YGEI8A/Xp2FscYZ/+DPDDluMSjqiVZ1klFpcbwjZObQdrc3v7Slp/hXAc196IRa/z+Kp5CiuXHRtxlxfnq9ioKV+/1yz3VoZ5zMILDdkL3rdXu78m35sQ5aq6XOPvVeex5tL1ZBv08aDM7cdE3udkl+kgrMheRs6Ug=",
    "userName":"130****2887"  # 賬號就不公開了
}

發現密碼是加密后的,所以要找到密碼是怎么加密的,一眼看上去,能大概得出是rsa加密,然后轉base64編碼(其實是抓包里面看出來的)

 

 

 

 既然知道了是rsa加密,那就用python寫個demo來測試一下

 1 # 獲取Rsa公鑰
 2 def getRsaPublicKey():
 3     url = 'https://laiqu.800best.com/lqapi/Security/GetRsaPublicKey'
 4     try:
 5         r = requests.post(url, timeout=5)
 6         res_data = r.json()
 7     except Exception as e:
 8         res_data = {}
 9     rsaPublicKey = res_data['result']['publicKey']
10     return rsaPublicKey
11 
12 
13 def rsa_password(password, public_key):
14     key = '''-----BEGIN PUBLIC KEY-----
15     {}
16     -----END PUBLIC KEY-----
17     '''
18     rsakey = RSA.importKey(key.format(public_key))
19     cipher = Cipher_pkcsl_v1_5.new(rsakey)
20     cipher_text = base64.b64encode(cipher.encrypt(password.encode()))
21     res = cipher_text.decode()
22     return res
23 
24 
25 # 用戶登錄
26 def login(public_key, userName, password):
27     # 用戶登錄
28     url = 'https://laiqu.800best.com/lqapi/Security/UserLogin'
29     encrypt_password = rsa_password(password, public_key)
30     login_data = {
31         "password": encrypt_password,
32         "userName": userName
33     }
34     res_data = post_json_headers_verify(url, login_data)
35     if res_data['status'] != 1:
36         raise Exception('登錄出錯')
37     else:
38         jwt_token = res_data['result']['token']
39         serviceSiteCode = res_data['result']['serviceSites'][0]['serviceSiteCode']
40         return jwt_token, serviceSiteCode
View Code

測試結果,OK,登錄接口完成。

 接下來就是業務需要了,公司給的任務是獲取出庫接口,那么就用安卓模擬器模擬一下出庫操作,抓包抓接口。

 

 出庫接口分析得出,用戶認證是采用的jwt認證,請求體是billCode,里面填上單號即可。那么就可以編寫python的demo來測試了

# 出庫
def optionalPickup(billCode):
    url = 'https://splaiquapp.800best.com/lq/api/optionalPickup'
    reqData = {"billCode": billCode}
    res_dict = post_json_headers_verify(url, reqData, headers)
    print(res_dict)
    if res_dict['status'] == 1:
        print('出庫成功')
    else:
        raise Exception('出庫失敗')
View Code

測試結果發現出庫並沒有成功,然后經過一番排查,發現在用戶登錄的時候不只是用戶登錄這一個接口,還有一個登錄站點的接口

那么接下來就是模擬站點登錄接口

# 登錄站點
def LoginServiceSite(serviceSiteCode):
    url = 'https://laiqu.800best.com/lqapi/Security/LoginServiceSite'
    login_data = {"serviceProvideCode": "laiqu", "serviceSiteCode": serviceSiteCode}

    res_dict = post_json_headers_verify(url, login_data, headers)
    if res_dict['status'] == 1:
        print('登錄站點成功')
    else:
        raise Exception('登錄站點失敗')
View Code

然后測試出庫接口,發現OK,出庫成功。

 

End.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM