GDB来调试IPHONE步骤

IPHONE手机必须越狱:

安装以下插件是必需的:

>OpenSSH,作为SSH服务端;
>GNU Debugger(gdb调试工具):在这个源中cydia.radare.org,版本为1708,低版本不支持ios4.3+。
>adv-cmds:ps命令可以查看进程信息;
>darwin cc tools:otools可以查看可执行文件的详细信息;
>Link Identity Editor:ldid签名;

用ITOOLS开通SSH端口22,用SECURECRT就可以登陆IPHONE了,默认用户和密码root alpine

熟悉gdb调试:

记住以下常用命令就足够了:

ps -ax:查看当前所有进程

Gdb -p pid:附加到目标进程

如果太长,可以用SET height 10 来指定显示范围

Info sh:这个可以查看程序代码在内存中的偏移地址


i mach-region 0 显示基址


在手机VAR/ROOT目录创建.gdbinit文件,方便一些宏命令的使用

i mach-region 0 


display /i $pc | $cpsr.t     --显示指令

define bbvm                  --基址
  set $__bbvm=$arg0-(0x6c000-0x68000)
  end
 
  define bb                 --下断
  b *($__bbvm+$arg0)
  end

define pp                  --打印出对应基址的地址
Print /a ($arg0-$__bbvm)
end

define writechar                --改写内存CHAR
set objc-non-blocking-mode off
set $_count=0
while ($_count<24)
set {char}($arg1+$_count)= *(unsigned char*)($arg0+$_count)
set $_count++
end
end

writechar "jnrCpfiiWrwtl6rYSvTwMg==" $r0+84

一些基本指令:


Break:下断点

display /i $pc | $cpsr.t:显示要执行的下一句指令

disassemble  $pc $pc+10

continue(或c):继续执行;

Nexti(或ni):单步执行一条汇编指令(有些程序一执行就直接跳出函数)

Po $rN(N为数字,打印寄存器存储的对象,寄存器实际存储的是对象的地址)

Print $rN(打印寄存器中的值)

Set $rN=xxxx(给寄存器赋值)
Set $r5=[[[NSString] alloc] initWithString:@"xxxxxx"]
(gdb) set {unsigned int}0x8048a51=0x0
(gdb) set *(unsigned int*)0x8048a54=0x55aa55aa
打印字符串
   def loadlua
      set $uni = $r3
      while (*$uni)
          printf "%c", *($uni++)
      end
   
    end

x /ubx **** 显示内存地址


查寄存器
i r $r0 $r1 $r2 $r3 $r4 $r5 $r6 $r7 $r8 $r9 $r10 $r11 $r12


查看内存值
ldr r4, [r2, #0x20],就是关键的地方了。那么如何看内存地址里面的值呢?  i r 命令只能查看寄存器的值,要看内存地址里面的值需要用 x/uh 0x地址。这时候你可以看到r2寄存器的值为0x166410, +0x20= 0x166430. 注意这里2个都是是16进制的加法,不要弄错了。那么就用命令 x/uh 0x166430, 查看到他的内存值为800,就是大包的钱。
设置寄存器值
set $r4=0,

监视断点命令,watch *0x16d49c


set $x=0x95000
while(*++$x!=22975 && $x<0x1236000)
end


p/x $x


你可能感兴趣的:(GDB来调试IPHONE步骤)