2020年 IOS 逆向 反編譯 注入修改游戲或APP的調(diào)用參數(shù)新手系列教程——使用theos tweak 注入hook修改游戲執(zhí)行代碼上傳動態(tài)頭像

開篇

太懶這篇其實文章很早就該寫的了读处,一方面記錄一下自己的代碼另一方面分享谭贪。

需求&最終效果

游戲本身不支持上傳gif動態(tài)圖片咙冗,上傳前圖片會客戶端會做截圖處理粟按,通過注入修改代碼,成功上傳動圖遏餐。


image

環(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é)構,有哪些控制器類和方法大致看看糯耍。


image
image

image

其實也可以不用看層級結(jié)構扔字,我只要讓圖片上傳觸發(fā)抓包就行囊嘉。
打開FLEXible的menu再選擇Network History 温技,點擊一下Settings把抓包功能開啟。
然后返回游戲界面隨便上傳一張圖片扭粱,再打開Network查看抓包列表舵鳞。


image

可以看到兩個比較可疑的POST請求就是最前面兩個:upload.qiniup.com和update_user_info
打開詳細查看
image

圖片看不全,我還是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

image

右鍵進入誰調(diào)用這個地址侍瑟,跳轉(zhuǎn)切換成偽代碼一看。
image

基本是這個方法了userApiUpdateUserInfoWithDict。
意思是通過字典變量來修改用戶信息涨颜。headimgurl就是其中一個字典鍵费韭,只要我們修改headimgurl的值就達到換圖片地址的目的。當然只是猜想庭瑰。

編寫tweak

驗證猜想星持。
我是這樣做的,tweak寫hook這個方法弹灭,打印一下這個方法的實參钉汗,看看是什么內(nèi)容。
可以先用class-dump把頭文件導出來看看參數(shù)類型是啥鲤屡,這里省略损痰。
寫tweak hook。mac 執(zhí)行命令nic.pl來新建個tweak工程酒来。


image

choose a template 填11卢未。
MobileSubstrate Bundle filter 要填寫對應APP的bundleID,可以通過手機連接電腦查看電腦控制臺來觀察到相關關鍵字堰汉。
其他選項回車就行辽社。
最終生成目錄:


image

修改一下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)圖缸废,我猜是本地緩存,重啟游戲锥腻,喲嚯别威,頭像刷新了俄周,變成我們要的動圖:


image

結(jié)束

此教程僅做學習交流和知識記錄方便以后查看使用,如果涉及到利益相關的請告知本人進行刪帖處理届巩。

本人想通過這些博客記錄自己這兩周內(nèi)折騰的過程以及分享最后成功的成果。另外想結(jié)交志同道合對IT行業(yè)感興趣的盆友份乒,互相交流學習恕汇。可以通過博客聯(lián)系我或加QQ號:1321691245
只交朋友不接受接單之類的騷擾或辖。

博文主索引目錄入口

我會把這系列的文章更新到這個入口里面拇勃,分享我的心得,大家互相學習孝凌。
2020年 IOS 逆向 反編譯 注入修改游戲或APP的調(diào)用參數(shù)新手系列教程主目錄入口

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末方咆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蟀架,更是在濱河造成了極大的恐慌瓣赂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件片拍,死亡現(xiàn)場離奇詭異煌集,居然都是意外死亡,警方通過查閱死者的電腦和手機捌省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門苫纤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事卷拘『胺希” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵栗弟,是天一觀的道長污筷。 經(jīng)常有香客問我,道長乍赫,這世上最難降的妖魔是什么瓣蛀? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮雷厂,結(jié)果婚禮上惋增,老公的妹妹穿的比我還像新娘。我一直安慰自己改鲫,他們只是感情好器腋,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钩杰,像睡著了一般纫塌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讲弄,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天措左,我揣著相機與錄音,去河邊找鬼避除。 笑死怎披,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的瓶摆。 我是一名探鬼主播凉逛,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼群井!你這毒婦竟也來了状飞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤书斜,失蹤者是張志新(化名)和其女友劉穎诬辈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荐吉,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡焙糟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了样屠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穿撮。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡缺脉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悦穿,到底是詐尸還是另有隱情攻礼,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布咧党,位于F島的核電站秘蛔,受9級特大地震影響陨亡,放射性物質(zhì)發(fā)生泄漏傍衡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一负蠕、第九天 我趴在偏房一處隱蔽的房頂上張望蛙埂。 院中可真熱鬧,春花似錦遮糖、人聲如沸绣的。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屡江。三九已至,卻和暖如春赛不,著一層夾襖步出監(jiān)牢的瞬間惩嘉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工踢故, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留文黎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓殿较,卻偏偏與公主長得像耸峭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淋纲,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348