安卓逆向分析百世來取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
測試結果,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('出庫失敗')
測試結果發現出庫並沒有成功,然后經過一番排查,發現在用戶登錄的時候不只是用戶登錄這一個接口,還有一個登錄站點的接口
那么接下來就是模擬站點登錄接口

# 登錄站點 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('登錄站點失敗')
然后測試出庫接口,發現OK,出庫成功。
End.