gdb格式文件怎么修改里边数据

gdb格式文件怎么修改里边数据,第1张

直接修改可执行文件中的代码和变量好像也没有什么比较好的工具,今天leviathan问我用“set write on”相关的问题,我才发现GDB就是可以很方便完成这个工作的工具,下面我向大家介绍一下使用方法。

另,在GDB文档中介绍这个方法也能修改CORE文件的内容,但即使我读了这块的代码,还是对修改CORE文件毫无思路也没成功过,所以本文就不介绍对CORE文件的修改了。

在一般情况下GDB是以只读方式打开可执行文件的,如果需要改变可执行文件,需要在读入文件以前,用GDB启动参数“--write”或者命令“set write on”用可读写方式打开可执行文件。如果文件已经打开了可执行文件,就需要使用exec-file重新以读写方式打开可执行文件,注意如果你还没打开可执行文件,就一定要使用file命令读入,因为exec-file不会重新读入符号信息。

还有要注意的是,因为修改只能修改section的内容,所以能修改的变量只能是非0的全局变量,内容是O的变量会被放入bss。

下面举例修改变量内容:

cat 1.c

#include <stdio.h>

int a = 1

int

main(int argc,char *argv[],char *envp[])

{

printf ("%d\n", a)

return 0

}

gcc -g 1.c

./a.out

1#注意这个输出

gdb

GNU gdb 6.8-debian

Copyright (C) 2008 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-linux-gnu".

(gdb) set write on#打开功能

(gdb) file ./a.out #打开文件

Reading symbols from /home/teawater/gdb/a.out...done.

(gdb) p a = 100#修改变量的文件中的值

$1 = 100

./a.out

100#注意修改后的输出

下面举例修改代码内容:

cat 1.c

#include <stdio.h>

void

cool (void)

{

printf ("Call function cool.\n")

}

int

main(int argc,char *argv[],char *envp[])

{

cool ()

return 0

}

gcc -g 1.c

./a.out

Call function cool.#注意现在有输出

gdb --write ./a.out #使用--write直接打开可写功能

GNU gdb 6.8-debian

Copyright (C) 2008 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-linux-gnu"...

(gdb) disas cool

Dump of assembler code for function cool:

0x000000000040050c <cool+0>:push %rbp#注意改之前这条指令

0x000000000040050d <cool+1>:mov%rsp,%rbp

0x0000000000400510 <cool+4>:mov$0x40062c,%edi

0x0000000000400515 <cool+9>:callq 0x4003f8 <puts@plt>

0x000000000040051a <cool+14>:leaveq

0x000000000040051b <cool+15>:retq

End of assembler dump.

(gdb) set *(unsigned char *)(0x000000000040050c) = 0xc3#修改指令

(gdb) disas cool

Dump of assembler code for function cool:

0x000000000040050c <cool+0>:retq #改之后这指令发生了变化

0x000000000040050d <cool+1>:mov%rsp,%rbp

0x0000000000400510 <cool+4>:mov$0x40062c,%edi

0x0000000000400515 <cool+9>:callq 0x4003f8 <puts@plt>

0x000000000040051a <cool+14>:leaveq

0x000000000040051b <cool+15>:retq

End of assembler dump.

./a.out#现在没有输出了 因为cool函数直接返回了

批量把gdb数据批量转换成mdb格式是在arctoolbox里面新建MDB数据库。

1、在arctoolbox里面新建MDB数据库,

2、从gdb库把表拖拽或复制到mdb库中,mdb库不支持要素集只支持表。

1、在arctoolbox里面新建MDB,,再把GDB里面的数据集拖到MDB里面就OK了2、在arctoolbox里面把GDB数据转为SHP格式,,再用FME软件把SHP文件转成MDB关于FME软件,,地学可以去FME论坛看看


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10822912.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存