-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathutils.cpp
103 lines (91 loc) · 3.12 KB
/
utils.cpp
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "utils.h"
// Modified version of http://grapsus.net/blog/post/Hexadecimal-dump-in-C
void hexdump(const uint8_t *data, uint64_t address, size_t size)
{
printf("\n; Data:\n");
for (uint64_t i = 0; i < size + ((size % 16) ? (16 - size % 16) : 0); i++) {
/* print offset */
if (i % 16 == 0) {
printf(";0x%06lx: ", i + address);
}
/* print hex data */
if (i < size) {
printf("%02x ", 0xFF & data[i]);
}
else /* end of block, just aligning for ASCII dump */
{
printf(" ");
}
/* print ASCII dump */
if (i % 16 == (16 - 1)) {
printf("| ");
for (uint64_t j = i - (16 - 1); j <= i; j++) {
if (j >= size) /* end of block, not really printing */
{
putchar(' ');
}
else if (isprint(data[j])) /* printable char */
{
putchar(0xFF & data[j]);
}
else /* other char */
{
putchar('.');
}
}
printf(" |\n");
}
}
}
void Gap::fill_gap(const Binary& b)
{
if (this->next_addr <= this->last_addr || this->next_addr == b.entry)
return;
size_t s = this->next_addr - this->last_addr;
if ( s > 1) {
const uint8_t *data = &b.data.at(this->last_addr);
hexdump(data, this->last_addr, s);
}
}
void print_addr_list(const std::map<uint64_t, Analyzer::Address>& l, uint64_t last_vaddr)
{
fprintf(stderr, "\n\n; Statistics: Address list size %zu\n\n", l.size());
int a = 0, b = 0, c = 0;
auto f = [](const Analyzer::Address& l)
{
fprintf(stderr, ";\t \t ~ xref: {\n;\t\t\t");
for (auto& x: l.xref)
fprintf(stderr, "'0x%lx, %s' ", x.address, x.istr.c_str());
fprintf(stderr, "\n;\t\t}\n\n");
};
for (auto& [addr, val] : l) {
if (addr > last_vaddr)
continue;
switch (val.type) {
case Analyzer::Address_type::Start:
fprintf(stderr, ";\t 0x%06lx: Start function (entry point )\n", addr);
break;
case Analyzer::Address_type::Call:
fprintf(stderr, ";\t 0x%06lx: function \t(visited: %s)\n",
addr, val.visited ? "true" : "false");
f(val);
a += (val.visited ? 1 : 0);
break;
case Analyzer::Address_type::Jump:
fprintf(stderr, ";\t 0x%06lx: branch address \t(visited: %s)\n",
addr, val.visited ? "true" : "false");
f(val);
b += (val.visited ? 1 : 0);
break;
case Analyzer::Address_type::JmpX:
fprintf(stderr, ";\t 0x%06lx: conditional branch address\t(visited: %s)\n",
addr, val.visited ? "true" : "false");
f(val);
c += (val.visited ? 1 : 0);
break;
default:
break;
}
}
fprintf(stderr, "\n; Reached: %d function - %d branch address - %d conditional branch address\n\n", a + 1, b, c);
}