匯編基礎(chǔ)(八) if棚贾、循環(huán)的匯編識別

描述

驗證if、循環(huán)曙寡、switch在匯編當(dāng)中是怎么表示的

if 的匯編

新建的工程 源代碼

int g = 12;
void func(int a,int b){
    if(a >b){
        g = a;
    }else{
        g = b;
    }
}
int main(int argc, char * argv[]) {
    func(1, 2);
    return 0;
}

匯編的代碼

ext:00000001000068B0 _func ; CODE XREF: _main+28↓p
__text:00000001000068B0
__text:00000001000068B0 var_8 = -8
__text:00000001000068B0 var_4 = -4
__text:00000001000068B0
__text:00000001000068B0 SUB SP, SP, #0x10
__text:00000001000068B4 STR W0, [SP,#0x10+var_4]
__text:00000001000068B8 STR W1, [SP,#0x10+var_8]
__text:00000001000068BC LDR W0, [SP,#0x10+var_4]
__text:00000001000068C0 LDR W1, [SP,#0x10+var_8]
__text:00000001000068C4 CMP W0, W1
__text:00000001000068C8 B.LE loc_1000068E0
__text:00000001000068CC ADRP X8, #_g@PAGE
__text:00000001000068D0 ADD X8, X8, #_g@PAGEOFF
__text:00000001000068D4 LDR W9, [SP,#0x10+var_4]
__text:00000001000068D8 STR W9, [X8]
__text:00000001000068DC B loc_1000068F0
__text:00000001000068E0 ; ---------------------------------------------------------------------------
__text:00000001000068E0
__text:00000001000068E0 loc_1000068E0 ; CODE XREF: _func+18↑j
__text:00000001000068E0 ADRP X8, #_g@PAGE
__text:00000001000068E4 ADD X8, X8, #_g@PAGEOFF
__text:00000001000068E8 LDR W9, [SP,#0x10+var_8]
__text:00000001000068EC STR W9, [X8]
__text:00000001000068F0
__text:00000001000068F0 loc_1000068F0 ; CODE XREF: _func+2C↑j
__text:00000001000068F0 ADD SP, SP, #0x10
__text:00000001000068F4 RET
__text:00000001000068F4 ; End of function _func

匯編代碼分析

  • SUB SP, SP, #0x10
    • 拉伸椙悴福空間
  • STR W0, [SP,#0x10+var_4]轧邪,STR W1, [SP,#0x10+var_8],LDR W0, [SP,#0x10+var_4]羞海,LDR W1, [SP,#0x10+var_8]
    • 將w0忌愚,w1入棧,并從棧讀到w0却邓,w1
  • CMP W0, W1
    • 這個是相當(dāng)于減法 w0 - w1硕糊,會修改標(biāo)志寄存器,>,<,= 申尤;
  • B.LE loc_1000068E0
  • LE 代表的含義是如果是w0小于等于w1那么會直接跳轉(zhuǎn)到后面寫的內(nèi)存的方法中去_text:00000001000068E0 ADRP X8, #_g@PAGE
    • ADRP X8, #_g@PAGE 癌幕,ADD X8, X8, #_g@PAGEOFF 讀取一個全局變量_g 存入x8
    • LDR W9, [SP,#0x10+var_8] 從棧讀取一個數(shù)據(jù)存入w9
    • STR W9, [X8] 將w9存入x8的地址中
  • 如果w0大于w1 走這里__text:00000001000068CC ADRP X8, #_g@PAGE
    • ADRP X8, #_g@PAGE 衙耕,ADD X8, X8, #_g@PAGEOFF 讀取一個全局變量_g 存入x8
    • LDR W9, [SP,#0x10+var_4] 從椕链空間讀取 [SP,#0x10+var_4] 數(shù)據(jù)放入w9
    • STR W9, [X8] 將w9的值存入到x8的棧空間
  • ADD SP, SP, #0x10 回復(fù)棾却空間
  • RET 返回

匯編還原源代碼

因為w0时鸵、w1是兩個參數(shù),在main的匯編當(dāng)中有
int g = 12;  //動態(tài)分析可以知道
func(int a , int b){
STR W0, [SP,#0x10+var_4]
STR W1, [SP,#0x10+var_8]
LDR W0, [SP,#0x10+var_4]
 LDR W1, [SP,#0x10+var_8]
- int var_4 = a
- int var_8 = b
- int w0 = var_4
- int w1 = var_8
- if(w0>w1){
    ADRP X8, #_g@PAGE
    ADD X8, X8, #_g@PAGEOFF
    LDR W9, [SP,#0x10+var_4]
    STR W9, [X8]
    int* x8 = &g;
    int w9 = var_4; 
    *x8 = w9;
  }else{
    ADRP X8, #_g@PAGE
    ADD X8, X8, #_g@PAGEOFF
    LDR W9, [SP,#0x10+var_8]
    STR W9, [X8]
    int *x8 = &g
    int w9 = var_8;
    *x8 = w9
   }
}

最簡化代碼

int g = 12;
void func{
  if(a>b){
    g = a;
  }else{
    g = b;
  } 
}xw

循環(huán)的匯編

源代碼 do while

int main(int argc, char * argv[]) {
    int nSum = 0;
    int i = 0;
    do {
        nSum = nSum + 1;
        i++;
    } while (i<100);
    return 0;
}

匯編代碼

代碼分析

首先從SUB SP, SP, #0x20開始

  • 拉伸棧空間
  • 0x20+var_4 存入0
  • 0x20+var_8 存入w0
  • x1 入棧 SP,#0x20+var_10
  • SP,#0x20+var_14存入0
  • SP,#0x20+var_18存入0
    loc_100006900 ; CODE XREF: _main+38↓j
  • w8 = 讀取[SP,#0x20+var_14]
  • W8 = W8 + #1
  • w8 存入SP,#0x20+var_14
  • 從SP,#0x20+var_18 讀取給 w8
  • W8 = W8+#1
  • w8 存入 SP,#0x20+var_18
  • SP,#0x20+var_18 讀取給w8
  • CMP W8, #0x64 減法運算判斷
  • B.LT loc_100006900 判斷如果小于執(zhí)行地址中的方法饰潜,如果大于等于直接走下面方法
  • w8 = 0
  • x0 = x8
  • 恢復(fù)棾踝梗空間
  • 返回

還原源代碼

先做后判斷 是do while

var_4 = 0
var_8 = w0
var_10 = x1
var_14 = 0
var_18 = 0

do{
  w8 = var_14
  w8 = w8 + 1
  var_14 = w8
  w8 = var_18
  w8 = w8 + 1
  var_18 = w8
  w8 = var_18
}while(w8<0x64)
w8 = 0
x0 = x8

簡化

func(id w0,id w1){
do{
  int var_14 = 0;
  var_14 = var_14 + 1;
  int var_18 = 0;
  var_18 = var_18 + 1;
}while(var_18<0x64);
return 0;
}

源代碼while

int main(int argc, char * argv[]) {
    int nSum = 0;
    int i = 0;
    while (i<100){
        nSum = nSum + 1;
        i++;
    } ;
    return 0;
}

匯編代碼while

0x104a1a8e4 <+0>: sub sp, sp, #0x20 ; =0x20
0x104a1a8e8 <+4>: str wzr, [sp, #0x1c]
0x104a1a8ec <+8>: str w0, [sp, #0x18]
0x104a1a8f0 <+12>: str x1, [sp, #0x10]
-> 0x104a1a8f4 <+16>: str wzr, [sp, #0xc]
0x104a1a8f8 <+20>: str wzr, [sp, #0x8]
0x104a1a8fc <+24>: ldr w8, [sp, #0x8]
0x104a1a900 <+28>: cmp w8, #0x64 ; =0x64
0x104a1a904 <+32>: b.ge 0x104a1a924 ; <+64> at main.m
0x104a1a908 <+36>: ldr w8, [sp, #0xc]
0x104a1a90c <+40>: add w8, w8, #0x1 ; =0x1
0x104a1a910 <+44>: str w8, [sp, #0xc]
0x104a1a914 <+48>: ldr w8, [sp, #0x8]
0x104a1a918 <+52>: add w8, w8, #0x1 ; =0x1
0x104a1a91c <+56>: str w8, [sp, #0x8]
0x104a1a920 <+60>: b 0x104a1a8fc ; <+24> at main.m:19
0x104a1a924 <+64>: mov w8, #0x0
0x104a1a928 <+68>: mov x0, x8
0x104a1a92c <+72>: add sp, sp, #0x20 ; =0x20
0x104a1a930 <+76>: ret

代碼分析

  • sub sp, sp, #0x20 ; =0x20 拉伸棧空間
  • 0x1c = 0
  • 0x18 = w0
  • 0x10 = x1
  • 0xc = 0
  • 0x8 = 0
  • w8 = 0x8
  • w8 和0x64比較大小 w8 - 0x64
  • 如果上面的結(jié)果 大于等于執(zhí)行地址中的方法彭雾,否則向下執(zhí)行
    • 小于等于
      • w8 = 0xc
      • w8 = w8 + 1
      • 0xc = w8
      • w8 = 0x8
      • w8 = w8 + 1
      • 0x8 = w8
  • w8 = 0
  • x0 = x8
  • 回復(fù)椀蹋空間

簡化代碼

int func(id a, id b){
    int 0xc = 0
    int 0x8 = 0
  while(0x8<0x64){
    0xc = 0xc + 1
    0x8 = ox8 + 1 
  }
  return 0;
}

源代碼循環(huán)for

int main(int argc, char * argv[]) {
    for (int i = 0; i<100; i++) {
        printf("woqu");
    }
    return 0;
}

匯編代碼

__text:00000001000068C8 _main
__text:00000001000068C8
__text:00000001000068C8 var_18          = -0x18
__text:00000001000068C8 var_14          = -0x14
__text:00000001000068C8 var_10          = -0x10
__text:00000001000068C8 var_8           = -8
__text:00000001000068C8 var_4           = -4
__text:00000001000068C8 var_s0          =  0
__text:00000001000068C8
__text:00000001000068C8                 SUB             SP, SP, #0x30
__text:00000001000068CC                 STP             X29, X30, [SP,#0x20+var_s0]
__text:00000001000068D0                 ADD             X29, SP, #0x20
__text:00000001000068D4                 STUR            WZR, [X29,#var_4]
__text:00000001000068D8                 STUR            W0, [X29,#var_8]
__text:00000001000068DC                 STR             X1, [SP,#0x20+var_10]
__text:00000001000068E0                 STR             WZR, [SP,#0x20+var_14]
__text:00000001000068E4
__text:00000001000068E4 loc_1000068E4                           ; CODE XREF: _main+44↓j
__text:00000001000068E4                 LDR             W8, [SP,#0x20+var_14]
__text:00000001000068E8                 CMP             W8, #0x64
__text:00000001000068EC                 B.GE            loc_100006910
__text:00000001000068F0                 ADRP            X0, #aWoqu@PAGE ; "woqu"
__text:00000001000068F4                 ADD             X0, X0, #aWoqu@PAGEOFF ; "woqu"
__text:00000001000068F8                 BL              _printf
__text:00000001000068FC                 STR             W0, [SP,#0x20+var_18]
__text:0000000100006900                 LDR             W8, [SP,#0x20+var_14]
__text:0000000100006904                 ADD             W8, W8, #1
__text:0000000100006908                 STR             W8, [SP,#0x20+var_14]
__text:000000010000690C                 B               loc_1000068E4
__text:0000000100006910 ; ---------------------------------------------------------------------------
__text:0000000100006910
__text:0000000100006910 loc_100006910                           ; CODE XREF: _main+24↑j
__text:0000000100006910                 MOV             W8, #0
__text:0000000100006914                 MOV             X0, X8
__text:0000000100006918                 LDP             X29, X30, [SP,#0x20+var_s0]
__text:000000010000691C                 ADD             SP, SP, #0x30
__text:0000000100006920                 RET
__text:0000000100006920 ; End of function _main

分析

  • 從 STUR WZR, [X29,#var_4] var_4 = 0
  • var_8 = w0
  • var_10 = x1
  • var_14 = 0
  • w8 = var_14
    • 因為_text:00000001000068E4 loc_1000068E4 ,__text:000000010000690C B loc_1000068E4 所以是一個循環(huán)
  • cmp w8 0x64 比較
  • B.GE 上面大于等于直接跳出循環(huán)薯酝。
  • 小于
    • ADRP半沽、ADD獲取一個常量或者全局變量 “我去” x0 是參數(shù)
    • BL printf 打印
    • var_18 = w0
    • w8 = var_14
    • w8 = w8 + 1
    • var_14 = w8
    • 跳轉(zhuǎn)到 loc_1000068E4 B直接跳轉(zhuǎn)沒有 不用保存lr
  • 下面的不用說了

簡化代碼

int func(id var_8, id var_10){
   for(int var_14 = 0;var_14<0x64;i++){
    printf("woqu");
  }
  return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吴菠,隨后出現(xiàn)的幾起案子者填,更是在濱河造成了極大的恐慌,老刑警劉巖做葵,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件占哟,死亡現(xiàn)場離奇詭異,居然都是意外死亡酿矢,警方通過查閱死者的電腦和手機榨乎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘫筐,“玉大人谬哀,你說我怎么就攤上這事⊙戏荆” “怎么了史煎?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驳糯。 經(jīng)常有香客問我篇梭,道長,這世上最難降的妖魔是什么酝枢? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任恬偷,我火速辦了婚禮,結(jié)果婚禮上帘睦,老公的妹妹穿的比我還像新娘袍患。我一直安慰自己,他們只是感情好竣付,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布诡延。 她就那樣靜靜地躺著,像睡著了一般古胆。 火紅的嫁衣襯著肌膚如雪肆良。 梳的紋絲不亂的頭發(fā)上筛璧,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音惹恃,去河邊找鬼夭谤。 笑死,一個胖子當(dāng)著我的面吹牛巫糙,可吹牛的內(nèi)容都是我干的朗儒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼参淹,長吁一口氣:“原來是場噩夢啊……” “哼采蚀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起承二,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤榆鼠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亥鸠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妆够,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年负蚊,在試婚紗的時候發(fā)現(xiàn)自己被綠了神妹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡家妆,死狀恐怖鸵荠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伤极,我是刑警寧澤蛹找,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站哨坪,受9級特大地震影響庸疾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜当编,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一届慈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忿偷,春花似錦金顿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芜壁,卻和暖如春礁凡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慧妄。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工顷牌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塞淹。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓窟蓝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饱普。 傳聞我的和親對象是個殘疾皇子运挫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容