攻:
?用monkey將逆向的項(xiàng)目ipa導(dǎo)入其中,用hook你要重寫或者修改的代碼。
防:
創(chuàng)建類,在類中l(wèi)oad方法中 fishhook 對 runtime的 method swizz 及 setIMP,getIMP函數(shù)進(jìn)行替換,打入動態(tài)庫,mokeyapp就不能hook了,
攻:
越獄手機(jī)中,用theos工具創(chuàng)建Tweak項(xiàng)目,tweak編輯plist需要hook的進(jìn)程。hook中編寫hook的方法,打入動態(tài)庫。當(dāng)程序啟動時(shí),蘋果會通過plist找到進(jìn)程,將動態(tài)庫注入到項(xiàng)目中。
防:
在項(xiàng)目中other linker flags 增加 _RESTRICT _restrict,dyld有2種阻止動態(tài)庫的代碼,1,設(shè)置uid,gid,但是上線后是不允許改變,還一種就是dyld會遍歷macho文件中_RESTRICT _restrict字段是否存在,存在就會阻止動態(tài)庫的注入。
攻:
更改macho文件中的_restrict的二進(jìn)制字段。
防:
通過第一種防護(hù),另外通過dyld的阻止方法可以判斷macho中是否存在_restrict,如果不存在,則程序退出。
防止別人調(diào)試:
通過syscls可以獲取當(dāng)前進(jìn)程是否被操作,通過與操作獲取控制碼。
通過prace 有個(gè)拒絕連接(PT_DENY_ATTACH),如果有直接閃退。(支付寶就是這樣進(jìn)行防護(hù)的)。
攻:
首先在monkey中增加一個(gè)符號(prace或者syscls)斷點(diǎn),bt獲取其地址,再imagelist獲取指令的動態(tài)庫首地址,算出偏移地址,再找到app中的防護(hù)動態(tài)庫中的可執(zhí)行文件,用hopper打開,找到算出來的偏移地址(獲取的偏移地址是指向下一條指令)。對此函數(shù)的匯編代碼進(jìn)行修改后導(dǎo)出,直接將前三段bl跳轉(zhuǎn)到倒數(shù)后三段,即跳過你防護(hù)的代碼。如果是fishhook改變r(jià)untime的method swizz,改變匯編獲取常量的偏移地址。
防:
1.代碼混淆,在pch文件中對需要防護(hù)的類名及方法名用宏定義,對方用hopper及ida對macho文件是很難找不到其方法名及方法。
2.字符串加密,將字符串放到char數(shù)組中最后加上\0,并對每個(gè)字符進(jìn)行異或操作,然后再char數(shù)組再進(jìn)行一次異或回來。
3.隱藏CCCrypt,加密都會用到此函數(shù),通過dlopen獲取句柄(第一個(gè)參數(shù)是CCCrypt動態(tài)庫路徑,第二個(gè)參數(shù)以懶加載形式RTLD_LAZY),通過dlsym(第一個(gè)參數(shù)是句柄,第二個(gè)是字符串“CCCrypt”,此字符串需要用第二個(gè)字符串加密)將CCCrypt結(jié)構(gòu)體替換成自己寫的結(jié)構(gòu)體。
4.使用匯編進(jìn)行系統(tǒng)調(diào)用,防止符號斷點(diǎn)調(diào)試進(jìn)行定位匯編代碼。通過asm鏈接匯編代碼,通過匯編代碼svc? #0x80觸發(fā)中斷。通過syscall頭文件找到底層函數(shù)名對應(yīng)的定義數(shù)值。如prace匯編
asm(
?"mov x0,#31\n"
?"mov x1,#0\n"
?"mov x2,#0\n"
?"mov x3,#0\n"
?"mov w16,#26\n"http://26就是prase,上面四個(gè)是傳入的參數(shù)
?"svc? #0x80"http://觸發(fā)中斷
)
5.重簽名防護(hù) ,描述文件的組織單位,通過字符串截取出來進(jìn)行比較,此方法把前四種全部加進(jìn)去進(jìn)行防護(hù),對方很難進(jìn)行逆向項(xiàng)目的。
6.利用防護(hù)工具,LLVM進(jìn)行邏輯混淆,防止classDump。