如何在app的最初启动时加断点调试!

在app启动时,比如didfinishlaunch中:
如果用debugserver -a的话,这样app已经启动完成了。
但是如果用debugserver -x的形式启动的话,这样的话lldb又太靠前了。整个app还没加载近内存中,还在dyld的load过程中,导致也没法加断点。

在cycript中,好像也没法针对didfinishlaunch的方法进行调试。。。

是我方法错了吗?

顺便问下,在ida中,如何知道一个变量是寄存器或者栈中是否是static的,这个能看出来吗?

dyld入口点往下有两个 blx, 其中一个就是 main

3 个赞

一切源于dyldStartup.s这个文件,其中用汇编实现了名为__dyld_start的方法,汇编太生涩,它主要干了两件事:

调用dyldbootstrap::start()方法(省去参数)
上个方法返回了 main 函数地址,填入参数并调用 main 函数

而且按照这个堆栈看的话,这里的main只是dyld的main。

我在上面的那个initializeMainExecutable加了个断点。显示warning: failed to set breakpoint site at 0x1fed9cf0 for breakpoint 1.1: error: 2 sending the breakpoint request。(论坛里有人说这个错误是ASLR不对导致的,但是我用的就是书上的那个方法加起来的啊)

貌似在dyld里面加断点调不到app里的main…

debugserver -x来启动,然后b main,应该是可以断下来的

不可能断不到, 肯定是你搞错了

不是我的意思是,这里的main是dyld里的main,不是app里的main函数的入口。即使断到也没有意义啊。因为后面还有一大坨函数要执行,我不可能一个一个去n吧

至于断不到的原因,貌似是这个app的原因,我每次去拿ASLR+IDA里的地址去break的时候,都会提示上面按个错误。其他的app都是ok的,不知道是什么原因或者这个app做了什么,导致这种ASLR+IDA的方法失败了。

但是如果按照_shortMethodDescription那种方法是可以的,但是这种方法貌似只针对OC吧。对于C、C++这种不管用。

先看清楚我说的是啥
另外上边说错, 不是BLX, 是BR

dyld`_dyld_start:
->  0x100101000 <+0>:   mov    x28, sp
    0x100101004 <+4>:   and    sp, x28, #0xfffffffffffffff0
    0x100101008 <+8>:   mov    x0, #0x0
    0x10010100c <+12>:  mov    x1, #0x0
    0x100101010 <+16>:  stp    x1, x0, [sp, #-0x10]!
    0x100101014 <+20>:  mov    x29, sp
    0x100101018 <+24>:  sub    sp, sp, #0x10             ; =0x10
    0x10010101c <+28>:  ldr    x0, [x28]
    0x100101020 <+32>:  ldr    x1, [x28, #0x8]
    0x100101024 <+36>:  add    x2, x28, #0x10            ; =0x10
    0x100101028 <+40>:  adrp   x4, -1
    0x10010102c <+44>:  add    x4, x4, #0x0              ; =0x0
    0x100101030 <+48>:  adrp   x3, 48
    0x100101034 <+52>:  ldr    x3, [x3, #0xd80]
    0x100101038 <+56>:  sub    x3, x4, x3
    0x10010103c <+60>:  mov    x5, sp
    0x100101040 <+64>:  bl     0x100101088               ; dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*, unsigned long*)
    0x100101044 <+68>:  mov    x16, x0
    0x100101048 <+72>:  ldr    x1, [sp]
    0x10010104c <+76>:  cmp    x1, #0x0                  ; =0x0
    0x100101050 <+80>:  b.ne   0x10010105c               ; <+92>
    0x100101054 <+84>:  add    sp, x28, #0x8             ; =0x8
    0x100101058 <+88>:  br     x16
    0x10010105c <+92>:  mov    x30, x1
    0x100101060 <+96>:  ldr    x0, [x28, #0x8]
    0x100101064 <+100>: add    x1, x28, #0x10            ; =0x10
    0x100101068 <+104>: add    x2, x1, x0, lsl #3
    0x10010106c <+108>: add    x2, x2, #0x8              ; =0x8
    0x100101070 <+112>: mov    x3, x2
    0x100101074 <+116>: ldr    x4, [x3]
    0x100101078 <+120>: add    x3, x3, #0x8              ; =0x8
    0x10010107c <+124>: cmp    x4, #0x0                  ; =0x0
    0x100101080 <+128>: b.ne   0x100101074               ; <+116>
    0x100101084 <+132>: br     x16

既然你都知道在dyldStartup.s有源码, 那就去看看源码啊, 注释都写得很清楚

br	x16			// jump to the program's entry point

这个不行,因为现在还在dyld中。还没有进到app中,所以根本没有main。

你再c一下,就会断下来了

是的可以了。这样就断下来了。。。

发现一个新的,you can try

rb .

and below

我当时也有类似的困惑…后来还是 直接b main了…适用大部分应用 不也也有应用b main停不下来的…不知道为啥