PowerPC棧幀分析_第1頁
PowerPC棧幀分析_第2頁
PowerPC棧幀分析_第3頁
PowerPC棧幀分析_第4頁
PowerPC棧幀分析_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、PowerPC棧幀分析1 .PowerPC寄存器的使用規(guī)則 通用寄存器的用途:r0r1在函數(shù)開始(function prologs )時使用。堆棧指針,相當于ia32架構(gòu)中的esp寄存器,idapro把這個寄存器反匯編標識為 內(nèi)容表(toc)指針,idapro把這個寄存器反匯編標識為rtoc。系統(tǒng)調(diào)用時,它包含sp。r2系統(tǒng)調(diào)用號(這個好像跟系統(tǒng)有關(guān)吧)。r3r4-r10r11r12r13r14-r31作為第一個參數(shù)和返回值。函數(shù)或系統(tǒng)調(diào)用開始的參數(shù)。用在指針的調(diào)用和當作一些語言的環(huán)境指針。 它用在異常處理和 glink (動態(tài)連接器)代碼。 保留作為系統(tǒng)線程ID。作為本地變量,非易失性。專用

2、寄存器的用途:鏈接寄存器,它用來存放函數(shù)調(diào)用結(jié)束處的返回地址。計數(shù)寄存器,它用來當作循環(huán)計數(shù)器,會隨特定轉(zhuǎn)移操作而遞減。 定點異常寄存器,存放整數(shù)運算操作的進位以及溢出信息。機器狀態(tài)寄存器,用來配置微處理器的設(shè)定。條件寄存器,它分成 8個4位字段,cr0-cr7,它反映了某個算法操作的結(jié)果并且提Irctrxermsrcr供條件分支的機制。HgheST aodress*專禪秋MM悅庚!2.棧幀的使用規(guī)則PowerPC寄存器沒有專用的 Pop, Push指令來執(zhí)行堆棧操作,所以PowerPC構(gòu)架使用存儲器訪問指令stwu,lwzu來代替Push和Pop指令。PowerPC處理器使用 GPR1來將這

3、個堆棧段 構(gòu)成一個單向鏈表,這個單鏈表的每一個數(shù)據(jù)成員,我們稱之為堆棧幀(Stack Frame),每一個函數(shù)負責維護自己的堆棧幀。PowerPC體系結(jié)構(gòu)中棧的增長方向是從高地址到低地址,堆的增長方式是從低地址到搞地 址,當兩者相遇時就會產(chǎn)生溢出。堆棧幀的格式如下:FPR Sow Al enGPR £a c Area(塹亦I*.屮gCR Save Word(pptiCMxahl.wa I a I lablie's Ares_ . 腳?iQiial, ?ize vancii FtincTion Pirajiieiers AieaPfddiLW 10 adpiiit aiic l

4、oiuuiqpk of & bvicsFrame HeaderL瓦詠譏UdRgure 2 * EABI Stack Frame、婁卑曾盤占二古出*的弍*址 申上 I r KWfftfeU 址各部分名詞解釋:函數(shù)參數(shù)域(Function Parameter Area):這個區(qū)域的大小是可選的,即如果如果調(diào)用函數(shù)傳 遞給被調(diào)用函數(shù)的參數(shù)少于六個時,用GPR4至GPR10這個六個寄存器就可以了,被調(diào)用函數(shù)的棧幀中就不需要這個區(qū)域;但如果傳遞的參數(shù)多于六個時就需要這個區(qū)域。局部變量域(Local Variables Area):通上所示,如果臨時寄存器的數(shù)量不足以提供給被調(diào)用函數(shù)的臨時變量使用

5、時,就會使用這個域。CR寄存器:即使修改了 CR寄存器的某一個段 CRx( x=0至7),都有保存這個 CR寄存器的 內(nèi)容。通用寄存器GPR當需要保存GPR寄存器中的一個寄存器器 GPRn時,就需要把從 GPRn到 GP R31的值都保存到堆棧幀中。浮點寄存器FPR使用規(guī)則共GPR寄存器。3. PowerPC的匯編指令和棧操作PowerPC寄存器沒有專用的 Push和pop指令來執(zhí)行堆棧操作,所以PowerPC構(gòu)架使用存儲器訪問指令 stwu、Iwzu來代替Push和pop指令。4.函數(shù)執(zhí)行時棧幀的建立與消亡過程 函數(shù)棧的建立與消亡過程如下圖所示:返4.1函數(shù)棧的建立與消亡過程說明故形成過程可

6、以概括為如前所屬,P owerPC體系結(jié)構(gòu)中棧的增長方向是從高地址到低地址, 如下幾點:1)調(diào)用函數(shù)r1指向棧頂(SP),用間接尋址方式分配一定大小??臻g;2)3)4)r31指向棧頂,以r31為基值將參數(shù)壓入棧內(nèi); 進入被調(diào)函數(shù),跳轉(zhuǎn)到被調(diào)函數(shù)的SP處;被調(diào)函數(shù)同樣進行棧分配及參數(shù)壓棧操作;5)被調(diào)函數(shù)執(zhí)行完畢之后, 的SP即為調(diào)用函數(shù)的跳轉(zhuǎn)SP)LR返回到被調(diào)用處的下一條指令,繼續(xù)后續(xù)操作(此時4.2舉例說明棧操作過程 以下以一個簡單的函數(shù)調(diào)用, 函數(shù)例子如下:說明P owerPC棧的操作過程。intcalltest2( int a)intt1=5;intt2 = 6;intresult =

7、0;char * p =0;P =a;intcalltest1( int a)intt1=3;intt2 = 4;intresult =0;result = calltest2(t2);t1 =3;void calltest()int t1=7;int t2 = 9;int result =0;result = calltest1(t1);t1 =3;利用反匯編工具,生成匯編代碼及分析如下:int calltest2( int aiCalltest2棧幀建立分析:stwur1,-48(r1):分配48字節(jié)的棧幀,r1指向棧頂;(powerpc省略了 EBP所以一上來即進行一次間接尋址 )stw

8、r31,44(r1):保存r31的原值,以后恢復(fù);orr31,r1,r1 :讓 r31 指向棧頂 r1( r31=r1 or r31)stwr3,8(r31):第一個形參0x401d4f0calltest2:stwur1,-48(r1)0x401d4f4+0x004:stwr31,44(r1)0x401d4f8+0x008:orr31,r1,r10x401d4fc+0x00c:stwr3,8(r31)局部變量賦值:li r0 5(t1,t2.result)int t1=5;l0x401d500+0x010:lir0,0x5 # 50x401d504+0x014:stwr0,12(r31)int

9、 t2 = 6;0x401d508+0x018:lir0,0x6 # 60x401d50c+0x01c:stwr0,16(r31)int result =0;10x401d510+0x020:lir0,0x0 # 00x401d514+0x024:stwr0,20(r31)char * p =0;0x401d518+0x028:lir0,0x0 # 00x401d51c+0x02c:stwr0,24(r31)加載函數(shù)調(diào)用參數(shù)到r91*P =a;|0x401d520+0x030:lwzr9,24(r31)0x401d524+0x034:lbzr0,11(r31)保存r9到r00x401d528+

10、0x038:stbr0,0(r9)r11=r1,r31=r11-4=r1-4,恢復(fù) r31 的值0x401d52c+0x03c:lwzr11,0(r1)0x401d530+0x040:lwzr31,-4(r11)0x401d534+0x044:orr1,r11,r11bir:跳轉(zhuǎn)到LR地址,返回calltesti中調(diào)用calltest2的下一條指令地址 0x401d57c的繼續(xù)指向0x401d538+0x048:blrint calltest1( int a)0x401d53ccalltest1:stwur1,-48(r1)將LR內(nèi)容存入r0(存在函數(shù)調(diào)用時需要用到 LR用來存放函數(shù)調(diào)用結(jié)束處

11、的返回地址)0x401d540+0x004:mfsprr0,LR0x401d544+0x008:stwr31,44(r1)0x401d548+0x00c:stwr0,52(r1)0x401d54c+0x010:orr31,r1,r10x401d550+0x014:stwr3,8(r31)局部變量賦值(t1,t2,result)int t1=3;|0x401d554+0x018:lir0,0x3 # 30x401d558+0x01c:stwr0,12(r31)int t2 = 4;0x401d55c+0x020:lir0,0x4 # 40x401d560+0x024:stwr0,16(r31)i

12、nt result =0;0x401d564+0x028:lir0,0x0 # 00x401d568+0x02c:stwr0,20(r31)函數(shù)調(diào)用result = calltest2(t2); I0x401d56c+0x030:lwzr3,16(r31)0x401d570+0x034:bl0x401d4f0 # calltest20x401d574+0x038:orr0,r3,r30x401d578+0x03c:stwr0,20(r31)t1 =3;0x401d57c+0x040:lir0,0x3 # 30x401d580+0x044:stwr0,12(r31)0x401d584+0x048

13、:lwzr11,0(r1)0x401d588+0x04c:lwzr0,4(r11)0x401d58c+0x050:mts prLR,r00x401d590+0x054:lwzr31,-4(r11)0x401d594+0x058:orr1,r11,r11返回calltest函數(shù)的下一條指令地址0x401d5d8的繼續(xù)指向0x401d598+0x05c:blrVoid callteStd0x401d59ccalltest:stwur1,-48(r1)0x401d5a0+0x004:mfsprr0,LR0x401d5a4+0x008:stwr31,44(r1)0x401d5a8+0x00c:stwr

14、0,52(r1)0x401d5ac+0x010:orr31,r1,r1int t1=7;0x401d5b0+0x014:lir0,0x7 # 70x401d5b4+0x018:stwr0,8(r31)int t2 = 9;0x401d5b8+0x01c:lir0,0x9 # 90x401d5bc+0x020:stwr0,12(r31)int result =0;0x401d5c0+0x024:lir0,0x0 # 00x401d5c4+0x028:r0,16(r31)stwcalltest1 地址處(0x401d53c)調(diào)用函數(shù)calltrst1 :將t1(r31+8)加載到r3中,然后跳轉(zhuǎn)到

15、result = calltest1( t1); I0x401d5c8+0x02c:lwzr3,8(r31)0x401d5cc+0x030:bl0x401d53c # calltest10x401d5d0+0x034:orr0,r3,r3保存result返回值0x401d5d4+0x038:stwr0,16(r31)調(diào)用完成,開始后續(xù)指令操作1t1 =3;|0x401d5d8+0x03c:lir0,0x3 # 30x401d5dc+0x040:stwr0,8(r31)0x401d5e0+0x044:lwzr11,0(r1)0x401d5e4+0x048:lwzr0,4(r11)0x401d5e

16、8+0x04c:mts prLR,r00x401d5ec+0x050:lwzr31,-4(r11)0x401d5f0+0x054:orr1,r11,r110x401d5f4+0x058:blrF面利用斷點調(diào)試跟蹤棧內(nèi)存執(zhí)行過程1)在進入calltest但未執(zhí)行任何指令(參數(shù)還未賦值)時,查看寄存器及內(nèi)存分布如下:oasceefaOaS 02 700cc ce ccec e ecc cecc cececc M e CGC ccc eOnswzioee ee «« ooooooooooooooooooooooooOaace72QMO OOOO OOM 800 ececuasce

17、rjO!te te eeee e eee eeee vduuUGULI iXJUtJ OULKJOOOO OOOO OODO OOOO OOOO QOOO oooo ooooQaBceTSO.oooo oooo oooo oom oooo oooo omm doooOaS ceT&DDQD ODOD ODDQ 0X0 DDOOCMBa OOM COCaOaflccTVOOT-OO OOQO OOOO 0X0 QOM OOOO OOW OOOC*OaS rp7SDDeo 0300 詁a QbAOCOOD OCDO DODO 88OaSce79O;O13a SSeS O詬匚 9940800

18、 OOOc OOOO OQ&lOa&ce7aaODD 0D&4 QODO OO&a OXK DOOO DCXM3 OOOO*. b db d i I HBC I.BIr0=c7cbd8r1/s p=a8ce6c0r2= 0r3=0r4=0r5=0r6= 0r7=0r8=0r9=0r10= 0r11=a8ce738r12=401d59cr13=0r14= 0r15=0r16=0r17=0r18= 0r19=0r20=0r21=0r22= 0r23=0r24=0r25=0r26= 0r27=0r28=0r29=0r30= 0r31=a8ce6c0msr=b030lr

19、=c7cbd8ctr= 0pc=401d5b0cr=0xer=0mq=eeeeeeee內(nèi)存空間為為空DoaceScO:o Sc c5-(0eggc gegg ggeg HKecuuaS reSdO wre cccc c-ccc- ccce ccce ec«- OOOOOOOOcose e72O DOC? cbd 3 OOOOGOOD OCTOOa9cc7hO800 800 OOOO OOOO 3000 CX3O0 COOO OOOO此時 sp=0xa8ce6c0, r31 指向 r1, pc=0x401d5b0caltesti)2)執(zhí)行到result=O(局部變量賦值完成,但沒有調(diào)用

20、Co Sc e6f0 ee ee eeee vuoo'oda'7 OOOO«ee eete e«e <eee eeee teee eeee eeeeUaBCfibCttOaeceSfDreee eeee eeee eeee eete ee ee oulxjouixjCaSc e720 D0c7 clbd B 0000 OOOO OOOO 0000OaeceTDO:eeee eeee e eee eeee eeeeeeee eeee eeeeBeceZl-Otfeee eete OOOO OODO OOOOOOOOOOOOODCOOaeM72-CCOOO

21、O 0000 0000 OOOO «Mfrtee eeeeO3Boe73-0tee ee wee eee e ee e OtXXZlOOOO OOOO OOOOC3ece74<taxe OOOO OOOO OOOOi dodo odoo o doo ooogOofl ce 了 5°OOOO OOOO OOOO OOOO OOOO OOCM) OOOO OOOOOsfiM76-CCOOOO OOOO MOO OOOO OOOO 006 4 MOO ooroOaece77<tOOOG DODO OOOO 0000800 0000 0000 0000OeceTSO;O

22、sBreTSO;OOOG OOOO Ua90 ObaO OOOO 000 0 0 OOO CO 00 <X13a 38ee OaSc 93400CXM 000c DOCXS 0001OBficeZa-CCcom 0054 OOOO 0064 OOOO OOM OOOO comOaBce7h<tOOOC OOOO OOOO OOOO SOOO OOOO OOOO OOOO在緊跟SP之后,SP+8即為局部變量存儲區(qū),此時此時sp=0xa8ce6c03)再執(zhí)行 result=calltest(t1),跳進 calltestir0=401d5d0r1/s p=a8ce690r2=0r3=7

23、r4=0r5=0r6=0r7=0r8=0r9=0r10=0r11=a8ce738r12=401d59cr13=0r14=0r15=0r16=0r17=0r18=0r19=0r20=0r21=0r22=0r23=0r24=0r25=0r26=0r27=0r28=0r29=0r30=0r31=a8ce690msr=b030lr=401d5d0ctr=0pc=401d554cr=0xer=0mq=0此時SP=0Xa8ce690相對于原SP。正好移動48字節(jié)(即 calltest之后但未進行任何操作內(nèi)存分布為??臻g)。oaswesaOaSceSaOg3c e&DO ObBc eScQlOOOO

24、 OOCPlOaQl d 5cl 0OOOO 0000 0401 dS3c OOOO OOOO (WOO OOOOOaSceebQ&eee eeee eeee eeee eeee eeee OaS匚e曰:OaSceGcOOqSc e-6K) 0401 dSdOOOOO OOC7 OOOO 0009OOOO OOOOccE e cec cc=t =ee-tf e-=c=OaSceSeft&e ee eeee eee e eeee eeee eeee OOOOiXTW0aSce5f<J:a3c e7 20 00c7 ct)d S OOOO DODO OOOO OOOO0aS&

25、#171;70afreee ceee eeef eKe eeee eete eeee eeetOaS»71O«eee OOOO OOOO OOOO OOOO OOOO OOOOOaSce720rOOOO OOOO OOOO OOOO eeee see e e eee eeeeOaSce73Ckee ee eeee eee e e eee OOOO OOOO 000500000aa«74tt000 0X30 OOM OOCO OOOO OOOO (KXX) OOOOOaSM75&OOOO OOOO OOM OOOO OOOOOOOO OOOO OOOOOaS

26、ce7SO;OOOO OOOO OOOO OOOO OOOO0064 OOOO OOOOd.*0aSce77aOOOO OOOO OOOO OOOO ODOOOOOO OOOO OOOOOaS«7SCrOOOOOCXDOOBSO ObBO OOOO OOOO OOOO OOOO執(zhí)行函數(shù)到result=calltest2局部變星OsSce 69QOaa«6aOOeSce 6bQ0aa«6cQOaScefclQOaacfeeD OaSce efOOaa«71Q0BSce72QOaa«73Q0sSce74Qetee eeeeeeee ete* etee ceee OOOO OOOOOb St

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論