[Python]根据地址从maps文件中找相应的库名
来源:互联网 发布:快速启动程序 软件 编辑:程序博客网 时间:2024/06/10 03:04
/proc/PID/maps提供了进程的memory layout,下面脚本根据给定地址找出相应的库名:
#!/usr/bin/pythonfrom __future__ import print_functionimport sysimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport bisectimport reimport lp_utilVERBOSE = 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 Noneif addr < mapset[index - 1]['addr_end']:return mapset[index - 1]else:return Nonedef 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:breakprocess(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")continuemap_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 redef 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-applet00608000-00609000 r--p 00008000 08:01 1835099 /usr/bin/bluetooth-applet00609000-0060a000 rw-p 00009000 08:01 1835099 /usr/bin/bluetooth-applet00861000-00af8000 rw-p 00000000 00:00 0 [heap]7f7164000000-7f7164022000 rw-p 00000000 00:00 07f7164022000-7f7168000000 ---p 00000000 00:00 07f7168000000-7f7168022000 rw-p 00000000 00:00 07f7168022000-7f716c000000 ---p 00000000 00:00 07f716d1c3000-7f716d314000 r-xp 00000000 08:01 1836558 /usr/lib/x86_64-linux-gnu/libxml2.so.2.7.87f716d314000-7f716d513000 ---p 00151000 08:01 1836558 /usr/lib/x86_64-linux-gnu/libxml2.so.2.7.87f716d513000-7f716d51b000 r--p 00150000 08:01 1836558 /usr/lib/x86_64-linux-gnu/libxml2.so.2.7.87f716d51b000-7f716d51d000 rw-p 00158000 08:01 1836558 /usr/lib/x86_64-linux-gnu/libxml2.so.2.7.87f716d51d000-7f716d51e000 rw-p 00000000 00:00 07f716d51e000-7f716e713000 r--p 00000000 08:01 2917167 /usr/share/icons/hicolor/icon-theme.cache7f716e713000-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文件中找相应的库名
- 根据符号的地址从elf文件中查找其符号名
- 根据传入的接口名获取相应的mac地址
- 根据传入接口名获取相应的ip地址
- 从Excel中选择匹配数据 并根据数据移动相应文件
- 根据IP找地址的java实现
- 根据相应的纪录,生成xml文件
- 11_根据变量的类型从输入流中提取相应长度的字节.cpp
- 从文件中找矩阵
- 从C/C++/JAVA 文件中,找函数名或者关键字
- 根据视频地址生成相应的emabed标签
- 根据Email地址跳转到相应的邮箱登录页面
- 根据ip解析相应的地址,调用淘宝接口
- 根据pid找进程名
- 2、使用地址表实现如下功能:根据输入的数字1-7,分别显示相应的英文星期名,如果输入其他字符,则重新输入。
- 请问如何从一段地址字段信息中获取相应的内容
- 根据地址由maps推算代码位置
- python根据url地址下载小文件
- struts配置文件中action元素属性设置解说
- 初来北京混的日子
- 用SQL语句向表格中插入数据INSERT
- [黑马程序员]_冒泡排序算法
- 常用doc命令大全
- [Python]根据地址从maps文件中找相应的库名
- Androidpn真机测试的问题
- boost::asio async_write也不能保证一次发完所有数据 一
- IOS学习笔记37——UIPasteboard/UIMenuController(三)
- 编程开发应该注意的地方
- struts2的文件下载(1):下载前的授权控制
- 适用于 PHP 开发人员的 Python 基础知识
- MyEclipse自动补全与快捷键设置
- oracle 11g rac 恢复到单实例