開篇
太懶這篇其實文章很早就該寫的了读处,一方面記錄一下自己的代碼另一方面分享谭贪。
需求&最終效果
游戲本身不支持上傳gif動態(tài)圖片咙冗,上傳前圖片會客戶端會做截圖處理粟按,通過注入修改代碼,成功上傳動圖遏餐。
環(huán)境要求與即將使用的工具
之前我的MacOSX版本是10.10伦腐,只能安裝xcode7以下的版本,xcode7以下的版本沒有真機調(diào)試功能失都,于是升級了版本到MacOSX Catalina 10.15.4也安裝了最新版xcode柏蘑,但是這個版本太卡而且有些問題颖系,很多軟件兼容不了了,想以后降級辩越。
環(huán)境 | 版本 |
---|---|
操作系統(tǒng) | MacOSX Catalina 10.15.4 版本太新了不太好用很多工具用不了嘁扼,我后面打算降級 |
手機系統(tǒng) | Iphone7 IOS11 需要越獄 |
mac上面的 theos | 最新版 |
手機助手傳輸工具或SSH連接操作 | - |
xcode | 11.5 |
手機端FLEXible(具備瀏覽appUI結(jié)構和APP抓包功能);或者用charles來抓包 | - |
mac 上面的 hopper disassembler反編譯工具 | - |
工具介紹
theos是用來編寫tweak代碼并且打包成deb包的工具黔攒。
FLEXible是手機端調(diào)試神器趁啸,可以查看APP的UI層級和代碼頭文件的方法和變量,更有抓包的功能督惰!
ios11的ssh本人用不了不傅,從cydia安裝了openssh,但是用命令行執(zhí)行ssh報無法打開二進制文件的英文錯誤赏胚,不知道為何访娶,誰能在ios11運行ssh并且電腦連接手機ssh的麻煩告知我一下謝謝。
實現(xiàn)過程
思路
思路a:首先我要找到上傳圖片的POST請求觉阅,然后把上傳圖片參數(shù)的圖片url地址改掉崖疤。
思路a行不通,因為上傳的時候游戲客戶端對全部參數(shù)通過加密算法計算出了一個sign的參數(shù)提供給后臺,如果修改了其中任意參數(shù)會導致后臺驗證簽名失敗典勇。
思路b:在本地上傳圖片裁剪窗口點擊保存圖片的的時候把本地圖片路徑改成我指定的路徑劫哼。
思路b可能可行但是我想還有更簡單的做法。
思路c:在上傳前對組裝的參數(shù)數(shù)組的代碼注入割笙,強行改變圖片參數(shù)的url权烧。也不會影響sign的生成正確邏輯。
思路d:反編譯看匯編代碼逆向sign參數(shù)的加密過程伤溉。這個難度比較大般码,耗時,但是如果把sign的生成過程解密了基本所有請求就都可以通過中間人攻擊來偽造數(shù)據(jù)乱顾。
思路c會簡單一點板祝。用思路c的做法來做
理清圖片上傳請求過程
可以先通過FLEXible來看看目錄結(jié)構,有哪些控制器類和方法大致看看糯耍。
其實也可以不用看層級結(jié)構扔字,我只要讓圖片上傳觸發(fā)抓包就行囊嘉。
打開FLEXible的menu再選擇Network History 温技,點擊一下Settings把抓包功能開啟。
然后返回游戲界面隨便上傳一張圖片扭粱,再打開Network查看抓包列表舵鳞。
可以看到兩個比較可疑的POST請求就是最前面兩個:upload.qiniup.com和update_user_info
打開詳細查看
圖片看不全,我還是copy成curl貼出來吧琢蛤。
如果不知道curl的同學可以自行去其他地方了解一下蜓堕。
curl -v -X POST 'https://upload.qiniup.com' -H 'User-Agent: QiniuObject-C/7.3.2 (iPhone; iOS 11.2.6; ABE768DC-FA02-4CAB-9DF8-2720B0E7C890; GcvQmcsBpX-WqRIW_YTKKXua3PbSXh831RS_u2NW)' -H 'Content-Type: multipart/form-data; boundary=werghnvt54wef654rjuhgb56trtg34tweuyrgf' -H 'Content-Length: 27824' -H 'Cookie:' [TOO MUCH DATA TO INCLUDE]
這一個請求是把圖片流提交上去抛虏,當然這里的boundary無法寫全,F(xiàn)LEXible工具無法顯示圖片流數(shù)據(jù)套才。Cookie數(shù)據(jù)也沒補全迂猴。cookie里面是用戶的sid等之類的信息。
其實這個請求還依賴列表第三的那個請求的token,需要先獲取token再請求上傳背伴,后面我會寫shell來體現(xiàn)沸毁。
成功上傳的話最終返回的是圖片的key和hash值,這一步僅僅只是把圖片上傳到了圖床傻寂,還沒有鏈接在游戲頭像上息尺。
返回:
{
"key" : "sa/fc6861905d20200613100399.jpg",
"hash" : "FifEYajsNl7aqU88gsOYSyewk199"
}
這個key就是下面請求用到的headimgurl參數(shù)。
另外的一個POST請求:
下面我對于敏感參數(shù)用“某某”代替疾掰。
curl -v -X POST 'https://某某.com/user_api/update_user_info' -H 'market: apple' -H 'Content-Type: application/x-www-form-urlencoded' -H '某某Version: 4.3.31' -H '某某UserID: 某某-5631-4446-某某-09da14d65cb9' -H '某某Product: 某某' -H 'User-Agent: 某某/4.1.31 (iPhone; iOS 11.2.6; Scale/3.00)' -H 'Accept-Language: zh-Hans-CN;q=1' -H 'nonce: 1592013691' -H 'Cookie:' -d 'build_tag=4531.0&device_id=某某-A6FA-4A74-8CA3-某某-1779-0000008790C7E566&device_name=iPhone%207%20Plus&device_system_platform=iPhone9%2C2&headimgurl=https某某com/sa/fc6861905d20200613100399.jpg&idfa=0D79361D-C19F-4A77-84Bd-D725AA96B4D8&market=apple&os_version=11.2&platform=1&sid=某某&某某_sign=%2B70m/3s/1314dgNQ641mE9YmN6c%3D&uid=某某&version=4.1.31'
這個POST請求就是修改用戶頭像的請求搂誉,最關鍵的參數(shù)就是其中的headimgurl,前面提到如果直接通過修改url請求參數(shù)變更headimgurl這個地址的話是行不通的静檬,因為某某_sign這個參數(shù)是通過所有請求參數(shù)計算出來的炭懊,除非知道算法計算修改后的sign,否則后臺會提示簽名失敗拂檩。
shell實現(xiàn)上傳自己的gif動態(tài)圖片到圖床
我要注入的代碼其實就是update_user_info這個請求拼裝的方法凛虽,拼裝headimgurl參數(shù)的時候修改成我要的圖片地址就ok了。
那么我要先自定義圖片上傳到圖床广恢,不是用游戲上傳圖片入口凯旋,而是用我自己寫的shell腳本來模擬post提交圖片到圖床!最終獲取上傳圖片后的url地址钉迷。
#! bin/shell#! bin/shell
# 內(nèi)容至非,查找的關鍵詞
getContentByKeyword() {
content=$1
keyword=$2
echo $content | awk -F \"$keyword\"\:\" '{ print $2 }' | awk -F \" '{print $1}'
}
getHeaderByKeyword() {
content=$1
keyword=$2
echo $content | grep $keyword | awk -F $keyword\:\ '{ print $2 }' | awk -F \ '{print $1}'
}
content=`curl -v -X POST 'https://某某.com/config/get_upload_token' -H 'market: apple' -H 'Content-Type: application/x-www-form-urlencoded' -H '某某Version: 4.1.26' -H '某某UserID: 某某' -H '某某Product: 某某' -H 'User-Agent: 某某/4.3.26 (iPhone; iOS 11.2.6; Scale/3.00)' -H 'Accept-Language: zh-Hans-CN;q=1' -H 'nonce: 1589783647' -H 'Cookie:' -d 'bucket=某某&build_tag=某某.0&device_id=某某-A4FA-4A64-某某-某某-1779-某某&device_name=iPhone%207%20Plus&device_system_platform=iPhone9%2C2&idfa=某某-C18F-4A77-84BC-某某&market=apple&os_version=11.2&platform=1&sid=某某&某某_sign=8HX%某某%3D&type=2&uid=某某-5495-439f-某某-某某&version=4.1.26'`
token=`getContentByKeyword "$content" "token"`
echo $token >> test2.txt
uploadResponse=`curl -v -i https://upload.qbox.me -F "token=$token" -H 'User-Agent: QiniuObject-C/7.1.0 (iPhone; iOS 11.2.6; 某某-FA02-4CAB-某某-某某)' -H 'Content-Type: multipart/form-data' -H 'Accept-Language: zh-cn' -H 'Accept-Encoding: br, gzip, deflate' -H 'Cookie:' -H 'Accept: */*' -F "file=@/Users/mac/Desktop/test4.gif"`
nonce=`getHeaderByKeyword "$uploadResponse" "EagleId"`
picPath=`getContentByKeyword "$uploadResponse" "key"`
echo $nonce >> test2.txt
echo $picPath >> test2.txt
nonce=${nonce:8:10}
timeStamp=`date +%s`
nonce=timeStamp
echo $nonce >> test2.txt
第一步獲取token,通過用戶uid sid等參數(shù)請求get_upload_token得到糠聪。
第二步請求upload.qbox.me把本地gif動態(tài)圖片傳上去
例如上面代碼中 -F "file=@/Users/mac/Desktop/test4.gif"
上傳成功得到類似的數(shù)據(jù)荒椭,key就是headimgurl要拼裝的圖片地址。
{
"key" : "sa/fc6861905d20200613100399.gif",
"hash" : "FifEYajsNl7aqU88gsOYSyewk199"
}
反編譯分析匯編代碼找出注入的方法(函數(shù))
先砸殼舰蟆,本文略過趣惠,詳情查看我文章:用bfinject脫殼、注入自己的動態(tài)framework身害、cycript的使用
的到Mach-O文件后味悄,用 hopper disassembler打開,查找關鍵詞塌鸯。
例如我查找修改頭像的api關鍵詞:update_user_info
右鍵進入誰調(diào)用這個地址侍瑟,跳轉(zhuǎn)切換成偽代碼一看。
基本是這個方法了userApiUpdateUserInfoWithDict。
意思是通過字典變量來修改用戶信息涨颜。headimgurl就是其中一個字典鍵费韭,只要我們修改headimgurl的值就達到換圖片地址的目的。當然只是猜想庭瑰。
編寫tweak
驗證猜想星持。
我是這樣做的,tweak寫hook這個方法弹灭,打印一下這個方法的實參钉汗,看看是什么內(nèi)容。
可以先用class-dump把頭文件導出來看看參數(shù)類型是啥鲤屡,這里省略损痰。
寫tweak hook。mac 執(zhí)行命令nic.pl來新建個tweak工程酒来。
choose a template 填11卢未。
MobileSubstrate Bundle filter 要填寫對應APP的bundleID,可以通過手機連接電腦查看電腦控制臺來觀察到相關關鍵字堰汉。
其他選項回車就行辽社。
最終生成目錄:
修改一下Makefile,在include $(THEOS... 上面新增兩行代碼
ARCHS = armv7 arm64
TARGET = iphone:latest:8.0
指定arm版本和編譯手機的ios版本
打開Tweak.xm寫代碼:
%hook SnakeAPI
+ (void)userApiUpdateUserInfoWithDict:(id)arg1 success:(id)arg2 failure:(id)arg3 {
NSLog(@"打印翘鸭。滴铅。。%@", arg1);
%log;
%orig;
}
%end
保存就乓,mac執(zhí)行make package最終生成一個deb包汉匙。把deb通過ssh或者手機助手工具拷貝到手機安裝,如果手機有Filza文件瀏覽器生蚁,可以通過Filza打開deb安裝噩翠;如果沒有只能通過terminal命令行工具安裝,命令如下:
dpkg -i 包名.deb
手機連接mac邦投,打開mac控制臺軟件伤锚。
手機打開游戲,上傳一下頭像志衣,觀察mac控制臺是否有觸發(fā)到日志屯援,日志要自己篩選。最終我看到了日志有輸出念脯。
內(nèi)容類似:
[headimgurl] = 'sa/234234234234234.jpg'
證明arg1是一個字典狞洋。
只要修改arg1的headimgurl就能實現(xiàn)圖片自定義。
因為arg1是一個不可變字典和二,直接修改key對應值是行不通的徘铝,所以我簡單粗暴耳胎,銷毀arg1從新定義一個惯吕。
最終tweak代碼如下:
%hook SnakeAPI
+ (void)userApiUpdateUserInfoWithDict:(id)arg1 success:(id)arg2 failure:(id)arg3 {
NSLog(@"打印前惕它。。废登。%@", arg1);
arg1 =nil;
arg1 = [NSDictionary dictionaryWithObjectsAndKeys:
@"https://某某/sa/2345345345345345.jpg", @"headimgurl",nil];
NSLog(@"打印后淹魄。。堡距。%@", arg1);
%log;
%orig;
}
%end
圖片地址我寫死了甲锡,就是我用shell上傳圖片返回的地址,是一張動圖羽戒。
再次編譯tweak代碼生成deb安裝到手機缤沦。
手機去上傳一下頭像。
上傳成功易稠,但是頭像并不是我們的動態(tài)圖缸废,我猜是本地緩存,重啟游戲锥腻,喲嚯别威,頭像刷新了俄周,變成我們要的動圖:
結(jié)束
此教程僅做學習交流和知識記錄方便以后查看使用,如果涉及到利益相關的請告知本人進行刪帖處理届巩。
本人想通過這些博客記錄自己這兩周內(nèi)折騰的過程以及分享最后成功的成果。另外想結(jié)交志同道合對IT行業(yè)感興趣的盆友份乒,互相交流學習恕汇。可以通過博客聯(lián)系我或加QQ號:1321691245
只交朋友不接受接單之類的騷擾或辖。
博文主索引目錄入口
我會把這系列的文章更新到這個入口里面拇勃,分享我的心得,大家互相學習孝凌。
2020年 IOS 逆向 反編譯 注入修改游戲或APP的調(diào)用參數(shù)新手系列教程主目錄入口