簡易 GDB Script 教學,應用

緣由

在Debug 電腦開機階段時,利用QEMU停住OS, 在遠端的 GDB 每次都要輸入

set architecture i8086
target remote localhost:1234
b *0x7C00

一兩次到還好,若是有時候常常輸入真的就太累了, 而 GDB 可以以 script 的方式擴充指令,就可以減少了負擔了。 首先我們開一個空白文件,取名叫做myGdbScript.txt( myGdbScript.txt 以下稱做GdbScript)

當作批次檔

直接在文件中輸入

set architecture i8086
target remote localhost:1234
b *0x7C00

存檔後,進入GDB後,輸入

	source myGdbScript.txt

就會發現他就像批次檔一樣,自動的執行裡面的指令

自行定義指令

也可使用定義指令的方式,在GdbScript中輸入

define local_connect
	set architecture i8086
	target remote localhost:1234
	b *0x7C00
end

然後在 GDB 中,先把GdbScript讀進來

source myGdbScript.txt

之後就可以打

local_connect

你就會發現,他執行 define 裡面的三條指令

取得 current intstruction

使用 x/5i $cs*16 + $eip 來顯示目前 CS:IP所對應的指令,如下所示

define cur_intstruction
	x/5i $cs*16 + $eip
end

定義變數

在 GDB 中,也是可以定義變數的,如在GdbScript中輸入

set $ADDRESS_MASK = 0x1FFFFF

印出符號

在script中,輸入如下所示

printf "---------------------------[ CODE ]----\n"

取得 cpu register的值

如下所示,可以把某個register的值設定給變數後,印出來

define compute_regs
	set $rax = ((unsigned long)$eax & 0xFFFF)
	set $rbx = ((unsigned long)$ebx & 0xFFF

	printf "---------------------------[ REG ]----\n"
	printf "AX: %04X BX: %04X ", $rax, $rbx
	printf "\n"
end

Ref: Remote debugging of real mode code with gdb


书籍推荐