mirror of
https://github.com/cemu-project/idapython.git
synced 2024-11-28 12:04:19 +01:00
103 lines
2.3 KiB
Markdown
103 lines
2.3 KiB
Markdown
|
# Script Examples #
|
||
|
|
||
|
This little script enumerates all functions in the current segment (section) and lists all places that reference them.
|
||
|
The following are three different implementations of the same functionality. First using IDC, then idapython with low-level
|
||
|
IDA API calls and last using IDAPython's **idautils** helper module.
|
||
|
|
||
|
|
||
|
## IDC version ##
|
||
|
```
|
||
|
//
|
||
|
// Reference Lister
|
||
|
//
|
||
|
// List all functions and all references to them in the current section.
|
||
|
//
|
||
|
// Implemented in IDC
|
||
|
//
|
||
|
#include <idc.idc>
|
||
|
|
||
|
static main()
|
||
|
{
|
||
|
auto ea, func, ref;
|
||
|
|
||
|
// Get current ea
|
||
|
ea = ScreenEA();
|
||
|
|
||
|
// Loop from start to end in the current segment
|
||
|
for (func=SegStart(ea);
|
||
|
func != BADADDR && func < SegEnd(ea);
|
||
|
func=NextFunction(func))
|
||
|
{
|
||
|
// If the current address is function process it
|
||
|
if (GetFunctionFlags(func) != -1)
|
||
|
{
|
||
|
Message("Function %s at 0x%x\n", GetFunctionName(func), func);
|
||
|
|
||
|
// Find all code references to func
|
||
|
for (ref=RfirstB(func); ref != BADADDR; ref=RnextB(func, ref))
|
||
|
{
|
||
|
Message(" called from %s(0x%x)\n", GetFunctionName(ref), ref);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Python with low-level API calls ##
|
||
|
|
||
|
```
|
||
|
#
|
||
|
# Reference Lister
|
||
|
#
|
||
|
# List all functions and all references to them in the current section.
|
||
|
#
|
||
|
# Implemented using direct IDA Plugin API calls
|
||
|
#
|
||
|
from idaapi import *
|
||
|
|
||
|
# Get current ea
|
||
|
ea = get_screen_ea()
|
||
|
|
||
|
# Get segment class
|
||
|
seg = getseg(ea)
|
||
|
|
||
|
# Loop from segment start to end
|
||
|
func = get_func(seg.startEA)
|
||
|
|
||
|
while func is not None and func.startEA < seg.endEA:
|
||
|
funcea = func.startEA
|
||
|
print "Function %s at 0x%x" % (GetFunctionName(funcea), funcea)
|
||
|
|
||
|
ref = get_first_cref_to(funcea)
|
||
|
|
||
|
while ref != BADADDR:
|
||
|
print " called from %s(0x%x)" % (get_func_name(ref), ref)
|
||
|
ref = get_next_cref_to(funcea, ref)
|
||
|
|
||
|
func = get_next_func(funcea)
|
||
|
```
|
||
|
|
||
|
## Python with the idautils module ##
|
||
|
|
||
|
```
|
||
|
#
|
||
|
# Reference Lister
|
||
|
#
|
||
|
# List all functions and all references to them in the current section.
|
||
|
#
|
||
|
# Implemented with the idautils module
|
||
|
#
|
||
|
from idautils import *
|
||
|
|
||
|
# Get current ea
|
||
|
ea = ScreenEA()
|
||
|
|
||
|
# Loop from start to end in the current segment
|
||
|
for funcea in Functions(SegStart(ea), SegEnd(ea)):
|
||
|
print "Function %s at 0x%x" % (GetFunctionName(funcea), funcea)
|
||
|
|
||
|
# Find all code references to funcea
|
||
|
for ref in CodeRefsTo(funcea, 1):
|
||
|
print " called from %s(0x%x)" % (GetFunctionName(ref), ref)
|
||
|
```
|