0. 起因
因工作或生活上的某些原因不得不使用某應(yīng)用,暫且記為A應(yīng)用把肌毅】曜可 A 應(yīng)用設(shè)計得實在不人性化,一個操作通常需要點擊若干次屏幕悬而,點擊一次還要 lodaing 呜舒,程序員說:不能忍。
于是開始著手改善軟件體驗
1. 初步計劃
初步分析 A 應(yīng)用實際上是一個 HTTP 客戶端笨奠,前端后臺之間完全通過 HTTP 協(xié)議傳輸數(shù)據(jù)袭蝗。可使用 Fiddler 工具抓取數(shù)據(jù)包分析般婆。
分析發(fā)現(xiàn)之前所有那些繁雜的操作(例如簽到打卡(虛構(gòu)))到腥,其實只需要發(fā)送一個 HTTP 請求。于是蔚袍,完全可以使用一段代碼,偽裝成 A 應(yīng)用向后端發(fā)請求啤咽,完成相應(yīng)的操作晋辆。甚至可以將應(yīng)用內(nèi)常用的操作全部提取出來,這樣在上班的時候突然想起還沒簽到打卡宇整,直接跑一段程序就 OK瓶佳,甚至都不需要打開手機。簡直美滋滋鳞青,我這樣想著涩哟。
以簽到打卡操作為例
實際應(yīng)用中并不存在簽到打卡操作
2. 分析請求
使用 Fiddler 抓取請求如下:
POST http://api.*****.com/v1/****/****/what
// 請求頭
headers = {
"Accept-Encoding": "gzip",
"Accept-Language": "zh_CN",
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.0; MI 5 MIUI/8.1.25)",
"Content-Type": "application/x-www-form-urlencoded",
"Welove-UA": "[Device:MI5][OSV:7.0][CV:Android4.0.2][WWAN:0][zh_CN][platform:tencent][WSP:2]"
}
// 請求體(表單)
form = {
"access_token": "562********358-2****************6",
"app_key": "a*************4",
"timestamp":"1522393966",
"sig":"rTRa2PTiGiwkNVQUnSB0n2l6KrA=",
}
使用 Postman 原樣發(fā)送請求,操作成功盼玄。但一旦更改請求的參數(shù),服務(wù)端便會返回:
{
"result": 160,
"error_msg": "sig簽名錯誤"
}
操作失斍蹦濉埃儿!
回頭看一眼請求體中的sig
字段,這個值rTRa2PTiGiwkNVQUnSB0n2l6KrA=
一看就是一個用于校驗的字符串融涣,A應(yīng)用在構(gòu)造完請之后童番,根據(jù)URL和請求參數(shù)生成一個sig
字段精钮,并附加到請求的參數(shù)里面,后臺接收到請求之后剃斧,通過sig
字段來校驗請求的合法性轨香。這個設(shè)計一定程度上阻礙了我們偽裝成A應(yīng)用發(fā)請求。
所以我們修改了請求體中的數(shù)據(jù)之后幼东,必然導致后臺校驗sig
失敗臂容。
如何能愉快的玩耍?關(guān)鍵在于窺探A應(yīng)用如何生成sig
字段根蟹。
3. Hack It
思路:
(1)反編譯應(yīng)用脓杉,靜態(tài)分析代碼,找出生成sig的規(guī)則简逮;
(2)若靜態(tài)分析又困難球散,嘗試動態(tài)調(diào)試(運行時打印日志等)。
3.1 反編譯得到 smali
(1)下載最新版本的 Apktook
(2)獲取A應(yīng)用安裝包散庶,命名為t.apk
(3)使用java -jar apktool.jar d t.apk
反編譯應(yīng)用蕉堰,得到文件夾t
暴备,里面便是A應(yīng)用的全部
文件夾t
的目錄結(jié)構(gòu)如下:
其中
smali
開頭的文件夾里面莽龟,是反編譯之后的smali代碼(類似匯編代碼)。