文档开发者中心
我的

利用stab信息获取进程的所有结构体以及大小

一、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代码可以将所有的结构体信息打印出来。


-Python 代码
查看代码
01# -*- coding:gb2312 -*-
02__author__ = 'l00443657'
03import re
04f = open('temp.log') # 返回一个文件对象
05f2 = open('test.log','w+')
06line = f.readline() # 调用文件的 readline()方法
07num = 0
08sourcefile = []
09while 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()
23f.close()


——————————————————————


BY:HW-LK

点赞
收藏
回复
2
分享
举报
浏览1022 发布于2019-10-30 02:48未知归属地
全部评论
最多点赞
最新发布
最早发布

欢迎大家回帖分享

2楼回复于2019-10-30 02:50 未知归属地

如何利用stab信息获取进程的所有结构体以及大小,本文为你解答!

1楼回复于2019-10-30 02:50 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。