一、stab的简介
stab,是system tabl的缩写,也就是我们常说的符号表信息。在这里面,存储了debug的相关信息。stab信息在进程编译时,如果加了'-gstabs',则会在进程的某个位置里面存放。
stab的信息的结构体如下所示,其中n_strx,是改符号表对应的一些字符出纳描述信息,它存放的是.stabstr的索引;n_type为当前符号的类型,n_other是对符号一些其他信息的补充描述,n_desc也是补充描述字段,根据不同的type代表不同的含义,n_value与n_strx共同指明了字符串说明的信息(一个代表地址,一个代表长度)
二、获取方法
1、生成携带stab信息的进程
在进程编译时,添加上'-gstabs',注意有的产品在编译时,直接就使用objcopy剥离了debug信息,因此要在debug信息被剥离前,将stab信息拿到。
2、使用objdump信息获取stab信息,命令格式如下:
objdump --stabs ats.vcu > temp.log
注:第二个参数为进程名。
三、分析stab信息
在第二步获取的stab信息,如下图所示,其结构和第一步的介绍类似,只不过将字符串信息直接打印,更利于人机交互。
1、对于N_type中常见的一些类型,做下简单的一些介绍:
SYM 主要对应一些变量符号,或者类型符号,再根据不同的可见域,如全局或局部,其前缀有所区别。如GSYM代表全局,LSYM代表栈信息,RSYM代表寄存器信息等。
SO代表源代码的文件名字
INCL代表头文件的名字和路径
FUN代表当前符号为函数
2、stab信息对结构体信息的描述。
以下面这个例子对结构体信息进行简要说明:
源代码:
生成的stab信息如下
其中:
s11_str:符号名
T:和SYM共同说明当前符号为结构体或者枚举,tag类型,
(16,1)为类型的补充说明,可以不关注
s:代表当前类型为结构体,如果是e代表枚举
4:代表当前结构体的字节大小,也就是我们获取结构体大小的关键信息。
p:代表结构体的成员
(4,41):代表结构体成员的类型信息。
四、使用stab信息获取进程的所有结构体大小信息
1、获取进程的stab信息:
objdump --stab ats.cdb >temp.log
2、使用如下的python代码可以将所有的结构体信息打印出来。
01 | # -*- coding:gb2312 -*- |
02 | __author__ = 'l00443657' |
03 | import re |
04 | f = open('temp.log') # 返回一个文件对象 |
05 | f2 = open('test.log','w+') |
06 | line = f.readline() # 调用文件的 readline()方法 |
07 | num = 0 |
08 | sourcefile = [] |
09 | while line: |
10 | #print line, # 后面跟 ',' 将忽略换行符 |
11 | # print(line, end = '') # 在 Python 3中使用 |
12 | for word in line.split(' '): |
13 | ind1 = word.find(':T') |
14 | ind2 = word.find('=s') |
15 | if ind1 > 0 and ind2 > 0 : |
16 | num_str1 = re.findall(r'=s\d+',word[ind2:]) |
17 | #取第一个struct,有可能出现stuct嵌套的情况 |
18 | num = num_str1[0][2:] |
19 | f2.writelines(word[0:ind1]+' '+num) |
20 | f2.writelines('\n') |
21 | #print word[0:ind1]+' '+num |
22 | line = f.readline() |
23 | f.close() |
——————————————————————
BY:HW-LK





































苏公安网备 32011402010933号