iOS逆向(三)狀態(tài)寄存器&還原高級(jí)代碼

回顧:

bl 跳轉(zhuǎn),將下一條要執(zhí)行的指令放入lr(X30)寄存器
ret 返回lr所保存的地址執(zhí)行代碼
pc 指向要執(zhí)行的代碼地址
sp 指向棧,棧平衡(函數(shù)調(diào)用后,將拉伸的??臻g平衡sub,add)
函數(shù)調(diào)用會(huì)開(kāi)辟一段??臻g(函數(shù)的局部變量、參數(shù)、寄存器的保護(hù))
參數(shù)放在X0 - X7(個(gè)數(shù)有關(guān),與數(shù)據(jù)類(lèi)型有關(guān) 浮點(diǎn)、結(jié)構(gòu)體...),多余的入棧
函數(shù)嵌套調(diào)用,死遞歸,不斷開(kāi)辟空間 -> 內(nèi)存溢出

狀態(tài)寄存器 CPSR

CPU內(nèi)部的寄存器中,有一種特殊的寄存器(不同的處理器,個(gè)數(shù)和結(jié)構(gòu)可能不同),在ARM中,被稱(chēng)為狀態(tài)寄存器CPSR(current program status register),其他寄存器是用來(lái)存放數(shù)據(jù)的,而CPSR是按位起作用的,即它的每一位都有專(zhuān)門(mén)的含義,記錄特定的信息。
注:CPSR是32位的

狀態(tài)寄存器.png

N(Negative)

符號(hào)標(biāo)志位,記錄相關(guān)指令執(zhí)行后,結(jié)果是否為負(fù),負(fù):1 非負(fù):0

Z(Zero)

0標(biāo)志位,記錄相關(guān)指令執(zhí)行后,結(jié)果是否為0,0:1 非0:0

C(Carry)

進(jìn)位標(biāo)志位,一般情況下,進(jìn)行無(wú)符號(hào)數(shù)的運(yùn)算。
加法:當(dāng)結(jié)果產(chǎn)生了進(jìn)位時(shí)(無(wú)符號(hào)數(shù)溢出),C=1,否則C=0
減法:當(dāng)運(yùn)算時(shí)產(chǎn)生了借位時(shí)(無(wú)符號(hào)數(shù)溢出),C=0,否則C=1

  • 進(jìn)位:當(dāng)兩個(gè)數(shù)相加時(shí),可能產(chǎn)生從最高有效位向更高位的進(jìn)位,由于這個(gè)進(jìn)位值在32位中無(wú)法保存,CPU在運(yùn)算時(shí)并不丟棄這個(gè)進(jìn)位值,而是記錄在一個(gè)特殊的寄存器的某一位上,ARM就用C位來(lái)記錄這個(gè)進(jìn)位值。
  • 借位:兩個(gè)數(shù)做減法時(shí),可能向更高位借位,用C位來(lái)標(biāo)記借位,C=0

V(Overflow)

溢出標(biāo)志位,在進(jìn)行有符號(hào)數(shù)運(yùn)算時(shí),如果超過(guò)了機(jī)器所表示的范圍,稱(chēng)為溢出。

  • 正數(shù) + 正數(shù) = 負(fù)數(shù) 溢出
  • 負(fù)數(shù) + 負(fù)數(shù) = 正數(shù) 溢出
  • 正數(shù) + 負(fù)數(shù) 不可能溢出
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容