第一次在看雪平台投稿,还是有点忐忑的,一直想分享些 idapython 的内容,网上现在的内容太少,都只是教了一些基础的用法。官方的文档和例子又比较散。希望我的分享能让大家更加快乐的逆向吧,哈哈!
这是这个系列的第一篇,分享一下如何用IDAPython 画出两个函数之间的交叉引用图,可视化一直是我很喜欢的一个东西,逆向的目的就是理解代码嘛,可视化是理解代码的一个很重要的工具。
第二步,我们要向 IDA 中添加 action,通过 action 来执行我们的 find_cross_refs函数,首先我们了解一下 IDA 中 action 的概念:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import
idaapi
from
.hookers
import
global_hooker_manager
from
typing
import
Optional
class
ActionManager(
object
):
def
__init__(
self
):
self
.__actions
=
[]
def
register(
self
, action):
self
.__actions.append(action)
idaapi.register_action(
idaapi.action_desc_t(action.name, action.description, action, action.hotkey)
)
if
isinstance
(action, HexRaysPopupAction):
global_hooker_manager.register(HexRaysPopupRequestHandler(action))
def
initialize(
self
):
pass
def
finalize(
self
):
for
action
in
self
.__actions:
idaapi.unregister_action(action.name)
action_manager
=
ActionManager()
class
Action(idaapi.action_handler_t):
description: Optional[
str
]
=
None
hotkey: Optional[
str
]
=
None
def
__init__(
self
):
super
(Action,
self
).__init__()
@property
def
name(
self
):
return
"HexRaysPyTools:"
+
type
(
self
).__name__
def
activate(
self
, ctx: idaapi.action_ctx_base_t):
raise
NotImplementedError
def
update(
self
, ctx: idaapi.action_ctx_base_t):
raise
NotImplementedError
class
HexRaysPopupAction(Action):
def
__init__(
self
):
super
(HexRaysPopupAction,
self
).__init__()
def
activate(
self
, ctx: idaapi.action_ctx_base_t):
raise
NotImplementedError
def
check(
self
, hx_view):
raise
NotImplementedError
def
update(
self
, ctx: idaapi.action_ctx_base_t):
if
ctx.widget_type
=
=
idaapi.BWN_PSEUDOCODE:
return
idaapi.AST_ENABLE_FOR_WIDGET
return
idaapi.AST_DISABLE_FOR_WIDGET
class
HexRaysPopupRequestHandler(idaapi.Hexrays_Hooks):
def
__init__(
self
, action):
super
().__init__()
self
.__action
=
action
def
populating_popup(
self
, widget, popup_handle, vu):
if
self
.__action.check(vu):
idaapi.attach_action_to_popup(widget, popup_handle,
self
.__action.name,
None
)
return
0
代码里面其实还用了很多 sark 库的函数,大家可以自己学习其用法,这个库是专门对 idapython 的 api 做封装的,比较 pythonic,非常好用,我自己也给这个库添加了很多新的功能。