当前位置:首页 » 网页前端 » gdb脚本
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

gdb脚本

发布时间: 2022-03-05 08:39:43

❶ 怎样用gdb调试一个由脚本文件启动的程序

我用makefile写了个编译程序,因为makefile自动搜索源文件路径,所以在写这个makefile文件时,我的每个源文件 只有文件名,而没附带路径名,说白了,我编译完成后,我的.h 文件在 /SE/include中,.cpp文件在 /SE/src中, .o文件和 可执行文件在/...

❷ 如何写gdb命令脚本

首先般命令其实都程序
装系统路径程序程序名都作命令直接调用
具体哪些路径系统路径Linux用$PATH$命令查看(通路径用冒号隔)
gdb其实gcc/g++编译器附带调试器
虽现主流Linux发行版都自带gcc编译器附带gdb调试器
毕竟算Linux系统内部组件所自能算做Linux自带命令

❸ 怎样用GDB调试一个由脚本文件启动的程序

使用GDB
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
$gcc -g -Wall hello.c -o hello
$g++ -g -Wall hello.cpp -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
启动GDB的方法有以下几种:
gdb <program>
program也就是你的执行文件,一般在当前目录下。
gdb <program> core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core mp后产生的文件。
gdb <program> <PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
以上三种都是进入gdb环境和加载被调试程序同时进行的。也可以先进入gdb环境,在加载被调试程序,方法如下:
*在终端输入:gdb
*在gdb环境中:file <program>
这两步等价于:gdb <program>
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:
-symbols <file>
-s <file>
从指定文件中读取符号表。
-se file
从指定文件中读取符号表信息,并把他用在可执行文件中。
-core <file>
-c <file>
调试时core mp的core文件。
-directory <directory>
-d <directory>
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。

❹ gcc里怎么用gdb

这位朋友我看是有点误解了makefile的做用。makefile
是一个脚本,由他来控制编译出的程序的版本。当你改写了原文件后,通过makefile
来检查依赖关系,来生成最终的文件。比如一个程序叫a
他的源码叫a.c
a.c
又用到头文件a.h
,a.h是1.h和2.h生成的如果你改写了1.h,通过编写makefile文件。make时会调用makefile来依此按依赖关系生成最后的a所以说编译时程序并不知道生成a都用到什么。怎么可能自己生成呢。makefile是要你自己编写的,来告诉make来如何编译。make工具就相当于一个脚本。
gcc里怎么用gdb?这里有视频教程可以看下
http://www.alisoho.com

❺ linux 怎么打开gdb的layout

gdb是用来调试二进制程序的,不能调试python脚本。 python自带pdb模块,可以用来调试自己的脚本。 使用python -m pdb ,交互方式,命令与gdb类似。

❻ shell脚本中怎么判断发行版

A:本脚本运行的机器,Linux
B:待安装JDK的机器, Linux
首先在脚本运行的机器A上确定可以ssh无密码登录到待安装jdk的机器B上,然后就可以在A上运行本脚本:
复制代码 代码如下:

$ ./install-jdk.sh B的IP
or:
复制代码 代码如下:

$ ./install-jdk.sh "B的IP" "JDK的URI"
就可以在机器B上安装JDK。jdk使用的tar包需要用户自己设定DEFAULT_JDK_SRC=?,保证可以wget得到即可。下面是全部脚本内容:
复制代码 代码如下:

#!/bin/bash
#
# @file
# install-jdk.sh
#
# @date
# 2013-12-19
#
# @author
# cheungmine
#
# @version
# 0.0.1pre
#
# @usage:
# ./install-jdk.sh 192.168.122.206
#
################################################################################
. common.sh

#***********************************************************
# install_jdk
# install jdk on machine: /usr/local/lib
#
# Parameters:
# machine - root@ipaddr
# jdkUri - uri for fetching tarball
#
# Example:
#
# install_jdk [email protected] ftp://vm-ftp/pub/tarball/jdk-7u67-linux-x64.tar.gz
#
#***********************************************************
. common.sh

# YOU MIGHT CHANGE BELOW LINE TO GET YOUR JDK TARBALL:
DEFAULT_JDK_SRC="ftp://vm-ftp/pub/tarball/jdk-7u67-linux-x64.tar.gz"

# DO NOT CHANGE BELOW TWO LINES:
INSTALL_DIR="/usr/local/lib/java"
LOCAL_DIR="./.tmp"

function install_jdk() {
echo -e "<INFO> install jdk on machine: $1"

local DEST_LOGIN=$1
local JDK_URI=$2
local TAR=$(basename $JDK_URI)

echo -e "<INFO> jdk: '$JDK_URI'"

wget -c $JDK_URI -P $LOCAL_DIR -O $LOCAL_DIR/$TAR

$(is_empty_dir "$LOCAL_DIR/jdk_untar")
local ret=$?

case $ret in
$DIR_NOT_EXISTED)
mkdir -p $LOCAL_DIR/jdk_untar
;;
$DIR_IS_EMPTY)
;;
$DIR_NOT_EMPTY)
rm -rf $LOCAL_DIR/jdk_untar/*
;;
*)
exit $ERR_FATAL_ERROR
;;
esac

# untar to jdk_untar
tar -zxf $LOCAL_DIR/$TAR -C $LOCAL_DIR/jdk_untar

$(is_empty_dir "$LOCAL_DIR/jdk_untar")
local ret=$?

if [ "$ret" -eq "$DIR_NOT_EMPTY" ]; then
local jdk_home=`ls $LOCAL_DIR/jdk_untar 2>/dev/null`
echo $jdk_home
else
exit $ERR_FATAL_ERROR
fi

echo -e "<INFO> create folder on: $DEST_LOGIN:$INSTALL_DIR"
local ret=`ssh $DEST_LOGIN "mkdir $INSTALL_DIR"`

echo -e "<INFO> $jdk_home/ to: $DEST_LOGIN:$INSTALL_DIR/"
local ret=`scp -r $LOCAL_DIR/jdk_untar/$jdk_home $DEST_LOGIN:$INSTALL_DIR`

# remove local tar
rm -rf $LOCAL_DIR/jdk_untar

local DEST_JAVA_HOME=$INSTALL_DIR/$jdk_home

echo -e "<TODO> remove old settings for install_jdk in /etc/profile"

echo -e "<INFO> set /etc/profile: JAVA_HOME=$DEST_JAVA_HOME"
local ret=`ssh $DEST_LOGIN "echo '' >> /etc/profile"`
local ret=`ssh $DEST_LOGIN "echo '#!{{[email protected]==>' >> /etc/profile"`

local ret=`ssh $DEST_LOGIN "echo 'export JAVA_HOME=$DEST_JAVA_HOME' >> /etc/profile"`
local ret=`ssh $DEST_LOGIN "echo 'export CLASSPATH=.:\\$JAVA_HOME/lib/tools.jar:\\$JAVA_HOME/lib/dt.jar' >> /etc/profile"`
local ret=`ssh $DEST_LOGIN "echo 'export PATH=\\$JAVA_HOME/bin:\\$JAVA_HOME/jre/bin:\\$PATH' >> /etc/profile"`

local ret=`ssh $DEST_LOGIN "echo '#!<[email protected]}}'>> /etc/profile"`

local ret=`ssh $DEST_LOGIN ". /etc/profile"`
}

function uninstall_jdk() {
echo -e "<TODO> uninstall jdk from: $1"
}

#=======================================================================
# ---- main() ----
if [ -n $1 ]; then
DEST_IP=$1
JDK_SRC=$DEFAULT_JDK_SRC

if [ $# == 2 ]; then
JDK_SRC=$2
fi

echo -e "<INFO> install jdk on '$DEST_IP', jdk: '$JDK_SRC'"

install_jdk "root@$DEST_IP" "$JDK_SRC"
fi

❼ cisco ios rootkit工具该怎么写

一个人如何能相对简单地利用自己的固件来创建一个rootkit工具。
HT文本编辑器:
apt-get install ht hexedit
Dynamips + GDB Stub: git clone https://github.com/Groundworkstech/dynamips-gdb-mod

程序员计算器:
http://pcalc.sourceforge.net/
Binutils / Essentials: apt-get install gcc gdb build-essential binutils \ binutils-powerpc-linux-gnu binutils-multiarch

其他依赖项:
apt-get install libpcap-dev uml-utilities libelf-dev libelf1
QEMU: apt-get install qemu qemu-common qemuctl qemu-system \qemu-system-mips qemu-system-misc qemu-system-ppc qemu-system-x86

Debian PowerPC 镜像:
wget https://people.debian.org/~aurel32/qemu/powerpc/debian_wheezy_powerpc_standard.qcow2

QEME还需要下面的额外设置:
# cd /usr/share/qemu/
# mkdir ../openbios/
# mkdir ../slof/
# mkdir ../openhackware/ # cd ../openbios/
# wget https://github.com/qemu/qemu/raw/master/pc-bios/openbios-ppc
# wget https://github.com/qemu/qemu/raw/master/pc-bios/openbios-sparc32 # wget https://github.com/qemu/qemu/raw/master/pc-bios/openbios-sparc64
# cd ../openhackware/
# wget https://github.com/qemu/qemu/raw/master/pc-bios/ppc_rom.bin # cd ../slof/
# wget https://github.com/qemu/qemu/raw/master/pc-bios/slof.bin
# wget https://github.com/qemu/qemu/raw/master/pc-bios/spapr-rtas.bin

QEME客户机应如下设置:
qemu-host# qemu-system-ppc -m 768 -hda debian_wheezy_powerpc_standard.qcow2
qemu-guest# apt-get update
qemu-guest# apt-get install openssh-server gcc gdb build-essential binutils-multiarch binutils qemu-guest# vi /etc/ssh/sshd_config
qemu-guest# GatewayPorts yes
qemu-guest# /etc/init.d/ssh restart
qemu-guest# ssh -R 22222:localhost:22 <you>@<qemu-host>

把你的开发设备SSH到端口22222,并作为根用户登录到QEMU客户机。这样在编辑文件,进行复制和粘贴操作时会更容易,因为不需要切换到QEMU窗口上。
Dynamips + GDB Stub需要进行编译。接下来的操作也需要在amd64机器上进行:更改配置以满足开发设备的要求。
# git clone https://github.com/Groundworkstech/dynamips-gdb-mod Cloning into 'dynamips-gdb-mod'...
remote: Counting objects: 290, done.
remote: Total 290 (delta 0), reused 0 (delta 0), pack-reused 290 Receiving objects: 100% (290/290), 631.30 KiB | 0 bytes/s, done. Resolving deltas: 100% (73/73), done.
Checking connectivity... done.
# cd dynamips-gdb-mod/src
# DYNAMIPS_ARCH=amd64 make
Linking rom2c
cc: error: /usr/lib/libelf.a: No such file or directory make: *** [rom2c] Error 1
# updatedb
# locate libelf.a /usr/lib/x86_64-linux-gnu/libelf.a
# cat Makefile |grep "/usr/lib/libelf.a"
LIBS=-L/usr/lib -L. -ldl /usr/lib/libelf.a $(PTHREAD_LIBS)
LIBS=-L. -ldl /usr/lib/libelf.a -lpthread
# cat Makefile | sed -e 's#/usr/lib/libelf.a#/usr/lib/x86_64-linux-gnu/libelf.a#g' >Makefile.1
# mv Makefile Makefile.bak
# mv Makefile.1 Makefile
# DYNAMIPS_ARCH=amd64 make

接下来,我们需要使用一个简单的脚本来计算二进制的校验和,因为随后我们还会用到这些二进制。把校验和保存到chksum.pl文件中,并放到开发目录下。通过chmod +x把这个文件转换成一个可执行文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

#!/usr/bin/perl
sub checksum {
my $file = $_[0];
open(F, "< $file") or die "Unable to open $file ";
print "\n[!] Calculating the checksum for file $file\n\n";
binmode(F);
my $len = (stat($file))[7];
my $words = $len / 4;
print "[*] Bytes: \t$len\n";
print "[*] Words: \t$words\n";
printf "[*] Hex: \t0x%08lx\n",$len;
my $cs = 0;
my ($rsize, $buff, @wordbuf);
for(;$words; $words -= $rsize) {
$rsize = $words < 16384 ? $words : 16384;
read F, $buff, 4*$rsize or die "Can't read file $file : $!\n";
@wordbuf = unpack "N*",$buff;
foreach (@wordbuf) {
$cs += $_;
$cs = ($cs + 1) % (0x10000 * 0x10000) if $cs > 0xffffffff;
}
}
printf "[*] Checksum: \t0x%lx\n\n",$cs;
return (sprintf("%lx", $cs));
close(F);
}
if ($#ARGV + 1 != 1) {
print "\nUsage: ./chksum.pl <file>\n\n";
exit;
}
checksum($ARGV[0]);

另外还有几个资源也是必需的,但是我们无法在文章中给出链接。不过,你应该能找到这些资源,并且在设置上也不会遇到任何问题。接着,你需要把这些资源安装到用于开发的虚拟机上,然后创建一个Windows7客户机。一旦你完成了设置,就登录到你的Windows虚拟机,并安装“IDA Pro 6.6 + Hex-Rays Decompiler”或其他的任意版本——确保你安装的是完整版,能支持x86/x64以外的架构,因为我们主要使用的是PowerPC汇编语言。请不要破解IDA软件,IDA是一款非常好用的程序,值的我们的购买。
最后,你需要一个IOS镜像。我们使用的镜像来自我们购买的Cisco 2600,文件名是 “c2600-bino3s3-mz.123-22.bin”。我们强烈建议你登录你的Cisco账户,然后下载这一个镜像-使用同一个镜像能保证你完全根据我们的要求进行操作,并且偏移、校验和、长度等也都是一致的。众所周知,在一些社区中下载到的一些所谓“仅供学习”的IOS镜像,以及具有更多功能的IOS镜像,实际上都植入了木马。除了通过哈希来验证,我们还建议你使用FX的‘Cisco Incident Response’来验证你的IOS镜像。
对于我们的开发设备,提示是 "[ 3812149161f@decay ]# “;QEMU请求,提示是"[debian@ppc ]#。
0x03 开发

❽ 如何写gdb命令脚本

GDB是一个强大的命令行调试工具。虽然X Window提供了GDB的图形版DDD,但是我仍然更钟爱在命令行模式下使用GDB。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。
于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。

1 GDB概述
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

一般来说,GDB主要帮忙你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。

❾ 如何使用gdb调试android程序

首先到gdb的官方下载gdb的源代码
下载后解压源代码,在终端下使用命令安装编译gdb所需的软件包。
sudo apt-get install bison flex libncurses5-dev texinfo gawk libtool
编译gdb时不要使用自带的多线程库thread_db.c,应使用Android NDK中的修改版本,位于Android NDk 的sources/android/libthread_db/gdb-7.3.x/libthread_db.c,为了避免兼容性的问题,将其编译成静态库,配置gdb编译脚本如下
export TOOLCHAIN_PATH=/home/android/tools/android/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
export PATH=$TOOLCHAIN_PATH/bin:$PATH
export SYSROOT=/home/android/tools/android/android-ndk-r8b/platforms/android-14/arch-arm
export TOOLCHAIN_PREFIX=$TOOLCHAIN_PATH/bin/arm-linux-androideabi
export CC="$TOOLCHAIN_PREFIX-gcc --sysroot=$SYSROOT"
export AR="$TOOLCHAIN_PREFIX-ar"
$CC -o $SYSROOT/usr/lib/libthread_db.o -c /home/android/tools/android/android-nkd-r8b/sources/android/libthread_db/gdb-7.3.x/libthread_db.c
$AR -r $SYSROOT/usr/lib/ibthread_db.a $SYSROOT/usr/lib/libthread_db.o
#配置gdb编译脚本
./configure --target=arm-elf-linux --enable-static --disable-stripping -with-libthread-db=$SYSROOT/usr/lib/libthread_db.a
"--target=arm-elf-linux" 指定了被调试的程序运行的系统平台,“--enable-static”指定了静态编译,“--disable-stripping”指定禁止剥离符号信息,“--with-libthread-db”手动指定多线程库文件,在终端上依次执行以上命令会声称makefile 我呢间,接下来还需要手动修改gdb-7.3.1/gdb目录下的remote.c文件,找到process_G_packet()函数的代码,将一下的内容
if(but_len>2*rsa->sizeof_g_packet)
error(_("Remote 'g' packet reply is too long:%s"),rs->but);
修改为
if(but_len>2*rsa->sizeof_g_packet)

rsa->sizeof_g_packet=buf_len;
for(i=0;i<gdbarch_num_regs (gdbarch);i++)
{
if(rsa->regs[i].pnum==-1)
continue;
if(rya->regs[i].offset>=rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet=0;
else
rsa->regs[i].in_g_packet=1;
}

修改保存后,在终端上执行make编译gdb
单独使用gdb还不能调试android原生程序 还需要编译gdbserver,这个的源代码在 gdb-7.3.1/gdb/gdbserver 目录下,在终端下执行一下命令配置gdbserver编译脚本
export CC="$TOOLCHAIN_PREFIX-gcc --sysroot=$SYSROOT"
export CFLAGS="-02 -D__ANDROID__ -DANDROID -DSTDC_HEADERS -D__GLIBC__"
./configure --host=arm-linux-androideabi --with-libthread-db=$SYSROOT/usr/lib/libthread_db.a
命令执行完成后会在gdb-7.3.1/gdb/gdbserver 目录下声称makefile文件,打开该文件找到 WERROR_CFLAGS的定义,将它的值清空,然后打开config.h文件,将“/*#undef HAVE_LWPID_T */”改为“#define HAVE_LWPID_T 1”,修改后保存,然后在终端下执行make编译gdbserver.
下面介绍如何调试,首先准备一个android app,这个用一个名为testapp的程序,在终端下执行以下两个命令将testapp与gdbserver复制到android石碑的/data/local/tmp目录
adb push test app /data/local/tmp
dab push gdbserver /data/local/tmp
执行以下两行命令给两个文件加上可执行权限
adb shell chmod 755 /data/local/tmp/testapp
adb shell chnod 755 /data/local/tmp/gdbserver
接着执行 “adb shell /data/local/tmp/gdbserver:12345 /data/local/tmp/testapp”,启动dgb调试服务器,会输入如下信息
Process /data/local/tmp/testapp create; pid=292
Listening on port 12345
程序其实调试服务器已经启动,并且监听了12345号端口,打开另一个终端窗口执行以下命令开启端口转发
dab forward tcp:12345 tcp:12345
在pc 端的终端下执行./gdb启动gdb调试器,然后执行以下命令连接gdb调试服务器
target remote localhost:12345
命令执行后会输出
(gdb) target remote localhost:12345
Remote debugging using localhost:12345
warning: Can not parse XML target description; XML support was disabled at compile time
0xb000100 in ?? ()
(gdb)
使用 ida pro 或者objmp 找到程序main()函数地址,例如 0x8580,在gdb Shell 环境下执行命令“b *0x8580” 在main()函数的第一行上设置断点,输出信息如下
(gdb) b *0x8580
Breakpoint 1 at 0x8580
(gdb)
断点设置完成后输入continue 让程序继续执行,输出信息如下
(gdb)continue
Continuing.
Program received signal SIGSEGV,Segmentation fault.
0x00008584 in ??()
执行"set disassemble-next on "设置反汇编显示代码,然后执行“dosas 0x8580,+20”显示0x8580以下20各字符的反汇编代码,输出信息如下
(gdb)disas 0x8580,+20
Dump of assembler code from 0x8580 to 0x8594
0x00008580:ldr r0,[pc,#16] ;0x8598
=> 0x00008584:push {r4,lr}
0x00008588:add r0,pc,r0
0x0000858c:bl 0x84f8
0x00008590:mov r0,#0
End of assembler mp.
(gdb)
接下来可以输入si或者ni 命令来单步调试了