一、前言
今天主要以餓了麼為例,講解一下APP逆向的大致流程,以及遇到問題的處理辦法。
還沒關(guān)注的朋友,關(guān)注我微信公眾號(hào)“燕幕自安”不迷路。
二、概述
APP逆向的目的是為了了解APP本身的運(yùn)行邏輯,進(jìn)行修改或進(jìn)行還原。涉及到的技術(shù)和工具,見下圖。

對(duì)于抓包我就不詳細(xì)講了,不清楚的看一下我之前的文章。
好了,下面我們干正事,講餓了麼。
三、需求
通過還原APP接口,獲取附近商家。
但因?yàn)轲I了么查看商家必須登錄,故需要先逆向登錄接口。
四、抓餓了麼的包
打開PacketCapture,選擇餓了麼,打開餓了麼APP。

這是為什么?斷網(wǎng)了?

這種情況主要是因?yàn)樽グ鸬?,APP本身做了HTTPS證書校驗(yàn),簡單的可以通過插件解決,辦法參見以前的文章。
Xposed+JustTrustMe關(guān)閉SSL證書驗(yàn)證
好了解決了抓包問題,那就能找到登陸的接口了。
通過抓包,得到登錄步驟為:
1.請(qǐng)求發(fā)送短信
2.需要圖形驗(yàn)證碼,請(qǐng)求圖形驗(yàn)證碼
3.帶驗(yàn)證碼請(qǐng)求發(fā)送短信
4.帶短信驗(yàn)證碼登錄(登陸完成拿到cookie)
5.獲取附近商家
每一步的接口如下:
1.URL:https://restapi.ele.me/eus/login/mobile_send_code
2.URL:?https://restapi.ele.me/eus/v4/captchas?captcha_str={手機(jī)號(hào)碼}
3.URL:https://restapi.ele.me/eus/login/mobile_send_code
4.URL:https://restapi.ele.me/eus/login/login_by_mobile
5.URL:https://restapi.ele.me/shopping/v3/restaurants?extras[]=identification&extras[]=coupon&latitude=32.29290046542883&longitude=110.04603732377291&city_id=3&rank_id=b1969c73a19b4dc68b31628ea85d8eaf&network_operator=&network=WIFI&order_by=5&extra_filters=home&os=Android%2F6.0.1&deivce=Nexus%206P&weather_code=PARTLY_CLOUDY_DAY&offset=0&limit=20
直接看參考答案的感覺怎么樣?

五、參數(shù)分析
對(duì)于抓包的相關(guān)參數(shù)(自己看報(bào)文就能知道,我沒有寫header參數(shù)和url參數(shù)),中間很多是我們一眼就能看出來的比如時(shí)間戳、機(jī)型、坐標(biāo)、固定值等,需要逆向的主要有以下幾個(gè)。
x-eleme-requestid、x-deviceinfo、deadpool相關(guān)三個(gè)參數(shù)

六、逆向分析
參數(shù)x-eleme-requestid
在jadx中打開餓了麼APP,搜索關(guān)鍵字x-eleme-requestid

看到四個(gè),不多。
按道理來說,應(yīng)該先看第四個(gè),但是后來并沒有找到a的生成位置。好我們看一下二、三。(OS:“你為啥不看一”)

看到a是個(gè)static變量,那就得看一下誰調(diào)用他了,右鍵find usage。

會(huì)心一笑。手到擒來。解釋一下。

點(diǎn)進(jìn)去看一下。

我個(gè)憨憨?。?!

好了,不要在意這些細(xì)節(jié)。我們點(diǎn)進(jìn)去這個(gè)a()看看。

清清楚楚,國際通用的算法UUID去掉短杠后加上豎杠再加時(shí)間戳。
參數(shù)x-deviceinfo
打眼一看,這是啥,base64啊!對(duì)x-deviceinfo進(jìn)行base64解密,可得到
均是設(shè)備基本信息,按照格式生成即可,注意要和外部其他設(shè)備基本信息保持一致。
deadpool相關(guān)三個(gè)參數(shù)
一共三個(gè)參數(shù),分別為:

搜索deadpoolcontent。

又是hashmap.put,為什么我們要對(duì)他敏感,因?yàn)樗臀覀兊哪繕?biāo)關(guān)鍵字呆在一起的時(shí)候,很可能就是給header里構(gòu)造參數(shù)的啊。我們點(diǎn)開第二個(gè)看一眼。

繼續(xù)找這個(gè)sneer函數(shù)。(我總覺得他這個(gè)函數(shù)叫這個(gè)名字是故意鄙視我的。)


好了,在libuiseris.so里面,這就麻煩了,要還原這個(gè)算法有三種辦法。
硬剛。逆向so。我后來看了下,so有反調(diào)試,so里面又調(diào)了java層的函數(shù),還原比較麻煩一些。
利用。hook這個(gè)sneer函數(shù),找到他的方法地址,在你的代碼需要的時(shí)候,發(fā)請(qǐng)求到手機(jī)里,手機(jī)進(jìn)行調(diào)用執(zhí)行,計(jì)算完以后返回給外部。
虛擬。虛擬環(huán)境執(zhí)行so中的sneer方法,可參見github上的Unicorn這個(gè)項(xiàng)目。
我用的是第二個(gè)辦法,在手機(jī)里面起了HTTP服務(wù),接受請(qǐng)求計(jì)算后返回給外部。
但是!
FPX和G2的比賽要開了,今天不繼續(xù)寫了,下次再寫個(gè)續(xù),講一下hook調(diào)用這個(gè)事兒吧。
FPX加油。


寫在最后
最近有人抄襲我的文章在知乎、吾愛上發(fā),說是自己原創(chuàng)?就是這個(gè)垃圾人。

連個(gè)人簡介都是抄我的!模仿我的人還模仿我的面???現(xiàn)在還有臉繼續(xù)關(guān)注我???還想繼續(xù)抄???要點(diǎn)*臉吧。


暖心的是,吾愛上的盆友看出來了,謝謝各位了!

以上。歡迎閱讀轉(zhuǎn)發(fā)~
想要轉(zhuǎn)載的朋友請(qǐng)告知我之后轉(zhuǎn)載,并注明原帖來源。
如有問題,請(qǐng)關(guān)注公眾號(hào)回復(fù)【作者】獲取我的聯(lián)系方式。
想了解更多技術(shù)分享,請(qǐng)長按識(shí)別下方二維碼關(guān)注我吧。
