一.打開這個APK 隨便點擊一個鏈接 用fiddler進行手機抓包抓到如下數據包POST http://ume1.umetrip.com/MSky_Front/api/msky/p3/query?encrypt=1 HTTP/1.1Accept-Language: zh-CN,zh;q=0.8User-Agent: Mozilla/5.0 (Linux; U; Android 5.1; zh-cn; HUAWEI TAG-CL00 Build/HUAWEITAG-CL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36Content-Type: application/octet-streamContent-Length: 722Host: ume1.umetrip.comConnection: Keep-AliveAccept-Encoding: gzipCookie: JSESSIONID=559756B55C6ACF8E0F2DBD0EC9F359AB.umeIProductServer14648; X-LB=1.8.9.443301edz9ulGud4qXQ7+vCjrSeF9++NKAXmPvi3V0fDnJ7pJI9rtptd0I/yoQ/RkhuvSEd6d1f5dRHGphHT8HQ1V/h5JzW44dc7ppyZsQKFA6BDG1uagnWBpMwST9l0bJUqn0jcKNrposipJ8meJybOqajgdjyULaEA5SrpxlQDJkCCzL3rhL4jxj/QGmWgP5a7je+ox2CN/xyJcRWQo8xytVvz1aBYw+uGwb6+aLYvqAaj55MmTWhm5i3PLhRNEKaJYxSdxoWXWb/ovWZq+T+k3NmJnrdNfismnB2FL3ipvZKEavH2zNMnMYlARaicSMw5nC4viME07ZhpmnS+YDQa97zPKzXprWS/7tw8O+e4A6oYktvPXXIunnN0K4KrzK22yrUC8fEZO+law0MEfkbJBkFvMS18GAUn6I4tV9GGE8yNyT/u1N6d+3SCRvlZYCwlb/p0Ef0dXhzdYzdYFVw1+d0CbA/6k2pbeYtWvI3w+M0yRhMGsbtd1KYYjam6mTh7WVm6sUiUplZ9+P+LBZeGi12XYA/DIUVr07A6D3odLB5XHGwaFA4XoeKu3HrVRPAS1/DAV+M0dXO2ILkHS3cNBzXHSXE6XqaNl/TmnGm6Admj0Kwbp4BZ4qzuQtFaMFI8MeMQGgdYJmd7YKQ8q7HRfC6QfksxiP3oWgRR/tdmHqZvHeaEZrRMc9eYkWlb44hcbvUl這里我們發現這個包的參數是加密的 因為我要做的就是對這些參數解密 于是我腦海中出現一種思路 參數應該在鏈接附近于是打開JEB搜索encrypt=1果然搜索到了 右鍵q看源碼發現代碼是經過混淆過的 不過沒關系 這里我看到 v0 = a.f + this.d + "?encrypt=1";這樣的代碼 估計這個就是數據包的鏈接了 雙擊d進去 發現d的值為query 那這句代碼就很清楚了把鏈接賦給v0,v0就是鏈接
這里驗證了我的猜想 參數應該在鏈接附近 于是繼續跟著思路走 這里看到得到v0的值后會return 可以知道a方法的返回值就是鏈接 于是根據jeb的交叉引用 發現有兩處會調用a方法
發現這里是OkGo進行的網絡請求發包 紅色圓圈里面的a方法是我們得到的鏈接,后面的請求頭,這里要關注的是藍色圓圈里的內容,我猜想這里就是url的加密后返回的參數 點進a方法去看看 這里C2sBodyWrap類NEW了一個對象去給其參數賦值 那么我猜想v1里面放的就是url的參數了 往下看這里看到了MD5的字眼 這里猜想MD5digest應該就是參數加密的key
跟進去看看發現會調用getmessage()方法 點進去發現其在native層,調用的so是libumetriprelease.so
通過IDA動態調試分析 這個key是先連接當前日期 然后經過md5,base64加密 然后取其奇數位 所以我猜想服務器端也生成一個這樣的key,這個key值應該是和服務器的key相校驗 比對key的真實性 或者是校驗加密數據的完整性。繼續分析發現u.a方法是打印log的b.a是log的開關
那么思路來了 把b.a=false 改成b.a=true apktool反編譯改完后重打包,簽名,安裝apk打開AndroidStudio看看log輸出的都是什么內容
發現直接把url的參數吐出來了 到這里是不是就結束了呢?答案是沒有 因為我的任務是找到算法key 所以到這里并不算完成任務 繼續理清思路 既然能把參數吐出來 那我是不是也能把key給吐出來 說干就干 找key的位置繼續分析
這里g是加密前的參數v0_2是返回加密后的內容 所以加密應該在j.a方法里面 繼續跟進去這里a方法的arg1是加密前的內容 j.a()方法是key 那么好辦注入log把這個key吐出來 發現其值為:Ume2012Trip0309
既然有key了 那么程序的邏輯就是根據這個key對內容進行加密了跟進去
發現這個位置是加密算法第一個參數是要加密的內容 第二個參數是key值 下面做了一個運算對key進行了第二次加密賦值給v1 然后根據這個key用AES算法對內容進行加密得到最終的密文,然后服務器端進行base64加密,到這里就明白了,原來剛剛得到的不是真正的key啊 既然知道了v1是真正的key,加密方式是AES 那么就可以根據這個key去解密加密的內容了這樣的話 思路又來了 既然真正的key是根據上一個key去做了一個算法 那么我就可以把它的算法摳出來 自己寫一個Demo獲取真正的key值 然后根據這個key值調用AES解密算法 就得到了解密后的內容。下面是程序運行圖:
結束
對教程和解密感興趣的同學可以自己練習 如果覺得此教程對你有幫助請點擊下面的免費評分謝謝 下面是附件
鏈接: https://pan.baidu.com/s/1o78OBXK 密碼: 7mw6
|