在app启动时,比如didfinishlaunch中:
如果用debugserver -a的话,这样app已经启动完成了。
但是如果用debugserver -x的形式启动的话,这样的话lldb又太靠前了。整个app还没加载近内存中,还在dyld的load过程中,导致也没法加断点。
在cycript中,好像也没法针对didfinishlaunch的方法进行调试。。。
是我方法错了吗?
顺便问下,在ida中,如何知道一个变量是寄存器或者栈中是否是static的,这个能看出来吗?
在app启动时,比如didfinishlaunch中:
如果用debugserver -a的话,这样app已经启动完成了。
但是如果用debugserver -x的形式启动的话,这样的话lldb又太靠前了。整个app还没加载近内存中,还在dyld的load过程中,导致也没法加断点。
在cycript中,好像也没法针对didfinishlaunch的方法进行调试。。。
是我方法错了吗?
顺便问下,在ida中,如何知道一个变量是寄存器或者栈中是否是static的,这个能看出来吗?
dyld入口点往下有两个 blx, 其中一个就是 main
一切源于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
你再c
一下,就会断下来了
我当时也有类似的困惑…后来还是 直接b main了…适用大部分应用 不也也有应用b main停不下来的…不知道为啥