在gdb中,我可以使用call
来运行函数,但是如果我想运行一些额外的程序集呢?
答案 0 :(得分:5)
在GCC 5 (1)之前,我不知道运行任意机器代码的方法,除非您实际将机器代码输入内存然后运行它。
如果你想在内存中运行已经的代码,你可以将指令指针设置为start,最后是断点,然后去。然后,在断点之后,将指令指针更改回其原始值。
但实际上我无法看到这个用例。这并不意味着不是,只要通过运行代码可以做任何事情,您也可以通过直接修改寄存器,标志,内存等来实现。
例如,命令:
info registers
将在以下情况下转储寄存器的当前值:
set $eax = 42
会将eax
注册号更改为42
。
您还可以通过以下方式更改内存:
set *((char*)0xb7ffeca0) = 4
这会将单个字节写入内存位置0xb7ffeca0
,您也可以使用相同的方法存储更广泛的数据类型。
(1) GCC 5允许您使用compile code
命令编译和执行任意代码,如文档here所述。
答案 1 :(得分:0)
compile code
命令
大约7.9引入,它允许代码编译和注入,文档:https://sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html
示例:
int main(void) {
int i = 0;
printf("%d\n", i);
return 0;
}
然后在GDB中:
start
next
compile code int j = 1; i = j; asm("nop");
continue
节目输出:
1
为此,您需要最近的GDB和GCC 5.x.在GDB 7.9.1,GCC 5.1上测试,用:
export LD_LIBRARY_PATH="/path/to/gcc/install/lib64:$LD_LIBRARY_PATH"
以便libcc1.so
可见:这是最近的GCC组件,它将C API公开给cc1
编译器。
有一些结构不像我预期的那样有效return
,所以我问过为什么:In the GDB compile code command, what language constructs behave exactly as if they were present in the original source?