ios 逆向汇编指令if ,while do ,switch 条件语句汇编的变化

循环&选择
cmp(Compare)比较指令

CMP 把一个寄存器的内容和另一个寄存器的内容或立即数进行比较。但不存储结果,只是正确的更改标志。

一般CMP做完判断后会进行跳转,后面通常会跟上B指令

BL 标号:跳转到标号处执行

B.LT 标号:比价结果是小于(less than),执行标号,否则不跳转

B.LE 标号:比较结果是小于等于(less than or qeual to),执行标号,否则不跳转

B.GT 标号:比较结果是大于(greater than),执行标号,否则不跳转

B.GE 标号:比较结果是大于等于(greater than or equal to),执行标号,否则不跳转

B.EQ 标号:比较结果是等于(equal to),执行标号,否则不跳转

B.NE 标号:比较结果是不等于(not equal to),执行标号,否则不跳转

B.LS 标号:比较结果是无符号小于等于,执行标号,否则不跳转

B.LO 标号:比较结果是无符号小于,执行标号,否则不跳转

B.HI 标号:比较结果是无符号大于,执行标号,否则不跳转

B.HS 标号:比较结果是无符号大于等于,执行标号,否则不跳转

一.分析if 和全局变量的汇编代码

0x10264a734 <+0>: sub sp, sp,#0x10 ; =0x10 //开辟一个16字节空间

0x10264a738<+4>:  str    w0, [sp,#0xc]  // w0值放入了栈空间,位置是sp偏移#0xc

0x10264a73c<+8>:  str    w1, [sp,#0x8]  // w1 w0和w1的值放入了栈空间,位置是sp偏移#0x8

-> 0x10264a740<+12>: ldr w8, [sp,#0xc] //把栈空间的值读出来放入寄存器w8

0x10264a744<+16>: ldr    w9, [sp,#0x8] //把栈空间的值读出来放入寄存器w9

0x10264a748<+20>: cmp    w8, w9  //比较w8,w9

0x10264a74c<+24>: b.le 0x10264a764 //比较结果是小于等于(less than or qeual to),执行标号,否则不跳转

0x10264a750<+28>: ldr    w8, [sp,#0xc]  //把栈空间的值读出来放入寄存器w8

0x10264a754<+32>: adrp  x9,2  // 2左移12位0x10264a000 + 2  0x10264c000

0x10264a758 <+36>: add    x9, x9,#0xd88        //0x10264c000 +0xd88  = 0x10264cd88

0x10264a75c<+40>: str    w8, [x9] //w9 地址值写个W8

0x10264a760<+44>: b      0x10264a774    //跳转到  0x10264a774     

0x10264a764<+48>: ldr    w8, [sp,#0x8]  //读取 sp 偏移0x8 的地址给w8

0x10264a768<+52>: adrp  x9,2 / 2左移12位0x10264a000 + 2  0x10264c000

0x10264a76c <+56>: add    x9, x9,#0xd88            //0x10264c000 +0xd88  = 0x10264cd88

0x10264a770<+60>: str    w8, [x9]    把x9 的地址给 w8

0x10264a774 <+64>: add    sp, sp,#0x10            ; =0x10 //栈平衡

0x10264a778<+68>: ret 

Switch

1、假设switch语句的分支比较少的时候(例如3,少于4的时候没有意义)没有必要使用此结构,相当于if。
2、各个分支常量的差值较大的时候,编译器会在效率还是内存进行取舍,这个时候编译器还是会编译成类似于if,else的结构。
3、在分支比较多的时候:在编译的时候会生成一个表(跳转表每个地址四个字节)。

当switch条件小于4个的时候就是if汇编的判断

0x10465a124 <+16>:  ldur   w8, [x29, #-0x4]
0x10465a128 <+20>:  cmp    w8, #0x1                  ; =0x1 
0x10465a12c <+24>:  str    w8, [sp, #0x8]
0x10465a130 <+28>:  b.eq   0x10465a158               ; <+68> at main.m
0x10465a134 <+32>:  b      0x10465a138               ; <+36> at main.m
0x10465a138 <+36>:  ldr    w8, [sp, #0x8]
0x10465a13c <+40>:  cmp    w8, #0x2                  ; =0x2 
0x10465a140 <+44>:  b.eq   0x10465a168               ; <+84> at main.m
0x10465a144 <+48>:  b      0x10465a148               ; <+52> at main.m
0x10465a148 <+52>:  ldr    w8, [sp, #0x8]
0x10465a14c <+56>:  cmp    w8, #0x3                  ; =0x3 
0x10465a150 <+60>:  b.eq   0x10465a178               ; <+100> at main.m
0x10465a154 <+64>:  b      0x10465a188               ; <+116> at main.m

当条件大于4个

0x10242a100 <+20>:  subs   w8, w8, #0x1              ; =0x1 
0x10242a104 <+24>:  mov    x9, x8
0x10242a108 <+28>:  ubfx   x9, x9, #0, #32
0x10242a10c <+32>:  cmp    x9, #0x4                  ; =0x4 
0x10242a110 <+36>:  str    x9, [sp]
0x10242a114 <+40>:  b.hi   0x10242a170               ; <+132> at main.m
0x10242a118 <+44>:  adrp   x8, 0
0x10242a11c <+48>:  add    x8, x8, #0x188            ; =0x188 
0x10242a120 <+52>:  ldr    x11, [sp]
0x10242a124 <+56>:  ldrsw  x10, [x8, x11, lsl #2]
0x10242a128 <+60>:  add    x9, x8, x10
0x10242a12c <+64>:  br     x9
0x10242a130 <+68>:  adrp   x0, 1
0x10242a134 <+72>:  add    x0, x0, #0xf69            ; =0xf69 
0x10242a138 <+76>:  bl     0x10242a588               ; symbol stub for: printf
0x10242a13c <+80>:  b      0x10242a17c  

源码

void funcA(int a){
      switch (a) {//
          case 1:
              printf("打坐");
        break;
          case 2:
            printf("加红");
        break;
        case 3:
            printf("加蓝");
        break;
        case 5:
        printf("打怪");
        break;
        default:
            printf("啥都不干");
        break;
  }
}
汇编代码
0x10242a0ec <+0>:   sub    sp, sp, #0x20             ; =0x20 
0x10242a0f0 <+4>:   stp    x29, x30, [sp, #0x10]
0x10242a0f4 <+8>:   add    x29, sp, #0x10            ; =0x10 
0x10242a0f8 <+12>:  stur   w0, [x29, #-0x4]
0x10242a0fc <+16>:  ldur   w8, [x29, #-0x4]
0x10242a100 <+20>:  subs   w8, w8, #0x1              ; =0x1 
0x10242a104 <+24>:  mov    x9, x8
0x10242a108 <+28>:  ubfx   x9, x9, #0, #32
0x10242a10c <+32>:  cmp    x9, #0x4                  ; =0x4 
0x10242a110 <+36>:  str    x9, [sp]
0x10242a114 <+40>:  b.hi   0x10242a170               ; <+132> at main.m
0x10242a118 <+44>:  adrp   x8, 0
0x10242a11c <+48>:  add    x8, x8, #0x188            ; =0x188 
0x10242a120 <+52>:  ldr    x11, [sp]
0x10242a124 <+56>:  ldrsw  x10, [x8, x11, lsl #2]
0x10242a128 <+60>:  add    x9, x8, x10
0x10242a12c <+64>:  br     x9
0x10242a130 <+68>:  adrp   x0, 1
0x10242a134 <+72>:  add    x0, x0, #0xf69            ; =0xf69 
0x10242a138 <+76>:  bl     0x10242a588               ; symbol stub for: printf
0x10242a13c <+80>:  b      0x10242a17c               ; <+144> at main.m:30:1
0x10242a140 <+84>:  adrp   x0, 1
0x10242a144 <+88>:  add    x0, x0, #0xf70            ; =0xf70 
0x10242a148 <+92>:  bl     0x10242a588               ; symbol stub for: printf
0x10242a14c <+96>:  b      0x10242a17c               ; <+144> at main.m:30:1
0x10242a150 <+100>: adrp   x0, 1
0x10242a154 <+104>: add    x0, x0, #0xf77            ; =0xf77 
0x10242a158 <+108>: bl     0x10242a588               ; symbol stub for: printf
0x10242a15c <+112>: b      0x10242a17c               ; <+144> at main.m:30:1
0x10242a160 <+116>: adrp   x0, 1
0x10242a164 <+120>: add    x0, x0, #0xf7e            ; =0xf7e 
0x10242a168 <+124>: bl     0x10242a588               ; symbol stub for: printf
0x10242a16c <+128>: b      0x10242a17c               ; <+144> at main.m:30:1
0x10242a170 <+132>: adrp   x0, 1
0x10242a174 <+136>: add    x0, x0, #0xf85            ; =0xf85 
0x10242a178 <+140>: bl     0x10242a588               ; symbol stub for: printf
0x10242a17c <+144>: ldp    x29, x30, [sp, #0x10]
0x10242a180 <+148>: add    sp, sp, #0x20             ; =0x20 
0x10242a184 <+152>: ret 

0x10242a10c <+32>: cmp x9, #0x4 // 表示case 最大与最小差值

ldrsw x10, [x8, x11, lsl #2] // 建立了一张地址表 根据数据源的size大小和偏移寻址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容