r2pip多处理

2024-09-26 22:50:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用r2pipe(Radare2的API)和多处理时遇到了问题池.map函数。我面临的问题是应用程序挂起池.连接(). 你知道吗

我希望通过多处理.dummy类,以便通过r2pipe快速计算函数。我尝试使用Manager类将r2pipe对象作为命名空间传递。我也尝试过使用事件,但这些似乎都不起作用。你知道吗

class Test:
    def __init__(self, filename=None):
        if filename:
            self.r2 = r2pipe.open(filename)
        else:
            self.r2 = r2pipe.open()
        self.r2.cmd('aaa')

    def t_func(self, args):
        f = args[0]
        r2_ns = args[1]
        print('afbj @ {}'.format(f['name']))
        try:
            bb = r2_ns.cmdj('afbj @ {}'.format(f['name']))
            if bb:
                return bb[0]['addr']
            else:
                return None
        except Exception as e:
            print(e)
            return None

    def thread(self):
        funcs = self.r2.cmdj('aflj')
        mgr = ThreadMgr()
        ns = mgr.Namespace()
        ns.r2 = self.r2
        pool = ThreadPool(2)
        results = pool.map(self.t_func, product(funcs, [ns.r2]))
        pool.close()
        pool.join()
        print(list(results))

这是我正在使用的类。我打电话给测试线程我的主要职能。你知道吗

我希望应用程序打印出它将在r2pipe afbj @ entry0中运行的命令,然后打印出包含第一个基本块地址[40000, 50000, ...]的结果列表。你知道吗

应用程序确实打印出要运行的命令,但在打印出结果之前挂起。你知道吗


Tags: selfnone应用程序mapreturndefargsfilename
1条回答
网友
1楼 · 发布于 2024-09-26 22:50:02

环境

  • 雷达2:雷达2 4.2.0-git 23712@linux-x86-64 git.4.1.1-97-g5a48a4017 提交:5a48a401787c0eab31ecfb48bebf7cdfccb66e9b构建:2020-01-09\uu 21:44:51
  • r2管道:1.4.2
  • python:python 3.6.9(默认,2019年11月7日,10:44:02)
  • 系统:Ubuntu 18.04.3 LTS

解决方案

  • 这可能是由于传递了相同的r2实例管道打开()连接到池中的每个t\u func调用。一种解决方案是将以下代码行移到tŠfunc中:
r2 = r2pipe.open('filename')
r2.cmd('aaa')
  • 不过,这是可行的,但对每个线程/进程重新分析的速度非常慢。你知道吗
  • 而且,让radare2做尽可能多的工作和限制我们需要使用r2pipe发送的命令的数量通常更快。
    • 使用命令afbj@@f可以解决这个问题
    • afbj#列出给定函数的基本块,并用json显示结果
    • @@f#执行每个函数的命令

示例

较长的示例

import r2pipe 

R2: r2pipe.open_sync = r2pipe.open('/bin/ls')   
R2.cmd("aaaa")         
FUNCS: list = R2.cmd('afbj @@f').split("\n")[:-1]   
RESULTS: list = []

for func in FUNCS:
    basic_block_info: list = eval(func)
    first_block: dict = basic_block_info[0]
    address_first_block: int = first_block['addr']
    RESULTS.append(hex(address_first_block))

print(RESULTS)  

'''
['0x4a56', '0x1636c', '0x3758', '0x15690', '0x15420', '0x154f0', '0x15420',
 '0x154f0', '0x3780', '0x3790', '0x37a0', '0x37b0', '0x37c0', '0x37d0', '0x0',
 ...,
'0x3e90', '0x6210', '0x62f0', '0x8f60', '0x99e0', '0xa860', '0xc640', '0x3e70',
 '0xd200', '0xd220', '0x133a0', '0x14480', '0x144e0', '0x145e0', '0x14840', '0x15cf0']
'''

简短的例子

import r2pipe

R2 = r2pipe.open('/bin/ls')                         
R2.cmd("aaaa")
print([hex(eval(func)[0]['addr']) for func in R2.cmd('afbj @@f').split("\n")[:-1]])

相关问题 更多 >

    热门问题