熟悉gdb调试:
记住以下常用命令就足够了:
ps -ax:查看当前所有进程
Gdb -p pid:附加到目标进程 相当于OD的附件
file FileName:装载指定的可执行文件进行调试。 例:file var/tmp/test 相当于OD的打开PE文件
run:运行装载后的程序
info sh:这个可以查看程序代码在内存中的偏移地址
info files 显示被调试文件的详细信息
info func 显示所有的函数名称。
Break:下断点
display/i $pc | $cpsr.t:显示要执行的下一句指令
display/i $pc display/10i $pc 显示下面10行指令 ----- ★非常有用★
delete display 删除自动显示
continue(或c):继续执行;
Nexti(或ni):单步执行一条汇编指令
step into:进入子函数 si
step over:越过子函数,但子函数会执行
step out:跳出子函数
next:单步跟踪-不进入函数
finish:运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。
Po $rN(N为数字,打印寄存器存储的对象,寄存器实际存储的是对象的地址)
Print $rN(打印寄存器中的值)
Set $rN=xxxx(给寄存器赋值)
断点查看
info break可以查看当前的断点信息,比如:
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0xb76b1650 in uploader_create_dir_config(apr_pool_t*, char*) at mod_uploader.cpp:202
breakpoint already hit 4 times
2 breakpoint keep y 0xb76b1650 in uploader_create_dir_config(apr_pool_t*, char*) at mod_uploader.cpp:202
breakpoint already hit 4 times
断点清除
clear 清除当前运行文件指定行或函数的断点。如果没有参数,clears all breakpoints in the line that the selected frame
delete 1 表示删除第一个断点 (用info break查看的 断点号)
delete 不带参数是删除所有断点
堆栈相关命令
backtrace/bt bt 用来打印栈帧指针,也可以在该命令后加上要打印的栈帧指针的个数,查看程序执行到此时,是经过哪些函数呼叫的程序,程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。每个函数及其变量都被分配了一个“帧”
,最近调用的函数在 0 号帧中(“底部”帧)
frame frame 1 用于打印指定栈帧
info reg info reg 查看寄存器使用情况
info stack info stack 查看堆栈使用情况
up/down up/down 跳到上一层/下一层函数
查看内存
格式: x /nfu <addr>
说明
x 是 examine 的缩写
n表示要显示的内存单元的个数
f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes)
举例
x /1sg $r0 // 查看r0寄存器的字符串内容
显示结果:0x2258: "www.dllhook.com"
发表评论