linux中分析动态库so常用命令
1、strings命令
可以从文件中提取可打印字符(字母、数字、字符、标点符号、空格等)。可以帮助我们快速查找和分析二进制文件中的文本信息。
strings命令可以从二进制文件中提取所有可打印的字符串,包括文本、注释、函数名等。
1.1、 常用参数
-a 扫描整个文件,而不只是扫描目标文件初始化和装载段
-f 显示字符串前,先显示文件名
-t 输出字符的位置,基于八进制,十进制或十六进制
-d 只打印文件中初始化的、加载的数据节中的字符串。这可能会减少输出中的垃圾数量,但也会将字符串程序暴露给用于扫描和加载部分的BFD库中可能存在的任何安全缺陷。
1.2、有用的实例
1)可以在代码中定义版本,多版本时用来判断是否有变动
代码:
查询:
2)查看glibc支持(向下兼容)的版本
3)查看生成so的GCC版本
2. file命令
用于检测文件类型的命令,可以根据文件的二进制数据来确定其类型
2.1、 常用参数
-b:仅显示文件类型,不显示文件名;
-i:显示MIME类型;
-z:对压缩文件也进行检测。
-c:详细显示指令执行过程,便于排错或分析程序执行的情形;
-f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称;
-L:直接显示符号链接所指向的文件类别;
-m<魔法数字文件>:指定魔法数字文件;
-v:显示版本信息;
-s: 查询(块/字符设备)文件信息
2.2、实例
1)查看so ELF类,支持操作系统
上图,显示64位,windows库。可以用以判断so系统架构和环境信息是否匹配。
3、ldd命令
用来打印或者查看程序运行所需的共享库,常用来解决程序因缺少某个库文件而不能运行的一些问题
3.1、 常用参数
--help 获取指令帮助信息;
--version 打印指令版本号;
-d,--data-relocs 执行重定位和报告任何丢失的对象;
-r,--function-relocs 执行数据对象和函数的重定位,并且报告任何丢失的对象和函数;
-u, --unused 打印未使用的直接依赖;
-v, --verbose 详细信息模式,打印所有相关信息;
3.2、实例
1)查看动态库so或可执行文件依赖库情况
当缺少依赖时 显示 not found
4、nm命令
列出 .o, .a, .so 中的符号信息(不是直接作用于 main.c、test.h、test.c 等文件),包括诸如符号的值、符号类型以及符号名称等。所谓符号,通常指定义出的函数、全局变量等信息。
4.1、 常用参数
-A 在每个符号信息的前面打印所在对象文件名称;
-C 输出demangle过了的符号名称;
-D 打印动态符号;
-l 使用对象文件中的调试信息打印出所在源文件及行号;
-n 按照地址/符号值来排序;
-u 打印出那些未定义的符号。
常见符号类型:
A 该符号的值在今后的链接中将不再改变;
B 该符号放在BSS段中,通常是那些未初始化的全局变量;
D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
T 该符号放在代码段中,通常是那些全局非静态函数;
U 该符号未定义过,需要自其他对象文件中链接进来;
W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。
4.2、示例
通常用于加载第三方so等库文件时,报错函数未定义时,可通过该方式搜索so中是否定义某函数
Nm –A hello.so | grep “T main”
5、objdump命令
objdump命令是Linux下的反汇编目标文件或者可执行文件的命令。
5.1、 常用参数
-f 显示文件头信息
-d 反汇编文件中需要执行指令的那些section
-D 与-d类似,但反汇编文件中中的所有section
-h 显示文件中的Section Header信息
-x 显示文件的全部Header信息
-s 除了显示文件的全部Header信息,还显示他们对应的十六进制文件代码
5.2、 示例
objdump -f hello.so
显示hello.so的文件头信息
objdump -d hello.so
反汇编hello.so中的需要执行指令的那些section
objdump -D hello.so
与-d类似,但反汇编hello.so中的所有section
objdump -h hello.so
显示hello.so的Section Header信息
objdump -x hello.so
显示hello.so的全部Header信息
objdump -s hello.so
除了显示hello.so的全部Header信息,还显示他们对应的十六进制文件代码