binutils 工具: strings 简单分析

binutils 工具: strings 简单分析
strings 是查看二进制代码中ascii 字符串的工具,默认4个字符连在一起即为字符串。
阅读源码,可以加深一下理解,理解其工作过程:

1. 下载源码, 配置,编译。 编译的时候倒是直接有编译log 输出,不过是-g -O2 形式。
$cp Makefile Makefile.bak
先备份一下Makefile,把 -g -O2 改成 -g -O0 试试。
CFLAGS = -g -O0
CXXFLAGS = -g -O0
$touch binutils/strings.c
$make
有如下输出: 编译成功。
gcc -DHAVE_CONFIG_H -I.  -I. -I. -I../bfd -I./../bfd -I./../include -DLOCALEDIR="\"/usr/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Werror -g -O0 -MT strings.o -MD -MP -MF .deps/strings.Tpo -c -o strings.o strings.c
mv -f .deps/strings.Tpo .deps/strings.P
/bin/sh ./libtool --tag=CC   --mode=link gcc -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Werror -g -O0  -static-libstdc++ -static-libgcc  -o strings strings.o bucomm.o version.o filemode.o ../bfd/libbfd.la ../libiberty/libiberty.a  -lz

阅读源码,也并不是那么简单, 下面看看关键部分。

显然,不特别指明,是仅导出obj 数据部分字符串,此处的数据部分
#define DATA_FLAGS (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS)
即有ALLOC 属性,可加载,有内容。

非obj文件或特别指明,导出整个文件字符串,
判断几个ascii字符为字符串? 默认为4, 可以由命令行指定。
具体是怎样实现的呢?

  #0  strings_a_section (abfd=0x720f40, sect=0x722130, arg=0x7fffffffdb20) at strings.c:313
  #1  0x00000000004112bb in bfd_map_over_sections (abfd=0x720f40, operation=0x4029fc <strings_a_section>, user_storage=0x7fffffffdb20) at section.c:1330
  #2  0x0000000000402c00 in strings_object_file (file=0x7fffffffe16b "hello") at strings.c:385
  #3  0x0000000000402ce2 in strings_file (file=0x7fffffffe16b "hello") at strings.c:419

strings_file 调用 strings_object_file,
strings_object_file 调用 bfd_map_over_sections, 传递给一个描述符, 一个函数指针,一个文件特性指针.

bfd_map_over_sections 函数, 从描述符可以找到每一个sect, 依次送给函数做处理就可以了。
----------------------------------------
strings_a_section: 处理一个section.
----------------------------------------
1. 调用 (bfd_get_section_contents (abfd, sect, mem, (file_ptr) 0, sectsize))
获取section 内容, 到 mem 中, (file_ptr) 0, 指的是offset.
即先要seek 到文件位置, 再读出内容。
 bfd_seek (abfd, section->filepos + offset, SEEK_SET)
 bfd_bread (location, count, abfd)

可见关键还是abfd 表述符,它是把一个section映射到内存的handle。
readelf -S 可以看到每个节信息, flags 带A 为有数据属性.
.interp, .dynsym, .dynstr .data .text 等都有数据属性。
.debug_info, .symtab, .strtab 都没有数据属性。

strings.com 是强大的纯DOS环境 下的文本处理工具 STRINGS常用方法: 1、把文本文件 LIST.TXT 包含的行数赋值给变量 LN STRINGS LN=LINESIZE LIST.TXT 2、把文本文件 LIST.TXT 的大小传递给变量FS STRINGS FS=FILESIZE LIST.TXT 3、读取文本文件 LIST.TXT 的第5行内容并赋值给变31333137量 LN STRINGS LN=READ LIST.TXT,5 4、把变量 N 在原有基础上+1 和 -1 STRINGS N=ADD %N%,1 STRINGS N=SUB %N%,1 5、把字符串 ABCDEFG 中第四个字符以及后面共3个字符传递给变量 LX (DEF) STRINGS LX=MID ABCDEFG,4,3 6、查找字符串 ABCDEFG 中D所在的位置并赋值给变量DX,如果没找到DX=0 STRINGS DX=FIND ABCDEFG,D 7、找出字符串 ABCD EFG HIJ KLMN 中第二个单词并赋值给变量L2 STRINGS L2=PARSE ABCD EFG HIJ KLMN ,2 应用举例:逐一显示文件 LIST.TXT 各行内容 @ECHO OFF REM 读取LIST.TXT大小如果是0就转入 ERROR段 STRINGS FS=FILESIZE LIST.TXT IF %FS%*==0* GOTO ERROR REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT各行内容。 STRINGS L=LINESIZE LIST.TXT STRINGS L=ADD %L%,1 SET N=0 :LOOP STRINGS N=ADD %N%,1 STRINGS LX=READ LIST.TXT,%N% ECHO %LX% IF %N%*==%L%* GOTO END GOTO LOOP :ERROR ECHO LIST.TXT IS NULL :END SET FS= SET L= SET N= SET LX= --------------------------------------------- NSET 的常用方法: 1、把某一命令的执行结果传递给变量。 A.把 DIR 命令执行结果第7行中的第2个单词传递给变量 DIRX DIR /A /S |NSET /L7 DIRX=$2 B.把当前路径传递给变量 CDX CD |NSET CDX=$0 2、获取 LIST.TXT 文件第5行第2个单词的内容并赋值给变量 L52 NSET /L5 L52=$2 <LIST.TXT 举例:显示出 LIST.TXT 文件中第二个单词是 SYSTEM 的行的内容。 @ECHO OFF REM 读取LIST.TXT大小如果是0就转入 ERROR段 STRINGS FS=FILESIZE LIST.TXT IF %FS%*==0* GOTO ERROR REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT中第二个单词是 REM SYSTEM 的行的内容,每找到一个符合条件的行,就把变量M在原有基础上+1。 STRINGS L=LINESIZE LIST.TXT STRINGS L=ADD %L%,1 SET N=0 SET M=0 :LOOP STRINGS N=ADD %N%,1 STRINGS LX=READ LIST.TXT,%N% REM STRINGS LX2=PARSE %LX%,2 NSET /L%N% LX2=$2 diskn.txt REM 如果存在DISKN2.TXT 就删除之 if exist diskn2.txt del diskn2.txt >nul REM 获取DISKN.TXT文件行数并用N做计数器逐行判断,并把需要的信息传递给DISKN2.TXT REM 如果该行前两个字符是 NO 说明没有硬盘,就退出脚本 RE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值