-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdyn_deinit_mark.idc
63 lines (52 loc) · 1.66 KB
/
dyn_deinit_mark.idc
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
//
//Dynamic Deinit Marker
//by tomsons26
//Marks dynamic deinits as dark grey
//This is useful to establish boundries of modules
//TODO dunno
//
#include <idc.idc>
#define THRESHOLD 50 //tweak this if something gets skipped
static main(void)
{
auto func_addr = 0;
auto found = 0;
auto do_set = 0;
auto func_name = 0;
auto deinit_addr = 0;
func_addr = LocByName("_atexit");
if (func_addr == BADADDR) {
return;
}
auto xref = RfirstB(func_addr);
while( xref != BADADDR )
{
//Message("atexit at %x\n", xref);
found = FindBinary(xref, SEARCH_UP, "68");
if (found == BADADDR) {
break;
}
// if found is more than a threshold thats far away enough
if (found > func_addr + THRESHOLD) {
do_set = 1;
// if found is less than a threshold thats far away enough
} else if (found < func_addr - THRESHOLD) {
do_set = 1;
// else the pattern was found too close so we don't set func_name
} else {
do_set = 0;
}
deinit_addr = Dword(found + 1);
if (do_set) {
func_name = get_func_name(deinit_addr);
if (strlen(func_name) >= 4 && strstr(func_name, "sub_") != -1) {
func_name = "static_deinit_" + substr(func_name, 4, -1);
//Message("naming %x, %s\n", deinit_addr, func_name);
MakeName(deinit_addr, func_name);
}
SetColor(deinit_addr, CIC_FUNC, 0xd7d7d7);
}
found = BADADDR;
xref = RnextB(func_addr, xref);
}
}