日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
旅行青蛙Unity游戲逆向修改--iOS篇

之前寫了一篇分析Android C#腳本的文章,主要也是為了給這篇文章做鋪墊吧,因?yàn)樵趇OS現(xiàn)在都是IL2CPP模式,C#腳本已經(jīng)被轉(zhuǎn)成了c代碼。所以要單獨(dú)分析iOS的話難度會(huì)大很多,如果從Android的C#腳本入手的話,因?yàn)閕OS和Android腳本都是一樣的話,可以從Android分析的函數(shù)名來(lái)對(duì)應(yīng)iOS的c函數(shù)然后進(jìn)行hook修改。

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出興隆免費(fèi)做網(wǎng)站回饋大家。

提取ipa

首先從越獄設(shè)備上面提取旅行青蛙的ipa包,使用 frida-ios-dump 一鍵提取即可。由于是日文名字,先通過(guò) ./dump.py -l 把名字列出來(lái),然后復(fù)制名字或者通過(guò)bundle id去dump就可以了。

IL2CPP符號(hào)還原

由于使用IL2CPP選項(xiàng)編譯unity游戲,會(huì)生成cpp的代碼,直接使用IDA看是看不到函數(shù)和函數(shù)名的,而且游戲中使用的字符串都被保存在global-metadata.dat的資源文件里。首先要通過(guò)提取global-metadata.dat文件里面的字符串對(duì)對(duì)應(yīng)的c函數(shù)進(jìn)行符號(hào)還原。具體也有現(xiàn)成的文章: 還原使用IL2CPP編譯的unity游戲的symbol ,github上面也有線程的項(xiàng)目也做這件事情 Il2CppDumper 。下載release的工具,運(yùn)行Il2CppDumper.exe并依次選擇il2cpp的可執(zhí)行文件和global-metadata.dat文件,然后選擇Auto(Plus)模式,將生成dump.cs文件和script.py腳本。使用IDA打開可執(zhí)行文件然后使用script.py腳本即可還原符號(hào)。

Makingmethodname...MakemethodnamedoneSettingString...SetstringdoneMakingfunction...Makefunctiondone, please waitforIDAtocomplete the analysisScriptfinish !

根據(jù)函數(shù)hook代碼

還原之后就可以根據(jù)之前分析到的函數(shù)名來(lái)hook對(duì)應(yīng)的代碼了,首先是三葉草的數(shù)目通過(guò) SuperGameMaster.CloverPointStock() 獲取的,在IDA搜索 CloverPointStock如下:

接著就可以直接hook這個(gè)函數(shù)了,由于要inline hook目前是在越獄機(jī)器上面,后面會(huì)講到非越獄機(jī)器hook的方案。使用 MonkeyDev 新建一個(gè) Logos Tweak 項(xiàng)目,清空.xm 的內(nèi)容并寫入如下內(nèi)容:

 
 
 
  1. #import#import#importint(*old_clover_point_stock)(void);intnew_clover_point_stock(void){return9999;}%ctor{ @autoreleasepool {unsignedlongclover_point_stock = _dyld_get_image_vmaddr_slide(0) +0x100093A2C; MSHookFunction((void*)clover_point_stock, (void*)&new_clover_point_stock, (void**)&old_clover_point_stock); }} 

然后在build settings里面設(shè)置端口和設(shè)備密碼然后command + b安裝就能看到效果了,其它函數(shù)的hook也是一樣的:

 
 
 
  1. #import#import#importint(*old_clover_point_stock)(void);intnew_clover_point_stock(void){return9999;}int(*old_ticket_stock)(void);intnew_ticket_stock(void){return9999;}void(*old_lotterycheck)(unsignedlongobj);voidnew_lotterycheck(unsignedlongobj){    *(int*)(obj +80) = rand() %4+1;}id(*old_new_clover_object)(intindex,idcloverData,idcloversObj,boolfourLeafFlag);idnew_new_clover_object(intindex,idcloverData,idcloversObj,boolfourLeafFlag){    fourLeafFlag =true;returnold_new_clover_object(index,cloverData,cloversObj,fourLeafFlag);}%ctor{@autoreleasepool{unsignedlongclover_point_stock = _dyld_get_image_vmaddr_slide(0) +0x100093A2C;        MSHookFunction((void*)clover_point_stock, (void*)&new_clover_point_stock, (void**)&old_clover_point_stock);unsignedlongticket_stock = _dyld_get_image_vmaddr_slide(0) +0x100093AA4;        MSHookFunction((void*)ticket_stock, (void*)&new_ticket_stock, (void**)&old_ticket_stock);unsignedlonglotterycheck = _dyld_get_image_vmaddr_slide(0) +0x100086CF4;        MSHookFunction((void*)lotterycheck, (void*)&new_lotterycheck, (void**)&old_lotterycheck);unsignedlongnew_clover_object = _dyld_get_image_vmaddr_slide(0) +0x100037100;        MSHookFunction((void*)new_clover_object, (void*)&new_new_clover_object, (void**)&old_new_clover_object);    }} 

這里有一個(gè)函數(shù) RaffelPanel$$LotteryCheck 要修改里面的result的值,就要根據(jù)匯編或者偽代碼來(lái)看result的賦值是在什么位置了,該函數(shù)通過(guò)F5獲得的偽代碼如下:

 
 
 
  1. __int64 __fastcall RaffelPanel__LotteryCheck(__int64 a1){ 
  2.   __int64 v1; // x19 
  3.   __int64 v2; // x0 
  4.   __int64 v3; // x0 
  5.   int v4; // w20 
  6.   int v5; // w23 
  7.   signed int v6; // w24 
  8.   __int64 v7; // x0 
  9.   __int64 result; // x0 
  10.   v1 = a1; 
  11.   if ( !(byte_10137EDBB & 1) ) 
  12.   { 
  13.     sub_100DEAD34(6810LL); 
  14.     byte_10137EDBB = 1; 
  15.   }v2 = qword_101439198;if( *(_BYTE *)(qword_101439198 +266) &1&& !*(_DWORD *)(qword_101439198 +188) ){ 
  16.     sub_100DFF71C(); 
  17.     v2 = qword_101439198; 
  18.   }if( !*(_QWORD *)(*(_QWORD *)(v2 +160) +192LL) )LABEL_17:    sub_100DE28B4();  v3 = sub_1000FB954();  v4 = Random__Range_71094(0LL,0LL, v3,0LL);  v5 =0;  *(_DWORD *)(v1 +80) =0;  this.result = Rank.White;//默認(rèn)都是白色的球v6 = -1;while(1){ 
  19.     v7 = qword_101439198; 
  20.     if ( *(_BYTE *)(qword_101439198 + 266) & 1 ) 
  21.     { 
  22.       if ( !*(_DWORD *)(qword_101439198 + 188) ) 
  23.       { 
  24.         sub_100DFF71C(); 
  25.         v7 = qword_101439198; 
  26.       }}if( !*(_QWORD *)(*(_QWORD *)(v7 +160) +192LL) )gotoLABEL_17;    result = sub_1000FB954();    v5 += result;if( v4 < v5 )//if (num < num2)break;if( ++v6 >=4)      return result;  }  *(_DWORD *)(v1 +80) = v6 +1;//this.result = (Rank)i;return result;} 

這里的 *(_DWORD *)(v1 + 80) 的位置其實(shí)就是 this.result 所以直接修改 80 偏移位置的值就可以了。

總結(jié)

總結(jié)來(lái)說(shuō)的話,要分析iOS里面轉(zhuǎn)換后的腳本C代碼還是不容易的,如果能夠根據(jù)Android C#腳本分析的結(jié)果然后對(duì)iOS的符號(hào)進(jìn)行恢復(fù)一下的話,就可以直接根據(jù)Android分析到的函數(shù)直接來(lái)Hook iOS對(duì)應(yīng)的函數(shù)來(lái)修改參數(shù)或者值了。不過(guò)這里還是在越獄設(shè)備上面進(jìn)行的hook,然后會(huì)講到非越獄設(shè)備同樣也可以進(jìn)行靜態(tài)的hook操作。


網(wǎng)頁(yè)標(biāo)題:旅行青蛙Unity游戲逆向修改--iOS篇
網(wǎng)頁(yè)鏈接:http://www.dlmjj.cn/article/dpigpej.html