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