1. 程式人生 > >GDB來除錯IPHONE步驟

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