星期二, 七月 07, 2009

百望山上眺望的人(黑白记录)

星期六, 七月 04, 2009

用GDB修改可执行文件的代码和变量(gdb)

用GDB修改可执行文件的代码和变量
teawater@gmail.com

直接修改可执行文件中的代码和变量好像也没有什么比较好的工具,今天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函数直接返回了

KSCOPE 1.6.2编译要领(Linux)

刚刚1.6.2编译安装使用OK了 建议使用没有kscope的K粉丝 自己下载kscope 1.6.2编译

configure之前把KATE以及KDE的开发包都装上 可以根据config.log中提示信息查询需要安装的包 安装

其中 configure的时候建议 增加 --without-arts
因为arts哪里都找不到

到编译的最后一步 libtool 会失败 报找不到 kateinterfaces 不用担心 直接到相应目录 在命令行中粘贴上去掉其中的
-lkateinterfaces
换成 /usr/lib/libkatepartinterfaces.la
这行libtool就会通过 接着 make install 一切OK

kscope 1.9.4使用感觉(linux)

新买的本装的UBUNTU 9.0.4 amd64 找KSCOPE发现没有 强制找了个老版本的KSCOPE装上又一堆KATE的库找不到 候麻烦的最终放弃

巧合在 http://zhubangbing.blog.163.com/blog/static/52609270200941915459486/
介绍 在 https://launchpad.net/~nizamov-shawkat/+archive/ppa/ 有人编译好的
KSCOPE 1.9.4 for 9.0.4 于是下一个装上

发现1.9.4 跟1.6相比变化真是非常大 左边的当前文件项目表 找不到了 右边的 文件列表也没影了
唯一的优点是搜索结果被加强了 以前只能保留前一个搜索结果 现在好像所有都能保存 而且增加了可以在当前搜索结果中上下切换的热键
KATE被完全从KSCOPE中摘除掉了 所以KATE的各种强悍功能不复存在

我还曾经试图自己编译1.9.4 发现其使用的config是qmake 而且依赖写的不怎么样 qmake 完再make还是失败 也不告诉你需要装什么

总体来说 1.9.4算是一个实验性但是很不成熟的版本

星期三, 七月 01, 2009

雨中的三轮车(黑白记录)