-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLineParser.cpp
More file actions
97 lines (85 loc) · 1.76 KB
/
Copy pathLineParser.cpp
File metadata and controls
97 lines (85 loc) · 1.76 KB
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
#include "pch.h"
#include "LineParser.h"
qstring LineParser::getOriginalLine(ea_t address) {
qstring buffer;
buffer.resize(MAXSTR - 1);
ida->generate_disasm_line(&buffer, address, GENDSM_REMOVE_TAGS);
return buffer;
}
qstring LineParser::parse(ea_t address) {
qstring original_line = getOriginalLine(address);
insn_t insn;
ida->decode_insn(&insn, address);
switch (insn.itype) {
case NN_lea: {
return parseLoadAddress(insn);
}
case NN_call:
case NN_callfi:
case NN_callni: {
return parseCall(insn);
}
case NN_ja:
case NN_jae:
case NN_jb:
case NN_jbe:
case NN_jc:
case NN_jcxz:
case NN_jecxz:
case NN_jrcxz:
case NN_je:
case NN_jg:
case NN_jge:
case NN_jl:
case NN_jle:
case NN_jna:
case NN_jnae:
case NN_jnb:
case NN_jnbe:
case NN_jnc:
case NN_jne:
case NN_jng:
case NN_jnge:
case NN_jnl:
case NN_jnle:
case NN_jno:
case NN_jnp:
case NN_jns:
case NN_jnz:
case NN_jo:
case NN_jp:
case NN_jpe:
case NN_jpo:
case NN_js:
case NN_jz:
case NN_jmp:
case NN_jmpfi:
case NN_jmpni:
case NN_jmpshort:
{
return parseJump(insn);
}
}
return getOriginalLine(address);
}
qstring LineParser::parseCall(insn_t& insn) {
data_collector.add_addr(insn.ops[0].addr, c_void);
return getOriginalLine(insn.ea);
}
qstring LineParser::parseJump(insn_t& insn) {
data_collector.add_addr(
insn.ops[0].addr,
ida->is_same_func(insn.ea, insn.ops[0].addr)
? c_chunk
: c_void
);
return getOriginalLine(insn.ea);
}
qstring LineParser::parseLoadAddress(insn_t & insn) {
//op_line line_details;
//parse_details.get_details(address, line_details);
if (insn.ops[1].type == o_far || insn.ops[1].type == o_near) {
data_collector.add_addr(insn.ops[1].addr, c_void);
}
return getOriginalLine(insn.ea);
}