/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文件中找相应的库名的更多相关文章

  1. 使用python脚本实现统计日志文件中的ip访问次数

    使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...

  2. JSFinder:一个在js文件中提取URL和子域名的脚本

    JSFinder介绍 JSFinder是一款用作快速在网站的js文件中提取URL,子域名的脚本工具. 支持用法 简单爬取 深度爬取 批量指定URL/指定JS 其他参数 以往我们子域名多数使用爆破或DN ...

  3. awk 解析maps文件中的地址

    maps文件一般是这个样子: pi@raspberrypi:~ $ sudo cat /proc//maps 54b88000-54c8d000 r-xp b3: /lib/systemd/syste ...

  4. 如何将Python对象保存在本地文件中?

    Python对象的永久存储 1.使用Python的pickle模块 import pickle class A: def __init__(self,name,a): self.name=name s ...

  5. python struct.pack() 二进制文件,文件中打包二进制数据的存储与解析

    学习Python的过程中,遇到一个问题,在<Python学习手册>(也就是<learning python>)中,元组.文件及其他章节里,关于处理二进制文件里,有这么一段代码的 ...

  6. 如何解决本地mvn编译安装的jar包在IDEA的pom文件中找不到

    在IDEA中maven作为一个内置的工具,不需要任何配置就可以使用,点开settings 可以看到有三个maven可以选择 C:/apache-maven-3.5.3这个maven当然是我自己安装的, ...

  7. BD面试题1-两个大文件中找出公共记录[转载]

    转自:https://blog.csdn.net/tiankong_/article/details/77234726#commentBox 1.题目 给定a.b两个文件,各存放50亿个url,每个u ...

  8. python调用另一个.py文件中的类和函数

    同一文件夹下的调用 1.调用函数 A.py文件如下:def add(x,y):    print('和为:%d'%(x+y)) 在B.py文件中调用A.py的add函数如下: import AA.ad ...

  9. python下print结果到文件中的方法

    目的是将print的结果输出到一个文件中,比如这个文件在D:\lianxi\out.txt下,我用的windows: s = '1234' f = open (r'D:\lianxi\out.txt' ...

随机推荐

  1. 查看oracle数据库服务器的名字

    原文:查看oracle数据库服务器的名字 windows 中 1. select name from v$database ; 直接运行就可以查看了, 2.查看tnsnames.ora 的连接,有个S ...

  2. (64位oracle使用32位的PLSQL)安装64位的oracle数据库软件,使用32位的PLSQL Developer连接方法

    因为PLSQL Developer没有提供64位的,于是依据网上的资料做了一下整理,发上来 1.下载并安装Oracle 11g R2 64位,在server上安装时忽略硬件检測失败信息: 2.下载Or ...

  3. MVC5 EF6 Bootstrap3 HtmlHelper

    MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下) 上一节:MVC5 + EF6 + Bootstrap3 (8) HtmlHelper用法大全(上) 源码下载 ...

  4. SQL点滴15—在SQL Server 2008中调用C#程序

    原文:SQL点滴15-在SQL Server 2008中调用C#程序 T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可 ...

  5. POJ3243 EXT-BSGS算法

    需要解决问题之前,首先要做到POJ2417,我的解决问题的方法:http://blog.csdn.net/wyfcyx_forever/article/details/40538515 如今来看这个问 ...

  6. 实例学习SSIS(二)--使用迭代

    原文:实例学习SSIS(二)--使用迭代 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SSIS(四)-- ...

  7. 通过js实现在页面中添加音乐

    代码如下!兼容IE // JavaScript Document function autoPlay(){//自动播放 var myAuto = document.getElementById('my ...

  8. C#编程实践–帮老婆计算产假方案

    摘要 今天中午午休时,和老婆聊天,老婆还过几天就要请产假了,她在网上问我让我帮她数一下该怎么请假最划算,老婆是个会过日子的人,面对此种要求我当然义不容辞,不过想到这个问题我的第一反应是:这个怎么可以用 ...

  9. Mysql彻底卸载

    -----本文摘自:http://www.heiqu.com/show-64764-1.html 1.控制面板里的增加删除程序内进行删除 2.删除MySQL文件夹下的my.ini文件,如果备份好,可以 ...

  10. Linux : fedora 安装 vnc server

    Linux配置VNC服务 安装VNC服务端 #yum install vnc-server 配置VNC服务参数文件 编辑vncservers文件追加如下 #vi /etc/sysconfig/vncs ...