使用 idapython 更改块/节点颜色

逆向工程 蟒蛇
2021-06-14 04:35:13

如何使用 idapython 更改节点(或块?)的颜色?我知道SetColor,但此功能不适用于块/节点。

在此处输入图片说明

编辑:已解决,请参阅下面的代码片段。

def get_bb_id(graph, ea):
    for block in graph:
        if block.startEA <= ea and block.endEA > ea:
            return block.id

start_ea = 0x15f9ad6
base_block_ea = 0x15f9a60

f = get_func(start_ea)
g = FlowChart(f, flags=FC_PREDS) #???
bb_id = get_bb_id(g, start_ea)

p = idaapi.node_info_t()
p.bg_color = 0x00ff00 # green

print idaapi.set_node_info2(base_block_ea, bb_id, p, 
                            idaapi.NIF_BG_COLOR | idaapi.NIF_FRAME_COLOR)
3个回答

查看以下函数和周围(在 idaapi.py 中找到):

def SetNodeInfo(self, node_index, node_info, flags):
    """
    Set the properties for the given node.

    Example usage (set second nodes's bg color to red):
      inst = ...
      p = idaapi.node_info_t()
      p.bg_color = 0x00ff0000
      inst.SetNodeInfo(1, p, idaapi.NIF_BG_COLOR)

    @param node_index: The node index.
    @param node_info: An idaapi.node_info_t instance.
    @param flags: An OR'ed value of NIF_* values.
    """
    _idaapi.pygc_set_node_info(self, node_index, node_info, flags)

def SetNodesInfos(self, values):
    """
    Set the properties for the given nodes.

    Example usage (set first three nodes's bg color to purple):
      inst = ...
      p = idaapi.node_info_t()
      p.bg_color = 0x00ff00ff
      inst.SetNodesInfos({0 : p, 1 : p, 2 : p})

    @param values: A dictionary of 'int -> node_info_t' objects.
    """
    _idaapi.pygc_set_nodes_infos(self, values)

您还可以使用Sark

import sark
code_block = sark.CodeBlock(some_ea)
code_block.color = 0x00ff0000

您可以使用SetColorAPI 以太币。
您应该调用SetColor块的每一行,因为它一次只为一个指令行着色。

这是我的 IDAPython 代码示例:

class ColoringBB(): 
    flowchart = False 
    tgt_ea = 0 
    startea = 0 
    endea = 0 
    addr_fc = 0

    def __init__(self, addr_fc):
        self._set_fc_address(addr_fc)
        self._set_flowchart()

    def _set_fc_address(self, addr_fc):
        self.addr_fc = addr_fc 

    def _set_flowchart(self):
        f = idaapi.get_func(self.addr_fc)
        self.flowchart = idaapi.FlowChart(f)

    def coloring_bb(self, addr):
        self._set_bb_range(addr)
        for addr in range(self.startea, self.endea):
            idc.SetColor(addr, idc.CIC_ITEM, 0x8f8080) # olive

    def _set_bb_range(self, addr):
        for block in self.flowchart:
            if block.startEA <= addr and block.endEA > addr:
                self.startea, self.endea = block.startEA, block.endEA
                break

在为块着色之前设置流程图信息。

addr_fc = 0x8040DCF4 # set flow chart address
cb = ColoringBB(addr_fc)

cb.coloring_bb(0x8040DD40) # color the block containing those address
cb.coloring_bb(0x8040DD34) # color the block containing those address