[Python]根据地址从maps文件中找相应的库名
/proc/PID/maps提供了进程的memory layout,下面脚本根据给定地址找出相应的库名:
#!/usr/bin/python
from __future__ import print_function
import sys
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import bisect
import re
import lp_util VERBOSE = False def process(line, mapset):
pattern = r'([0-9a-f]+)-([0-9a-f]+) ([rwxps-]+) ([0-9a-f]+) ([0-9a-f:]+) ([0-9]+)\s+(\S*)'
match_obj = re.match(pattern, line)
if match_obj is not None:
one_mapping = match_obj.group(0)
addr_start = int(match_obj.group(1), 16)
addr_end = int(match_obj.group(2), 16)
permission = match_obj.group(3)
offset = match_obj.group(4)
device = match_obj.group(5)
inode = match_obj.group(6)
pathname = match_obj.group(7)
print(hex(addr_start), hex(addr_end), permission, offset, device, inode, pathname)
mapset.append({'addr_start':addr_start, 'addr_end':addr_end, 'permission':permission, 'offset':offset, 'device':device, 'inode':inode, 'pathname':pathname})
else:
print("Invalid maps") def usage():
print("usage:", sys.argv[0], "maps_file") def find_map(mapset, keys, addr):
addr = int(addr, 16)
index = bisect.bisect_right(keys, addr)
if VERBOSE:
print("addr = ", addr)
print("index = ", index)
print(keys) if index == 0:
return None
if addr < mapset[index - 1]['addr_end']:
return mapset[index - 1]
else:
return None def main():
argc = len(sys.argv)
if argc != 2:
usage()
sys.exit() try:
in_file = open(sys.argv[1], "r")
except:
sys.exit("Error opening file ", sys.argv[1]) mapset = []
while True:
line = in_file.readline()
if not line:
break
process(line, mapset)
in_file.close() print("Parsing done, item num = ", len(mapset)) mapset.sort(key = lambda r:r['addr_start'])
keys = [r['addr_start'] for r in mapset] while True:
addr = raw_input("Please enter an address:")
if not lp_util.addr_is_valid(addr):
print("Invalid input")
continue map_item = find_map(mapset, keys, addr)
if map_item is not None:
print("lib name = ", map_item['pathname'])
else:
print("Not found") if __name__ == "__main__":
main()
lp_util.py中为一个简单的地址格式检查函数,保证不要错得太离谱
import re def addr_is_valid(addr):
match_obj = re.match(r'^(0x)?[0-9a-f]{1,}$', addr)
return match_obj is not None
如maps文件为:
00400000-00409000 r-xp 00000000 08:01 1835099 /usr/bin/bluetooth-applet
00608000-00609000 r--p 00008000 08:01 1835099 /usr/bin/bluetooth-applet
00609000-0060a000 rw-p 00009000 08:01 1835099 /usr/bin/bluetooth-applet
00861000-00af8000 rw-p 00000000 00:00 0 [heap]
7f7164000000-7f7164022000 rw-p 00000000 00:00 0
7f7164022000-7f7168000000 ---p 00000000 00:00 0
7f7168000000-7f7168022000 rw-p 00000000 00:00 0
7f7168022000-7f716c000000 ---p 00000000 00:00 0
7f716d1c3000-7f716d314000 r-xp 00000000 08:01 1836558 /usr/lib/x86_64-linux-gnu/libxml2.so.2.7.8
7f716d314000-7f716d513000 ---p 00151000 08:01 1836558 /usr/lib/x86_64-linux-gnu/libxml2.so.2.7.8
7f716d513000-7f716d51b000 r--p 00150000 08:01 1836558 /usr/lib/x86_64-linux-gnu/libxml2.so.2.7.8
7f716d51b000-7f716d51d000 rw-p 00158000 08:01 1836558 /usr/lib/x86_64-linux-gnu/libxml2.so.2.7.8
7f716d51d000-7f716d51e000 rw-p 00000000 00:00 0
7f716d51e000-7f716e713000 r--p 00000000 08:01 2917167 /usr/share/icons/hicolor/icon-theme.cache
7f716e713000-7f716effe000 r--p 00000000 08:01 2752557 /usr/share/icons/gnome/icon-theme.cache ...
输入0x7f716d513123,输出相应的库名/usr/lib/x86_64-linux-gnu/libxml2.so.2.7.8
[Python]根据地址从maps文件中找相应的库名的更多相关文章
- 使用python脚本实现统计日志文件中的ip访问次数
使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...
- JSFinder:一个在js文件中提取URL和子域名的脚本
JSFinder介绍 JSFinder是一款用作快速在网站的js文件中提取URL,子域名的脚本工具. 支持用法 简单爬取 深度爬取 批量指定URL/指定JS 其他参数 以往我们子域名多数使用爆破或DN ...
- awk 解析maps文件中的地址
maps文件一般是这个样子: pi@raspberrypi:~ $ sudo cat /proc//maps 54b88000-54c8d000 r-xp b3: /lib/systemd/syste ...
- 如何将Python对象保存在本地文件中?
Python对象的永久存储 1.使用Python的pickle模块 import pickle class A: def __init__(self,name,a): self.name=name s ...
- python struct.pack() 二进制文件,文件中打包二进制数据的存储与解析
学习Python的过程中,遇到一个问题,在<Python学习手册>(也就是<learning python>)中,元组.文件及其他章节里,关于处理二进制文件里,有这么一段代码的 ...
- 如何解决本地mvn编译安装的jar包在IDEA的pom文件中找不到
在IDEA中maven作为一个内置的工具,不需要任何配置就可以使用,点开settings 可以看到有三个maven可以选择 C:/apache-maven-3.5.3这个maven当然是我自己安装的, ...
- BD面试题1-两个大文件中找出公共记录[转载]
转自:https://blog.csdn.net/tiankong_/article/details/77234726#commentBox 1.题目 给定a.b两个文件,各存放50亿个url,每个u ...
- python调用另一个.py文件中的类和函数
同一文件夹下的调用 1.调用函数 A.py文件如下:def add(x,y): print('和为:%d'%(x+y)) 在B.py文件中调用A.py的add函数如下: import AA.ad ...
- python下print结果到文件中的方法
目的是将print的结果输出到一个文件中,比如这个文件在D:\lianxi\out.txt下,我用的windows: s = '1234' f = open (r'D:\lianxi\out.txt' ...
随机推荐
- HTML5新增核心工具——canvas
原文:HTML5新增核心工具--canvas Canvas元素称得上是HTML5的核心所在,它是一个依靠JavaScript绘制华丽图像的元素. Canvas由一个可绘制地区HTML代码中的属性定义决 ...
- Installshield脚本拷贝文件常见问题汇总
原文:Installshield脚本拷贝文件常见问题汇总 很多朋友经常来问:为什么我用CopyFile/XCopyFile函数拷贝文件无效?引起这种情况的原因有很多,今天略微总结了一下,欢迎各位朋友跟 ...
- 快速构建Windows 8风格应用25-数据绑定
原文:快速构建Windows 8风格应用25-数据绑定 本篇博文主要介绍如何将UI元素与数据进行绑定.数据绑定的方向.数据更改通知.数据转换.数据绑定支持的绑定方案. 数据绑定是一种简单方式来显示数据 ...
- 与6lowpan最相关的RFC文档列表
有关于6lowpan最原始的文档,请参考下面的链接与截图: http://datatracker.ietf.org/wg/6lowpan/
- STM32W芯片的JTAG口用于GPIO
使用过程中发现STM32W芯片在驱动液晶SPI液晶时,在调试状态下可以正常工作但在通常运行情况下却没有任何显示! 经查发现我使用的两个端口PC0和PC3的电平很不正常,拉不高. 所以我就怀疑到IO口问 ...
- proguard android迷茫
我们收拾它意味着蛊惑项目即将结束.上线.但是,当这个问题就更烦躁人,我也记录因混乱中遇到的问题 首先,我在装android4.0封装版本,有没有在这个文件查看器项目 假设有,请继续点击进入projec ...
- 关于安装Redmine服务启动和邮件设置
关于安装Redmine服务启动和邮件设置 分类: Redmine2009-06-01 10:37 5658人阅读 评论(0) 收藏 举报 authentication邮件服务器serviceexcha ...
- 介绍开源的项目管理系统-Redmine
介绍开源的项目管理系统-Redmine 分类: Redmine2009-06-01 10:12 1047人阅读 评论(0) 收藏 举报 项目管理subversionphpmyadminrailsaut ...
- C# 通讯网关开发
C# 通讯网关开发 楼主从12年毕业大部分时间一直从事于通讯网关的开发,刚刚学那会连C#是啥都不知道,就直接入手网关开发,前前后后到现在也算是弄了5.6个通讯协议,后来看到北风之神的socket框架和 ...
- {{angular.js 使用技巧}} - 实现计算列属性
前端MV*框架现在有很多,其中某些框架有计算列(又叫监控属性),比如:微软推荐的 Knockout.js 和博客园司徒正美的 avalon.js 框架. 本人只使用过 Knockout.js,aval ...