libTriton  version 0.9 build 1502
context.cpp
Go to the documentation of this file.
1 /*
3 ** Copyright (C) - Triton
4 **
5 ** This program is under the terms of the Apache License 2.0.
6 */
7 
8 /* pintool */
9 #include "bindings.hpp"
10 #include "api.hpp"
11 #include "context.hpp"
12 
13 #include <cstring>
14 #include <stdexcept>
15 
16 /* libTriton */
17 #include <triton/api.hpp>
18 #include <triton/cpuSize.hpp>
19 #include <triton/coreUtils.hpp>
21 
22 
23 
24 
25 namespace tracer {
26  namespace pintool {
27  namespace context {
28 
29  CONTEXT* lastContext = nullptr;
30  bool mustBeExecuted = false;
31 
32 
35  triton::uint512 value = 0;
36 
38  return 0;
39 
40  #if defined(__x86_64__) || defined(_M_X64)
41  switch (reg.getParent()) {
42  case triton::arch::ID_REG_X86_RAX: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RAX, reinterpret_cast<triton::uint8*>(buffer)); break;
43  case triton::arch::ID_REG_X86_RBX: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RBX, reinterpret_cast<triton::uint8*>(buffer)); break;
44  case triton::arch::ID_REG_X86_RCX: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RCX, reinterpret_cast<triton::uint8*>(buffer)); break;
45  case triton::arch::ID_REG_X86_RDX: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RDX, reinterpret_cast<triton::uint8*>(buffer)); break;
46  case triton::arch::ID_REG_X86_RDI: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RDI, reinterpret_cast<triton::uint8*>(buffer)); break;
47  case triton::arch::ID_REG_X86_RSI: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RSI, reinterpret_cast<triton::uint8*>(buffer)); break;
48  case triton::arch::ID_REG_X86_RBP: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RBP, reinterpret_cast<triton::uint8*>(buffer)); break;
49  case triton::arch::ID_REG_X86_RSP: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RSP, reinterpret_cast<triton::uint8*>(buffer)); break;
50  case triton::arch::ID_REG_X86_RIP: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RIP, reinterpret_cast<triton::uint8*>(buffer)); break;
51  case triton::arch::ID_REG_X86_EFLAGS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RFLAGS, reinterpret_cast<triton::uint8*>(buffer)); break;
52  case triton::arch::ID_REG_X86_R8: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R8, reinterpret_cast<triton::uint8*>(buffer)); break;
53  case triton::arch::ID_REG_X86_R9: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R9, reinterpret_cast<triton::uint8*>(buffer)); break;
54  case triton::arch::ID_REG_X86_R10: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R10, reinterpret_cast<triton::uint8*>(buffer)); break;
55  case triton::arch::ID_REG_X86_R11: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R11, reinterpret_cast<triton::uint8*>(buffer)); break;
56  case triton::arch::ID_REG_X86_R12: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R12, reinterpret_cast<triton::uint8*>(buffer)); break;
57  case triton::arch::ID_REG_X86_R13: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R13, reinterpret_cast<triton::uint8*>(buffer)); break;
58  case triton::arch::ID_REG_X86_R14: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R14, reinterpret_cast<triton::uint8*>(buffer)); break;
59  case triton::arch::ID_REG_X86_R15: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R15, reinterpret_cast<triton::uint8*>(buffer)); break;
60  case triton::arch::ID_REG_X86_MM0: return 0; /* Pin doesn't support MMX */
61  case triton::arch::ID_REG_X86_MM1: return 0; /* Pin doesn't support MMX */
62  case triton::arch::ID_REG_X86_MM2: return 0; /* Pin doesn't support MMX */
63  case triton::arch::ID_REG_X86_MM3: return 0; /* Pin doesn't support MMX */
64  case triton::arch::ID_REG_X86_MM4: return 0; /* Pin doesn't support MMX */
65  case triton::arch::ID_REG_X86_MM5: return 0; /* Pin doesn't support MMX */
66  case triton::arch::ID_REG_X86_MM6: return 0; /* Pin doesn't support MMX */
67  case triton::arch::ID_REG_X86_MM7: return 0; /* Pin doesn't support MMX */
68  case triton::arch::ID_REG_X86_XMM0: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM0, reinterpret_cast<triton::uint8*>(buffer)); break;
69  case triton::arch::ID_REG_X86_XMM1: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM1, reinterpret_cast<triton::uint8*>(buffer)); break;
70  case triton::arch::ID_REG_X86_XMM2: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM2, reinterpret_cast<triton::uint8*>(buffer)); break;
71  case triton::arch::ID_REG_X86_XMM3: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM3, reinterpret_cast<triton::uint8*>(buffer)); break;
72  case triton::arch::ID_REG_X86_XMM4: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM4, reinterpret_cast<triton::uint8*>(buffer)); break;
73  case triton::arch::ID_REG_X86_XMM5: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM5, reinterpret_cast<triton::uint8*>(buffer)); break;
74  case triton::arch::ID_REG_X86_XMM6: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM6, reinterpret_cast<triton::uint8*>(buffer)); break;
75  case triton::arch::ID_REG_X86_XMM7: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM7, reinterpret_cast<triton::uint8*>(buffer)); break;
76  case triton::arch::ID_REG_X86_XMM8: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM8, reinterpret_cast<triton::uint8*>(buffer)); break;
77  case triton::arch::ID_REG_X86_XMM9: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM9, reinterpret_cast<triton::uint8*>(buffer)); break;
78  case triton::arch::ID_REG_X86_XMM10: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM10, reinterpret_cast<triton::uint8*>(buffer)); break;
79  case triton::arch::ID_REG_X86_XMM11: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM11, reinterpret_cast<triton::uint8*>(buffer)); break;
80  case triton::arch::ID_REG_X86_XMM12: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM12, reinterpret_cast<triton::uint8*>(buffer)); break;
81  case triton::arch::ID_REG_X86_XMM13: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM13, reinterpret_cast<triton::uint8*>(buffer)); break;
82  case triton::arch::ID_REG_X86_XMM14: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM14, reinterpret_cast<triton::uint8*>(buffer)); break;
83  case triton::arch::ID_REG_X86_XMM15: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM15, reinterpret_cast<triton::uint8*>(buffer)); break;
84  case triton::arch::ID_REG_X86_YMM0: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM0, reinterpret_cast<triton::uint8*>(buffer)); break;
85  case triton::arch::ID_REG_X86_YMM1: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM1, reinterpret_cast<triton::uint8*>(buffer)); break;
86  case triton::arch::ID_REG_X86_YMM2: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM2, reinterpret_cast<triton::uint8*>(buffer)); break;
87  case triton::arch::ID_REG_X86_YMM3: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM3, reinterpret_cast<triton::uint8*>(buffer)); break;
88  case triton::arch::ID_REG_X86_YMM4: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM4, reinterpret_cast<triton::uint8*>(buffer)); break;
89  case triton::arch::ID_REG_X86_YMM5: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM5, reinterpret_cast<triton::uint8*>(buffer)); break;
90  case triton::arch::ID_REG_X86_YMM6: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM6, reinterpret_cast<triton::uint8*>(buffer)); break;
91  case triton::arch::ID_REG_X86_YMM7: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM7, reinterpret_cast<triton::uint8*>(buffer)); break;
92  case triton::arch::ID_REG_X86_YMM8: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM8, reinterpret_cast<triton::uint8*>(buffer)); break;
93  case triton::arch::ID_REG_X86_YMM9: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM9, reinterpret_cast<triton::uint8*>(buffer)); break;
94  case triton::arch::ID_REG_X86_YMM10: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM10, reinterpret_cast<triton::uint8*>(buffer)); break;
95  case triton::arch::ID_REG_X86_YMM11: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM11, reinterpret_cast<triton::uint8*>(buffer)); break;
96  case triton::arch::ID_REG_X86_YMM12: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM12, reinterpret_cast<triton::uint8*>(buffer)); break;
97  case triton::arch::ID_REG_X86_YMM13: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM13, reinterpret_cast<triton::uint8*>(buffer)); break;
98  case triton::arch::ID_REG_X86_YMM14: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM14, reinterpret_cast<triton::uint8*>(buffer)); break;
99  case triton::arch::ID_REG_X86_YMM15: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM15, reinterpret_cast<triton::uint8*>(buffer)); break;
100  case triton::arch::ID_REG_X86_ZMM0: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM0, reinterpret_cast<triton::uint8*>(buffer)); break;
101  case triton::arch::ID_REG_X86_ZMM1: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM1, reinterpret_cast<triton::uint8*>(buffer)); break;
102  case triton::arch::ID_REG_X86_ZMM2: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM2, reinterpret_cast<triton::uint8*>(buffer)); break;
103  case triton::arch::ID_REG_X86_ZMM3: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM3, reinterpret_cast<triton::uint8*>(buffer)); break;
104  case triton::arch::ID_REG_X86_ZMM4: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM4, reinterpret_cast<triton::uint8*>(buffer)); break;
105  case triton::arch::ID_REG_X86_ZMM5: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM5, reinterpret_cast<triton::uint8*>(buffer)); break;
106  case triton::arch::ID_REG_X86_ZMM6: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM6, reinterpret_cast<triton::uint8*>(buffer)); break;
107  case triton::arch::ID_REG_X86_ZMM7: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM7, reinterpret_cast<triton::uint8*>(buffer)); break;
108  case triton::arch::ID_REG_X86_ZMM8: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM8, reinterpret_cast<triton::uint8*>(buffer)); break;
109  case triton::arch::ID_REG_X86_ZMM9: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM9, reinterpret_cast<triton::uint8*>(buffer)); break;
110  case triton::arch::ID_REG_X86_ZMM10: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM10, reinterpret_cast<triton::uint8*>(buffer)); break;
111  case triton::arch::ID_REG_X86_ZMM11: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM11, reinterpret_cast<triton::uint8*>(buffer)); break;
112  case triton::arch::ID_REG_X86_ZMM12: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM12, reinterpret_cast<triton::uint8*>(buffer)); break;
113  case triton::arch::ID_REG_X86_ZMM13: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM13, reinterpret_cast<triton::uint8*>(buffer)); break;
114  case triton::arch::ID_REG_X86_ZMM14: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM14, reinterpret_cast<triton::uint8*>(buffer)); break;
115  case triton::arch::ID_REG_X86_ZMM15: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM15, reinterpret_cast<triton::uint8*>(buffer)); break;
116  case triton::arch::ID_REG_X86_ZMM16: return 0; /* Pin doesn't support AVX-512 */
117  case triton::arch::ID_REG_X86_ZMM17: return 0; /* Pin doesn't support AVX-512 */
118  case triton::arch::ID_REG_X86_ZMM18: return 0; /* Pin doesn't support AVX-512 */
119  case triton::arch::ID_REG_X86_ZMM19: return 0; /* Pin doesn't support AVX-512 */
120  case triton::arch::ID_REG_X86_ZMM20: return 0; /* Pin doesn't support AVX-512 */
121  case triton::arch::ID_REG_X86_ZMM21: return 0; /* Pin doesn't support AVX-512 */
122  case triton::arch::ID_REG_X86_ZMM22: return 0; /* Pin doesn't support AVX-512 */
123  case triton::arch::ID_REG_X86_ZMM23: return 0; /* Pin doesn't support AVX-512 */
124  case triton::arch::ID_REG_X86_ZMM24: return 0; /* Pin doesn't support AVX-512 */
125  case triton::arch::ID_REG_X86_ZMM25: return 0; /* Pin doesn't support AVX-512 */
126  case triton::arch::ID_REG_X86_ZMM26: return 0; /* Pin doesn't support AVX-512 */
127  case triton::arch::ID_REG_X86_ZMM27: return 0; /* Pin doesn't support AVX-512 */
128  case triton::arch::ID_REG_X86_ZMM28: return 0; /* Pin doesn't support AVX-512 */
129  case triton::arch::ID_REG_X86_ZMM29: return 0; /* Pin doesn't support AVX-512 */
130  case triton::arch::ID_REG_X86_ZMM30: return 0; /* Pin doesn't support AVX-512 */
131  case triton::arch::ID_REG_X86_ZMM31: return 0; /* Pin doesn't support AVX-512 */
132  case triton::arch::ID_REG_X86_MXCSR: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_MXCSR, reinterpret_cast<triton::uint8*>(buffer)); break;
133  case triton::arch::ID_REG_X86_CR0: return 0; /* Don't care about this register in ring3 */
134  case triton::arch::ID_REG_X86_CR1: return 0; /* Don't care about this register in ring3 */
135  case triton::arch::ID_REG_X86_CR2: return 0; /* Don't care about this register in ring3 */
136  case triton::arch::ID_REG_X86_CR3: return 0; /* Don't care about this register in ring3 */
137  case triton::arch::ID_REG_X86_CR4: return 0; /* Don't care about this register in ring3 */
138  case triton::arch::ID_REG_X86_CR5: return 0; /* Don't care about this register in ring3 */
139  case triton::arch::ID_REG_X86_CR6: return 0; /* Don't care about this register in ring3 */
140  case triton::arch::ID_REG_X86_CR7: return 0; /* Don't care about this register in ring3 */
141  case triton::arch::ID_REG_X86_CR8: return 0; /* Don't care about this register in ring3 */
142  case triton::arch::ID_REG_X86_CR9: return 0; /* Don't care about this register in ring3 */
143  case triton::arch::ID_REG_X86_CR10: return 0; /* Don't care about this register in ring3 */
144  case triton::arch::ID_REG_X86_CR11: return 0; /* Don't care about this register in ring3 */
145  case triton::arch::ID_REG_X86_CR12: return 0; /* Don't care about this register in ring3 */
146  case triton::arch::ID_REG_X86_CR13: return 0; /* Don't care about this register in ring3 */
147  case triton::arch::ID_REG_X86_CR14: return 0; /* Don't care about this register in ring3 */
148  case triton::arch::ID_REG_X86_CR15: return 0; /* Don't care about this register in ring3 */
149  case triton::arch::ID_REG_X86_CS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_CS, reinterpret_cast<triton::uint8*>(buffer)); break;
150  case triton::arch::ID_REG_X86_DS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_DS, reinterpret_cast<triton::uint8*>(buffer)); break;
151  case triton::arch::ID_REG_X86_ES: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_ES, reinterpret_cast<triton::uint8*>(buffer)); break;
152  case triton::arch::ID_REG_X86_FS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_FS_BASE, reinterpret_cast<triton::uint8*>(buffer)); break;
153  case triton::arch::ID_REG_X86_GS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_GS_BASE, reinterpret_cast<triton::uint8*>(buffer)); break;
154  case triton::arch::ID_REG_X86_SS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_SS, reinterpret_cast<triton::uint8*>(buffer)); break;
155  default:
156  if (reg.getId() >= triton::arch::ID_REG_X86_AC && reg.getId() <= triton::arch::ID_REG_X86_ZF)
157  PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RFLAGS, reinterpret_cast<triton::uint8*>(buffer));
158  else if (reg.getId() >= triton::arch::ID_REG_X86_IE && reg.getId() <= triton::arch::ID_REG_X86_FZ)
159  PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_MXCSR, reinterpret_cast<triton::uint8*>(buffer));
160  else
161  throw std::runtime_error("tracer::pintool::context::getCurrentRegisterValue(): Invalid register.");
162  break;
163  }
164 
165  /* Sync with the libTriton */
166  const triton::arch::Register* syncReg = nullptr;
167  if (reg.getId() >= triton::arch::ID_REG_X86_AC && reg.getId() <= triton::arch::ID_REG_X86_ZF)
168  syncReg = &tracer::pintool::api.getRegister(triton::arch::ID_REG_X86_EFLAGS);
169  else if (reg.getId() >= triton::arch::ID_REG_X86_IE && reg.getId() <= triton::arch::ID_REG_X86_FZ)
170  syncReg = &tracer::pintool::api.getRegister(triton::arch::ID_REG_X86_MXCSR);
171  else
172  syncReg = &tracer::pintool::api.getParentRegister(reg.getId());
173  #endif
174 
175  #if defined(__i386) || defined(_M_IX86)
176  switch (reg.getParent()) {
177  case triton::arch::ID_REG_X86_EAX: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EAX, reinterpret_cast<triton::uint8*>(buffer)); break;
178  case triton::arch::ID_REG_X86_EBX: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EBX, reinterpret_cast<triton::uint8*>(buffer)); break;
179  case triton::arch::ID_REG_X86_ECX: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_ECX, reinterpret_cast<triton::uint8*>(buffer)); break;
180  case triton::arch::ID_REG_X86_EDX: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EDX, reinterpret_cast<triton::uint8*>(buffer)); break;
181  case triton::arch::ID_REG_X86_EDI: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EDI, reinterpret_cast<triton::uint8*>(buffer)); break;
182  case triton::arch::ID_REG_X86_ESI: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_ESI, reinterpret_cast<triton::uint8*>(buffer)); break;
183  case triton::arch::ID_REG_X86_EBP: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EBP, reinterpret_cast<triton::uint8*>(buffer)); break;
184  case triton::arch::ID_REG_X86_ESP: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_ESP, reinterpret_cast<triton::uint8*>(buffer)); break;
185  case triton::arch::ID_REG_X86_EIP: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EIP, reinterpret_cast<triton::uint8*>(buffer)); break;
186  case triton::arch::ID_REG_X86_EFLAGS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EFLAGS, reinterpret_cast<triton::uint8*>(buffer)); break;
187  case triton::arch::ID_REG_X86_MM0: return 0; /* Pin doesn't support MMX */
188  case triton::arch::ID_REG_X86_MM1: return 0; /* Pin doesn't support MMX */
189  case triton::arch::ID_REG_X86_MM2: return 0; /* Pin doesn't support MMX */
190  case triton::arch::ID_REG_X86_MM3: return 0; /* Pin doesn't support MMX */
191  case triton::arch::ID_REG_X86_MM4: return 0; /* Pin doesn't support MMX */
192  case triton::arch::ID_REG_X86_MM5: return 0; /* Pin doesn't support MMX */
193  case triton::arch::ID_REG_X86_MM6: return 0; /* Pin doesn't support MMX */
194  case triton::arch::ID_REG_X86_MM7: return 0; /* Pin doesn't support MMX */
195  case triton::arch::ID_REG_X86_XMM0: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM0, reinterpret_cast<triton::uint8*>(buffer)); break;
196  case triton::arch::ID_REG_X86_XMM1: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM1, reinterpret_cast<triton::uint8*>(buffer)); break;
197  case triton::arch::ID_REG_X86_XMM2: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM2, reinterpret_cast<triton::uint8*>(buffer)); break;
198  case triton::arch::ID_REG_X86_XMM3: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM3, reinterpret_cast<triton::uint8*>(buffer)); break;
199  case triton::arch::ID_REG_X86_XMM4: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM4, reinterpret_cast<triton::uint8*>(buffer)); break;
200  case triton::arch::ID_REG_X86_XMM5: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM5, reinterpret_cast<triton::uint8*>(buffer)); break;
201  case triton::arch::ID_REG_X86_XMM6: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM6, reinterpret_cast<triton::uint8*>(buffer)); break;
202  case triton::arch::ID_REG_X86_XMM7: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM7, reinterpret_cast<triton::uint8*>(buffer)); break;
203  case triton::arch::ID_REG_X86_YMM0: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM0, reinterpret_cast<triton::uint8*>(buffer)); break;
204  case triton::arch::ID_REG_X86_YMM1: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM1, reinterpret_cast<triton::uint8*>(buffer)); break;
205  case triton::arch::ID_REG_X86_YMM2: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM2, reinterpret_cast<triton::uint8*>(buffer)); break;
206  case triton::arch::ID_REG_X86_YMM3: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM3, reinterpret_cast<triton::uint8*>(buffer)); break;
207  case triton::arch::ID_REG_X86_YMM4: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM4, reinterpret_cast<triton::uint8*>(buffer)); break;
208  case triton::arch::ID_REG_X86_YMM5: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM5, reinterpret_cast<triton::uint8*>(buffer)); break;
209  case triton::arch::ID_REG_X86_YMM6: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM6, reinterpret_cast<triton::uint8*>(buffer)); break;
210  case triton::arch::ID_REG_X86_YMM7: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM7, reinterpret_cast<triton::uint8*>(buffer)); break;
211  case triton::arch::ID_REG_X86_MXCSR: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_MXCSR, reinterpret_cast<triton::uint8*>(buffer)); break;
212  case triton::arch::ID_REG_X86_CR0: return 0; /* Don't care about this register in ring3 */
213  case triton::arch::ID_REG_X86_CR1: return 0; /* Don't care about this register in ring3 */
214  case triton::arch::ID_REG_X86_CR2: return 0; /* Don't care about this register in ring3 */
215  case triton::arch::ID_REG_X86_CR3: return 0; /* Don't care about this register in ring3 */
216  case triton::arch::ID_REG_X86_CR4: return 0; /* Don't care about this register in ring3 */
217  case triton::arch::ID_REG_X86_CR5: return 0; /* Don't care about this register in ring3 */
218  case triton::arch::ID_REG_X86_CR6: return 0; /* Don't care about this register in ring3 */
219  case triton::arch::ID_REG_X86_CR7: return 0; /* Don't care about this register in ring3 */
220  case triton::arch::ID_REG_X86_CR8: return 0; /* Don't care about this register in ring3 */
221  case triton::arch::ID_REG_X86_CR9: return 0; /* Don't care about this register in ring3 */
222  case triton::arch::ID_REG_X86_CR10: return 0; /* Don't care about this register in ring3 */
223  case triton::arch::ID_REG_X86_CR11: return 0; /* Don't care about this register in ring3 */
224  case triton::arch::ID_REG_X86_CR12: return 0; /* Don't care about this register in ring3 */
225  case triton::arch::ID_REG_X86_CR13: return 0; /* Don't care about this register in ring3 */
226  case triton::arch::ID_REG_X86_CR14: return 0; /* Don't care about this register in ring3 */
227  case triton::arch::ID_REG_X86_CR15: return 0; /* Don't care about this register in ring3 */
228  case triton::arch::ID_REG_X86_CS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_CS, reinterpret_cast<triton::uint8*>(buffer)); break;
229  case triton::arch::ID_REG_X86_DS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_DS, reinterpret_cast<triton::uint8*>(buffer)); break;
230  case triton::arch::ID_REG_X86_ES: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_ES, reinterpret_cast<triton::uint8*>(buffer)); break;
231  case triton::arch::ID_REG_X86_FS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_FS_BASE, reinterpret_cast<triton::uint8*>(buffer)); break;
232  case triton::arch::ID_REG_X86_GS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_GS_BASE, reinterpret_cast<triton::uint8*>(buffer)); break;
233  case triton::arch::ID_REG_X86_SS: PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_SS, reinterpret_cast<triton::uint8*>(buffer)); break;
234  default:
235  if (reg.getId() >= triton::arch::ID_REG_X86_AC && reg.getId() <= triton::arch::ID_REG_X86_ZF)
236  PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EFLAGS, reinterpret_cast<triton::uint8*>(buffer));
237  else if (reg.getId() >= triton::arch::ID_REG_X86_IE && reg.getId() <= triton::arch::ID_REG_X86_FZ)
238  PIN_GetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_MXCSR, reinterpret_cast<triton::uint8*>(buffer));
239  else
240  throw std::runtime_error("tracer::pintool::context::getCurrentRegisterValue(): Invalid register.");
241  break;
242  }
243 
244  /* Sync with the libTriton */
245  const triton::arch::Register* syncReg = nullptr;
246  if (reg.getId() >= triton::arch::ID_REG_X86_AC && reg.getId() <= triton::arch::ID_REG_X86_ZF)
247  syncReg = &tracer::pintool::api.getRegister(triton::arch::ID_REG_X86_EFLAGS);
248  else if (reg.getId() >= triton::arch::ID_REG_X86_IE && reg.getId() <= triton::arch::ID_REG_X86_FZ)
249  syncReg = &tracer::pintool::api.getRegister(triton::arch::ID_REG_X86_MXCSR);
250  else
251  syncReg = &tracer::pintool::api.getParentRegister(reg.getId());
252  #endif
253 
254  value = triton::utils::fromBufferToUint<triton::uint512>(buffer);
256 
257  /* Returns the good casted value */
259  }
260 
261 
264  }
265 
266 
268  triton::uint512 value = 0;
269 
270  if (PIN_CheckReadAccess(reinterpret_cast<triton::uint8*>(addr)) == false)
271  throw std::runtime_error("tracer::pintool::context::getCurrentMemoryValue(): Page not readable.");
272 
273  value = *(reinterpret_cast<triton::uint8*>(addr));
274 
275  return value;
276  }
277 
278 
280  triton::uint512 value = 0;
281 
282  if (PIN_CheckReadAccess(reinterpret_cast<triton::uint8*>(addr)) == false || PIN_CheckReadAccess(reinterpret_cast<triton::uint8*>(addr+size-1)) == false)
283  throw std::runtime_error("tracer::pintool::context::getCurrentMemoryValue(): Page not readable.");
284 
285  switch(size) {
286  case triton::size::byte: value = *(reinterpret_cast<triton::uint8*>(addr)); break;
287  case triton::size::word: value = *(reinterpret_cast<triton::uint16*>(addr)); break;
288  case triton::size::dword: value = *(reinterpret_cast<triton::uint32*>(addr)); break;
289  case triton::size::qword: value = *(reinterpret_cast<triton::uint64*>(addr)); break;
290  case triton::size::dqword: value = triton::utils::fromBufferToUint<triton::uint128>(reinterpret_cast<triton::uint8*>(addr)); break;
291  case triton::size::qqword: value = triton::utils::fromBufferToUint<triton::uint256>(reinterpret_cast<triton::uint8*>(addr)); break;
292  case triton::size::dqqword: value = triton::utils::fromBufferToUint<triton::uint512>(reinterpret_cast<triton::uint8*>(addr)); break;
293  }
294 
295  return value;
296  }
297 
298 
300  triton::uint8 buffer[triton::size::dqqword] = {0};
301 
302  if (reg.getId() != reg.getParent() || tracer::pintool::api.isFlag(reg))
303  throw std::runtime_error("tracer::pintool::context::setCurrentRegisterValue(): You cannot set a Pin register value on a sub-register or a flag.");
304 
306  return;
307 
308  triton::utils::fromUintToBuffer(value, buffer);
309 
310  #if defined(__x86_64__) || defined(_M_X64)
311  switch (reg.getId()) {
312  case triton::arch::ID_REG_X86_RAX: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RAX, reinterpret_cast<triton::uint8*>(buffer)); break;
313  case triton::arch::ID_REG_X86_RBX: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RBX, reinterpret_cast<triton::uint8*>(buffer)); break;
314  case triton::arch::ID_REG_X86_RCX: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RCX, reinterpret_cast<triton::uint8*>(buffer)); break;
315  case triton::arch::ID_REG_X86_RDX: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RDX, reinterpret_cast<triton::uint8*>(buffer)); break;
316  case triton::arch::ID_REG_X86_RDI: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RDI, reinterpret_cast<triton::uint8*>(buffer)); break;
317  case triton::arch::ID_REG_X86_RSI: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RSI, reinterpret_cast<triton::uint8*>(buffer)); break;
318  case triton::arch::ID_REG_X86_RBP: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RBP, reinterpret_cast<triton::uint8*>(buffer)); break;
319  case triton::arch::ID_REG_X86_RSP: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RSP, reinterpret_cast<triton::uint8*>(buffer)); break;
320  case triton::arch::ID_REG_X86_RIP: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RIP, reinterpret_cast<triton::uint8*>(buffer)); break;
321  case triton::arch::ID_REG_X86_EFLAGS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_RFLAGS, reinterpret_cast<triton::uint8*>(buffer)); break;
322  case triton::arch::ID_REG_X86_R8: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R8, reinterpret_cast<triton::uint8*>(buffer)); break;
323  case triton::arch::ID_REG_X86_R9: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R9, reinterpret_cast<triton::uint8*>(buffer)); break;
324  case triton::arch::ID_REG_X86_R10: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R10, reinterpret_cast<triton::uint8*>(buffer)); break;
325  case triton::arch::ID_REG_X86_R11: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R11, reinterpret_cast<triton::uint8*>(buffer)); break;
326  case triton::arch::ID_REG_X86_R12: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R12, reinterpret_cast<triton::uint8*>(buffer)); break;
327  case triton::arch::ID_REG_X86_R13: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R13, reinterpret_cast<triton::uint8*>(buffer)); break;
328  case triton::arch::ID_REG_X86_R14: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R14, reinterpret_cast<triton::uint8*>(buffer)); break;
329  case triton::arch::ID_REG_X86_R15: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_R15, reinterpret_cast<triton::uint8*>(buffer)); break;
330  case triton::arch::ID_REG_X86_XMM0: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM0, reinterpret_cast<triton::uint8*>(buffer)); break;
331  case triton::arch::ID_REG_X86_XMM1: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM1, reinterpret_cast<triton::uint8*>(buffer)); break;
332  case triton::arch::ID_REG_X86_XMM2: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM2, reinterpret_cast<triton::uint8*>(buffer)); break;
333  case triton::arch::ID_REG_X86_XMM3: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM3, reinterpret_cast<triton::uint8*>(buffer)); break;
334  case triton::arch::ID_REG_X86_XMM4: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM4, reinterpret_cast<triton::uint8*>(buffer)); break;
335  case triton::arch::ID_REG_X86_XMM5: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM5, reinterpret_cast<triton::uint8*>(buffer)); break;
336  case triton::arch::ID_REG_X86_XMM6: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM6, reinterpret_cast<triton::uint8*>(buffer)); break;
337  case triton::arch::ID_REG_X86_XMM7: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM7, reinterpret_cast<triton::uint8*>(buffer)); break;
338  case triton::arch::ID_REG_X86_XMM8: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM8, reinterpret_cast<triton::uint8*>(buffer)); break;
339  case triton::arch::ID_REG_X86_XMM9: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM9, reinterpret_cast<triton::uint8*>(buffer)); break;
340  case triton::arch::ID_REG_X86_XMM10: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM10, reinterpret_cast<triton::uint8*>(buffer)); break;
341  case triton::arch::ID_REG_X86_XMM11: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM11, reinterpret_cast<triton::uint8*>(buffer)); break;
342  case triton::arch::ID_REG_X86_XMM12: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM12, reinterpret_cast<triton::uint8*>(buffer)); break;
343  case triton::arch::ID_REG_X86_XMM13: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM13, reinterpret_cast<triton::uint8*>(buffer)); break;
344  case triton::arch::ID_REG_X86_XMM14: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM14, reinterpret_cast<triton::uint8*>(buffer)); break;
345  case triton::arch::ID_REG_X86_XMM15: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM15, reinterpret_cast<triton::uint8*>(buffer)); break;
346  case triton::arch::ID_REG_X86_YMM0: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM0, reinterpret_cast<triton::uint8*>(buffer)); break;
347  case triton::arch::ID_REG_X86_YMM1: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM1, reinterpret_cast<triton::uint8*>(buffer)); break;
348  case triton::arch::ID_REG_X86_YMM2: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM2, reinterpret_cast<triton::uint8*>(buffer)); break;
349  case triton::arch::ID_REG_X86_YMM3: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM3, reinterpret_cast<triton::uint8*>(buffer)); break;
350  case triton::arch::ID_REG_X86_YMM4: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM4, reinterpret_cast<triton::uint8*>(buffer)); break;
351  case triton::arch::ID_REG_X86_YMM5: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM5, reinterpret_cast<triton::uint8*>(buffer)); break;
352  case triton::arch::ID_REG_X86_YMM6: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM6, reinterpret_cast<triton::uint8*>(buffer)); break;
353  case triton::arch::ID_REG_X86_YMM7: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM7, reinterpret_cast<triton::uint8*>(buffer)); break;
354  case triton::arch::ID_REG_X86_YMM8: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM8, reinterpret_cast<triton::uint8*>(buffer)); break;
355  case triton::arch::ID_REG_X86_YMM9: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM9, reinterpret_cast<triton::uint8*>(buffer)); break;
356  case triton::arch::ID_REG_X86_YMM10: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM10, reinterpret_cast<triton::uint8*>(buffer)); break;
357  case triton::arch::ID_REG_X86_YMM11: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM11, reinterpret_cast<triton::uint8*>(buffer)); break;
358  case triton::arch::ID_REG_X86_YMM12: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM12, reinterpret_cast<triton::uint8*>(buffer)); break;
359  case triton::arch::ID_REG_X86_YMM13: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM13, reinterpret_cast<triton::uint8*>(buffer)); break;
360  case triton::arch::ID_REG_X86_YMM14: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM14, reinterpret_cast<triton::uint8*>(buffer)); break;
361  case triton::arch::ID_REG_X86_YMM15: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM15, reinterpret_cast<triton::uint8*>(buffer)); break;
362  case triton::arch::ID_REG_X86_MXCSR: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_MXCSR, reinterpret_cast<triton::uint8*>(buffer)); break;
363  case triton::arch::ID_REG_X86_CS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_CS, reinterpret_cast<triton::uint8*>(buffer)); break;
364  case triton::arch::ID_REG_X86_DS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_DS, reinterpret_cast<triton::uint8*>(buffer)); break;
365  case triton::arch::ID_REG_X86_ES: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_ES, reinterpret_cast<triton::uint8*>(buffer)); break;
366  case triton::arch::ID_REG_X86_FS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_FS, reinterpret_cast<triton::uint8*>(buffer)); break;
367  case triton::arch::ID_REG_X86_GS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_GS, reinterpret_cast<triton::uint8*>(buffer)); break;
368  case triton::arch::ID_REG_X86_SS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_SS, reinterpret_cast<triton::uint8*>(buffer)); break;
369  default:
370  throw std::runtime_error("tracer::pintool::context::setCurrentRegisterValue(): Invalid register.");
371  }
372  #endif
373 
374  #if defined(__i386) || defined(_M_IX86)
375  switch (reg.getId()) {
376  case triton::arch::ID_REG_X86_EAX: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EAX, reinterpret_cast<triton::uint8*>(buffer)); break;
377  case triton::arch::ID_REG_X86_EBX: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EBX, reinterpret_cast<triton::uint8*>(buffer)); break;
378  case triton::arch::ID_REG_X86_ECX: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_ECX, reinterpret_cast<triton::uint8*>(buffer)); break;
379  case triton::arch::ID_REG_X86_EDX: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EDX, reinterpret_cast<triton::uint8*>(buffer)); break;
380  case triton::arch::ID_REG_X86_EDI: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EDI, reinterpret_cast<triton::uint8*>(buffer)); break;
381  case triton::arch::ID_REG_X86_ESI: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_ESI, reinterpret_cast<triton::uint8*>(buffer)); break;
382  case triton::arch::ID_REG_X86_EBP: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EBP, reinterpret_cast<triton::uint8*>(buffer)); break;
383  case triton::arch::ID_REG_X86_ESP: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_ESP, reinterpret_cast<triton::uint8*>(buffer)); break;
384  case triton::arch::ID_REG_X86_EIP: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EIP, reinterpret_cast<triton::uint8*>(buffer)); break;
385  case triton::arch::ID_REG_X86_EFLAGS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_EFLAGS, reinterpret_cast<triton::uint8*>(buffer)); break;
386  case triton::arch::ID_REG_X86_XMM0: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM0, reinterpret_cast<triton::uint8*>(buffer)); break;
387  case triton::arch::ID_REG_X86_XMM1: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM1, reinterpret_cast<triton::uint8*>(buffer)); break;
388  case triton::arch::ID_REG_X86_XMM2: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM2, reinterpret_cast<triton::uint8*>(buffer)); break;
389  case triton::arch::ID_REG_X86_XMM3: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM3, reinterpret_cast<triton::uint8*>(buffer)); break;
390  case triton::arch::ID_REG_X86_XMM4: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM4, reinterpret_cast<triton::uint8*>(buffer)); break;
391  case triton::arch::ID_REG_X86_XMM5: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM5, reinterpret_cast<triton::uint8*>(buffer)); break;
392  case triton::arch::ID_REG_X86_XMM6: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM6, reinterpret_cast<triton::uint8*>(buffer)); break;
393  case triton::arch::ID_REG_X86_XMM7: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_XMM7, reinterpret_cast<triton::uint8*>(buffer)); break;
394  case triton::arch::ID_REG_X86_YMM0: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM0, reinterpret_cast<triton::uint8*>(buffer)); break;
395  case triton::arch::ID_REG_X86_YMM1: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM1, reinterpret_cast<triton::uint8*>(buffer)); break;
396  case triton::arch::ID_REG_X86_YMM2: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM2, reinterpret_cast<triton::uint8*>(buffer)); break;
397  case triton::arch::ID_REG_X86_YMM3: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM3, reinterpret_cast<triton::uint8*>(buffer)); break;
398  case triton::arch::ID_REG_X86_YMM4: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM4, reinterpret_cast<triton::uint8*>(buffer)); break;
399  case triton::arch::ID_REG_X86_YMM5: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM5, reinterpret_cast<triton::uint8*>(buffer)); break;
400  case triton::arch::ID_REG_X86_YMM6: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM6, reinterpret_cast<triton::uint8*>(buffer)); break;
401  case triton::arch::ID_REG_X86_YMM7: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_YMM7, reinterpret_cast<triton::uint8*>(buffer)); break;
402  case triton::arch::ID_REG_X86_MXCSR: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_MXCSR, reinterpret_cast<triton::uint8*>(buffer)); break;
403  case triton::arch::ID_REG_X86_CS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_CS, reinterpret_cast<triton::uint8*>(buffer)); break;
404  case triton::arch::ID_REG_X86_DS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_DS, reinterpret_cast<triton::uint8*>(buffer)); break;
405  case triton::arch::ID_REG_X86_ES: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_ES, reinterpret_cast<triton::uint8*>(buffer)); break;
406  case triton::arch::ID_REG_X86_FS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_FS, reinterpret_cast<triton::uint8*>(buffer)); break;
407  case triton::arch::ID_REG_X86_GS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_GS, reinterpret_cast<triton::uint8*>(buffer)); break;
408  case triton::arch::ID_REG_X86_SS: PIN_SetContextRegval(tracer::pintool::context::lastContext, LEVEL_BASE::REG_SEG_SS, reinterpret_cast<triton::uint8*>(buffer)); break;
409  default:
410  throw std::runtime_error("tracer::pintool::context::setCurrentRegisterValue(): Invalid register.");
411  }
412  #endif
413 
414  /* Sync with the libTriton */
415  const triton::arch::Register syncReg(reg);
417 
418  /* Define that the context must be executed as soon as possible */
420  }
421 
422 
424  triton::__uint addr = mem.getAddress();
425  triton::uint32 size = mem.getSize();
426 
427  /* Sync with the libTriton */
429 
430  /* Inject memory value */
431  for (triton::uint32 i = 0; i < size; i++) {
432  if (PIN_CheckWriteAccess(reinterpret_cast<triton::uint8*>((addr+i))) == false)
433  throw std::runtime_error("tracer::pintool::context::setCurrentMemoryValue(): Page not writable.");
434  *((triton::uint8 *)(addr+i)) = (value & 0xff).convert_to<triton::uint8>();
435  value >>= 8;
436  }
437  }
438 
439 
441  if (PIN_CheckWriteAccess(reinterpret_cast<triton::uint8*>(addr)) == false)
442  throw std::runtime_error("tracer::pintool::context::setCurrentMemoryValue(): Page not writable.");
443 
444  /* Sync with the libTriton */
446 
447  /* Inject memory value */
448  *((triton::uint8*)(addr)) = (value & 0xff);
449  }
450 
451 
452  void executeContext(void) {
454  PIN_UnlockClient();
456  }
457  }
458 
459 
463  }
464 
465 
466  void synchronizeContext(void) {
467  if (tracer::pintool::api.isSymbolicEngineEnabled() == false)
468  return;
469 
470  for (const triton::arch::Register* reg : tracer::pintool::api.getParentRegisters()) {
471  triton::arch::register_e regId = reg->getId();
472 
473  if (regId > triton::arch::ID_REG_X86_EFLAGS && !(regId >= triton::arch::ID_REG_X86_CS && regId <= triton::arch::ID_REG_X86_SS))
474  continue;
475 
478 
479  if (sv != cv) {
481  }
482  }
483  }
484 
485  };
486  };
487 };
This is used as C++ API.
Definition: api.hpp:42
TRITON_EXPORT const triton::arch::Register & getParentRegister(const triton::arch::Register &reg) const
[architecture api] - Returns parent Register from a register.
Definition: api.cpp:349
TRITON_EXPORT const triton::arch::Register & getRegister(triton::arch::register_e id) const
[architecture api] - Returns Register from regId.
Definition: api.cpp:339
TRITON_EXPORT triton::uint512 getSymbolicRegisterValue(const triton::arch::Register &reg)
[symbolic api] - Returns the symbolic register value.
Definition: api.cpp:857
TRITON_EXPORT void setConcreteMemoryValue(triton::uint64 addr, triton::uint8 value)
[architecture api] - Sets the concrete value of a memory cell.
Definition: api.cpp:430
TRITON_EXPORT triton::uint512 getConcreteRegisterValue(const triton::arch::Register &reg, bool execCallbacks=true) const
[architecture api] - Returns the concrete value of a register.
Definition: api.cpp:424
TRITON_EXPORT void setConcreteRegisterValue(const triton::arch::Register &reg, const triton::uint512 &value)
[architecture api] - Sets the concrete value of a register.
Definition: api.cpp:478
TRITON_EXPORT triton::arch::CpuInterface * getCpuInstance(void)
[architecture api] - Returns the instance of the current CPU used.
Definition: api.cpp:296
TRITON_EXPORT bool isFlag(triton::arch::register_e regId) const
[architecture api] - Returns true if the register id is a flag.
Definition: api.cpp:319
virtual TRITON_EXPORT void setConcreteRegisterValue(const triton::arch::Register &reg, const triton::uint512 &value)=0
[architecture api] - Sets the concrete value of a register.
virtual TRITON_EXPORT void setConcreteMemoryValue(triton::uint64 addr, triton::uint8 value)=0
[architecture api] - Sets the concrete value of a memory cell.
This class is used to represent a memory access.
TRITON_EXPORT triton::uint64 getAddress(void) const
Returns the address of the memory.
TRITON_EXPORT triton::uint32 getSize(void) const
Returns the size (in bytes) of the memory vector.
This class is used when an instruction has a register operand.
Definition: register.hpp:44
TRITON_EXPORT triton::arch::register_e getParent(void) const
Returns the parent id of the register.
Definition: register.cpp:58
TRITON_EXPORT triton::arch::register_e getId(void) const
Returns the id of the register.
Definition: register.cpp:53
register_e
Types of register.
Definition: archEnums.hpp:55
triton::uint512 getCurrentRegisterValue(const triton::arch::Register &reg)
Returns the current register value from a Register.
Definition: context.cpp:33
void needConcreteMemoryValue(triton::API &api, const triton::arch::MemoryAccess &mem)
Callback to provide concrete memory values only if Triton needs them - cf #632.
Definition: context.cpp:460
bool mustBeExecuted
True if the context must be executed.
Definition: context.cpp:30
void synchronizeContext(void)
Synchronize weird behavior from Pin to libTriton.
Definition: context.cpp:466
CONTEXT * lastContext
The last Pin CONTEXT known.
Definition: context.cpp:29
triton::uint512 getCurrentMemoryValue(const triton::arch::MemoryAccess &mem)
Returns the current memory value from a MemoryAccess.
Definition: context.cpp:262
void setCurrentMemoryValue(const triton::arch::MemoryAccess &mem, triton::uint512 value)
Sets the current memory value from a MemoryAccess.
Definition: context.cpp:423
void executeContext(void)
Executes the new context.
Definition: context.cpp:452
void setCurrentRegisterValue(const triton::arch::Register &reg, triton::uint512 value)
Sets the current register value from a Register.
Definition: context.cpp:299
triton::API api
Global triton API for pintools.
Definition: api.cpp:16
constexpr triton::uint32 dword
dword size in byte
Definition: cpuSize.hpp:34
constexpr triton::uint32 dqqword
dqqword size in byte
Definition: cpuSize.hpp:42
constexpr triton::uint32 word
word size in byte
Definition: cpuSize.hpp:32
constexpr triton::uint32 dqword
dqword size in byte
Definition: cpuSize.hpp:38
constexpr triton::uint32 byte
byte size in byte
Definition: cpuSize.hpp:30
constexpr triton::uint32 qword
qword size in byte
Definition: cpuSize.hpp:36
constexpr triton::uint32 qqword
qqword size in byte
Definition: cpuSize.hpp:40
std::uint16_t uint16
unisgned 16-bits
Definition: tritonTypes.hpp:28
boost::multiprecision::uint512_t uint512
unsigned 512-bits
Definition: tritonTypes.hpp:43
std::uint64_t uint64
unisgned 64-bits
Definition: tritonTypes.hpp:34
std::uint32_t uint32
unisgned 32-bits
Definition: tritonTypes.hpp:31
unsigned long long __uint
unsigned long long if the arch is 64-bits.
Definition: tritonTypes.hpp:71
std::uint8_t uint8
unisgned 8-bits
Definition: tritonTypes.hpp:25
TRITON_EXPORT void fromUintToBuffer(triton::uint128 value, triton::uint8 *buffer)
Inject the value into the buffer. Make sure that the buffer contains at least 16 allocated bytes.
Definition: coreUtils.cpp:20
The Tracer namespace.
Definition: api.cpp:12