一.打開這個(gè)APK 隨便點(diǎn)擊一個(gè)鏈接 用fiddler進(jìn)行手機(jī)抓包抓到如下數(shù)據(jù)包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這里我們發(fā)現(xiàn)這個(gè)包的參數(shù)是加密的 因?yàn)槲乙龅木褪菍@些參數(shù)解密 于是我腦海中出現(xiàn)一種思路 參數(shù)應(yīng)該在鏈接附近于是打開JEB搜索encrypt=1果然搜索到了 右鍵q看源碼發(fā)現(xiàn)代碼是經(jīng)過混淆過的 不過沒關(guān)系 這里我看到 v0 = a.f + this.d + "?encrypt=1";這樣的代碼 估計(jì)這個(gè)就是數(shù)據(jù)包的鏈接了 雙擊d進(jìn)去 發(fā)現(xiàn)d的值為query 那這句代碼就很清楚了把鏈接賦給v0,v0就是鏈接
這里驗(yàn)證了我的猜想 參數(shù)應(yīng)該在鏈接附近 于是繼續(xù)跟著思路走 這里看到得到v0的值后會return 可以知道a方法的返回值就是鏈接 于是根據(jù)jeb的交叉引用 發(fā)現(xiàn)有兩處會調(diào)用a方法
發(fā)現(xiàn)這里是OkGo進(jìn)行的網(wǎng)絡(luò)請求發(fā)包 紅色圓圈里面的a方法是我們得到的鏈接,后面的請求頭,這里要關(guān)注的是藍(lán)色圓圈里的內(nèi)容,我猜想這里就是url的加密后返回的參數(shù) 點(diǎn)進(jìn)a方法去看看 這里C2sBodyWrap類NEW了一個(gè)對象去給其參數(shù)賦值 那么我猜想v1里面放的就是url的參數(shù)了 往下看這里看到了MD5的字眼 這里猜想MD5digest應(yīng)該就是參數(shù)加密的key
跟進(jìn)去看看發(fā)現(xiàn)會調(diào)用getmessage()方法 點(diǎn)進(jìn)去發(fā)現(xiàn)其在native層,調(diào)用的so是libumetriprelease.so
通過IDA動(dòng)態(tài)調(diào)試分析 這個(gè)key是先連接當(dāng)前日期 然后經(jīng)過md5,base64加密 然后取其奇數(shù)位 所以我猜想服務(wù)器端也生成一個(gè)這樣的key,這個(gè)key值應(yīng)該是和服務(wù)器的key相校驗(yàn) 比對key的真實(shí)性 或者是校驗(yàn)加密數(shù)據(jù)的完整性。繼續(xù)分析發(fā)現(xiàn)u.a方法是打印log的b.a是log的開關(guān)
那么思路來了 把b.a=false 改成b.a=true apktool反編譯改完后重打包,簽名,安裝apk打開AndroidStudio看看log輸出的都是什么內(nèi)容
發(fā)現(xiàn)直接把url的參數(shù)吐出來了 到這里是不是就結(jié)束了呢?答案是沒有 因?yàn)槲业娜蝿?wù)是找到算法key 所以到這里并不算完成任務(wù) 繼續(xù)理清思路 既然能把參數(shù)吐出來 那我是不是也能把key給吐出來 說干就干 找key的位置繼續(xù)分析
這里g是加密前的參數(shù)v0_2是返回加密后的內(nèi)容 所以加密應(yīng)該在j.a方法里面 繼續(xù)跟進(jìn)去這里a方法的arg1是加密前的內(nèi)容 j.a()方法是key 那么好辦注入log把這個(gè)key吐出來 發(fā)現(xiàn)其值為:Ume2012Trip0309
既然有key了 那么程序的邏輯就是根據(jù)這個(gè)key對內(nèi)容進(jìn)行加密了跟進(jìn)去
發(fā)現(xiàn)這個(gè)位置是加密算法第一個(gè)參數(shù)是要加密的內(nèi)容 第二個(gè)參數(shù)是key值 下面做了一個(gè)運(yùn)算對key進(jìn)行了第二次加密賦值給v1 然后根據(jù)這個(gè)key用AES算法對內(nèi)容進(jìn)行加密得到最終的密文,然后服務(wù)器端進(jìn)行base64加密,到這里就明白了,原來剛剛得到的不是真正的key啊 既然知道了v1是真正的key,加密方式是AES 那么就可以根據(jù)這個(gè)key去解密加密的內(nèi)容了這樣的話 思路又來了 既然真正的key是根據(jù)上一個(gè)key去做了一個(gè)算法 那么我就可以把它的算法摳出來 自己寫一個(gè)Demo獲取真正的key值 然后根據(jù)這個(gè)key值調(diào)用AES解密算法 就得到了解密后的內(nèi)容。下面是程序運(yùn)行圖:
結(jié)束
對教程和解密感興趣的同學(xué)可以自己練習(xí) 如果覺得此教程對你有幫助請點(diǎn)擊下面的免費(fèi)評分謝謝 下面是附件
鏈接: https://pan.baidu.com/s/1o78OBXK 密碼: 7mw6
|