我想创建一个脚本/程序来修改另一个进程的内存中的值。使用 GDB,我发现我想要修改的变量位于堆上。因为这个变量是在每次程序启动时动态创建的,所以它被放置在另一个地址下。我试图在堆栈上找到指向该值的指针,但每个程序开始时指针也在另一个位置。最后,我在主循环中找到了带有断点的变量位置,并从寄存器中读取位置。
有没有更好的方法来找到对脚本有益的变量?
我想创建一个脚本/程序来修改另一个进程的内存中的值。使用 GDB,我发现我想要修改的变量位于堆上。因为这个变量是在每次程序启动时动态创建的,所以它被放置在另一个地址下。我试图在堆栈上找到指向该值的指针,但每个程序开始时指针也在另一个位置。最后,我在主循环中找到了带有断点的变量位置,并从寄存器中读取位置。
有没有更好的方法来找到对脚本有益的变量?
我会在创建变量并将其存储到其位置时立即更改变量。例如,如果一个函数调用另一个函数,另一个函数返回变量,第一个函数将它存储在某个地方,这在汇编中看起来有点像
80483e7: e8 d8 ff ff ff call 80483c4 <value>
80483ec: 8b 54 24 1c mov 0x1c(%esp),%edx
80483f0: 89 02 mov %eax,(%edx)
where0x1c(%esp)保存指向变量的指针,并且%eax是存储在那里的值。
现在,您只需要一个像这样的 gdb 输入脚本:
break *0x80483f0
run
set $eax=7
cont
和你的程序
gdb myprog < gdb.in
myprog你的程序在哪里,gdb.in是上面的脚本。
如果你真的需要在稍后改变变量,程序运行时,做同样的,但更换set $eax=7与info registers和输出重定向到一个文件中。然后,当您想要更改变量时,读取该文件,从中解析地址,并使用该地址来存储您的变量。