Skip to content
ida-function-boundaries.py 1.73 KiB
Newer Older
Andrea Gussoni's avatar
Andrea Gussoni committed
import idaapi
import idc
import os
import sys

import json
import jsonpickle

class Function:

    def __init__(self, name, startAddr, endAddr, instruction_number):
        self.name = name
        self.startAddr = startAddr
        self.endAddr = endAddr
        self.basicBlocks = []
        self.arguments = []
        self.instruction_number = instruction_number

    def addBB(self, BB):
        self.basicBlocks.append(BB)

    def addArg(self, arg):
        self.arguments.append(arg)

class BasicBlock:

    def __init__(self, startAddr, endAddr):
        self.startAddr = startAddr
        self.endAddr = endAddr

class Argument:

    def __init__(self, location=None):
        self.location = location

functions = []

start = SegStart(BeginEA())
for function_start in Functions(SegStart(start), SegEnd(start)):

    # Count the number of instructions
    instruction_counter = 0
    for i in FuncItems(function_start):
        instruction_counter += 1

    f = idaapi.FlowChart(idaapi.get_func(function_start))
    curFunc = Function(GetFunctionName(function_start), "0x%08x"%f[0].startEA, "0x%08x"%FindFuncEnd(function_start), instruction_counter)

    visited = set()
    visited.add(f[0].startEA)

    wl = [f[0]]
    while len(wl) > 0:
        bb = wl.pop()
        start = "0x%08x"%bb.startEA
        end = "0x%08x"%bb.endEA

        block = BasicBlock(start, end)
        curFunc.basicBlocks.append(block)

        for successor in bb.succs():
            if successor.startEA not in visited:
                visited.add(successor.startEA)
                wl.append(successor)

    functions.append(curFunc)

with open(idc.ARGV[1], "w") as output:
    json.dump(json.loads(jsonpickle.encode(functions, unpicklable=False)), output, indent=4)

idc.Exit(0)