Arion 1.0.2-alpha
A high-performance C++ framework for emulating executable binaries.
 
Loading...
Searching...
No Matches
arch_x86-64.hpp
Go to the documentation of this file.
1#ifndef ARION_ARCH_X8664_HPP
2#define ARION_ARCH_X8664_HPP
3
6#include <cstdint>
7#include <map>
8#include <string>
9
10namespace arion
11{
12
13class Arion;
14
15};
16
17namespace arion_x86_64
18{
19
21inline std::map<uint64_t, std::string> NAME_BY_SYSCALL_NO = {{0, "read"},
22 {1, "write"},
23 {2, "open"},
24 {3, "close"},
25 {4, "newstat"},
26 {5, "newfstat"},
27 {6, "newlstat"},
28 {7, "poll"},
29 {8, "lseek"},
30 {9, "mmap"},
31 {10, "mprotect"},
32 {11, "munmap"},
33 {12, "brk"},
34 {13, "rt_sigaction"},
35 {14, "rt_sigprocmask"},
36 {15, "rt_sigreturn"},
37 {16, "ioctl"},
38 {17, "pread64"},
39 {18, "pwrite64"},
40 {19, "readv"},
41 {20, "writev"},
42 {21, "access"},
43 {22, "pipe"},
44 {23, "select"},
45 {24, "sched_yield"},
46 {25, "mremap"},
47 {26, "msync"},
48 {27, "mincore"},
49 {28, "madvise"},
50 {29, "shmget"},
51 {30, "shmat"},
52 {31, "shmctl"},
53 {32, "dup"},
54 {33, "dup2"},
55 {34, "pause"},
56 {35, "nanosleep"},
57 {36, "getitimer"},
58 {37, "alarm"},
59 {38, "setitimer"},
60 {39, "getpid"},
61 {40, "sendfile64"},
62 {41, "socket"},
63 {42, "connect"},
64 {43, "accept"},
65 {44, "sendto"},
66 {45, "recvfrom"},
67 {46, "sendmsg"},
68 {47, "recvmsg"},
69 {48, "shutdown"},
70 {49, "bind"},
71 {50, "listen"},
72 {51, "getsockname"},
73 {52, "getpeername"},
74 {53, "socketpair"},
75 {54, "setsockopt"},
76 {55, "getsockopt"},
77 {56, "clone"},
78 {57, "fork"},
79 {58, "vfork"},
80 {59, "execve"},
81 {60, "exit"},
82 {61, "wait4"},
83 {62, "kill"},
84 {63, "newuname"},
85 {64, "semget"},
86 {65, "semop"},
87 {66, "semctl"},
88 {67, "shmdt"},
89 {68, "msgget"},
90 {69, "msgsnd"},
91 {70, "msgrcv"},
92 {71, "msgctl"},
93 {72, "fcntl"},
94 {73, "flock"},
95 {74, "fsync"},
96 {75, "fdatasync"},
97 {76, "truncate"},
98 {77, "ftruncate"},
99 {78, "getdents"},
100 {79, "getcwd"},
101 {80, "chdir"},
102 {81, "fchdir"},
103 {82, "rename"},
104 {83, "mkdir"},
105 {84, "rmdir"},
106 {85, "creat"},
107 {86, "link"},
108 {87, "unlink"},
109 {88, "symlink"},
110 {89, "readlink"},
111 {90, "chmod"},
112 {91, "fchmod"},
113 {92, "chown"},
114 {93, "fchown"},
115 {94, "lchown"},
116 {95, "umask"},
117 {96, "gettimeofday"},
118 {97, "getrlimit"},
119 {98, "getrusage"},
120 {99, "sysinfo"},
121 {100, "times"},
122 {101, "ptrace"},
123 {102, "getuid"},
124 {103, "syslog"},
125 {104, "getgid"},
126 {105, "setuid"},
127 {106, "setgid"},
128 {107, "geteuid"},
129 {108, "getegid"},
130 {109, "setpgid"},
131 {110, "getppid"},
132 {111, "getpgrp"},
133 {112, "setsid"},
134 {113, "setreuid"},
135 {114, "setregid"},
136 {115, "getgroups"},
137 {116, "setgroups"},
138 {117, "setresuid"},
139 {118, "getresuid"},
140 {119, "setresgid"},
141 {120, "getresgid"},
142 {121, "getpgid"},
143 {122, "setfsuid"},
144 {123, "setfsgid"},
145 {124, "getsid"},
146 {125, "capget"},
147 {126, "capset"},
148 {127, "rt_sigpending"},
149 {128, "rt_sigtimedwait"},
150 {129, "rt_sigqueueinfo"},
151 {130, "rt_sigsuspend"},
152 {131, "sigaltstack"},
153 {132, "utime"},
154 {133, "mknod"},
155 {135, "personality"},
156 {136, "ustat"},
157 {137, "statfs"},
158 {138, "fstatfs"},
159 {139, "sysfs"},
160 {140, "getpriority"},
161 {141, "setpriority"},
162 {142, "sched_setparam"},
163 {143, "sched_getparam"},
164 {144, "sched_setscheduler"},
165 {145, "sched_getscheduler"},
166 {146, "sched_get_priority_max"},
167 {147, "sched_get_priority_min"},
168 {148, "sched_rr_get_interval"},
169 {149, "mlock"},
170 {150, "munlock"},
171 {151, "mlockall"},
172 {152, "munlockall"},
173 {153, "vhangup"},
174 {154, "modify_ldt"},
175 {155, "pivot_root"},
176 {157, "prctl"},
177 {158, "arch_prctl"},
178 {159, "adjtimex"},
179 {160, "setrlimit"},
180 {161, "chroot"},
181 {162, "sync"},
182 {163, "acct"},
183 {164, "settimeofday"},
184 {165, "mount"},
185 {166, "umount"},
186 {167, "swapon"},
187 {168, "swapoff"},
188 {169, "reboot"},
189 {170, "sethostname"},
190 {171, "setdomainname"},
191 {172, "iopl"},
192 {173, "ioperm"},
193 {175, "init_module"},
194 {176, "delete_module"},
195 {179, "quotactl"},
196 {186, "gettid"},
197 {187, "readahead"},
198 {188, "setxattr"},
199 {189, "lsetxattr"},
200 {190, "fsetxattr"},
201 {191, "getxattr"},
202 {192, "lgetxattr"},
203 {193, "fgetxattr"},
204 {194, "listxattr"},
205 {195, "llistxattr"},
206 {196, "flistxattr"},
207 {197, "removexattr"},
208 {198, "lremovexattr"},
209 {199, "fremovexattr"},
210 {200, "tkill"},
211 {201, "time"},
212 {202, "futex"},
213 {203, "sched_setaffinity"},
214 {204, "sched_getaffinity"},
215 {206, "io_setup"},
216 {207, "io_destroy"},
217 {208, "io_getevents"},
218 {209, "io_submit"},
219 {210, "io_cancel"},
220 {213, "epoll_create"},
221 {216, "remap_file_pages"},
222 {217, "getdents64"},
223 {218, "set_tid_address"},
224 {219, "restart_syscall"},
225 {220, "semtimedop"},
226 {221, "fadvise64"},
227 {222, "timer_create"},
228 {223, "timer_settime"},
229 {224, "timer_gettime"},
230 {225, "timer_getoverrun"},
231 {226, "timer_delete"},
232 {227, "clock_settime"},
233 {228, "clock_gettime"},
234 {229, "clock_getres"},
235 {230, "clock_nanosleep"},
236 {231, "exit_group"},
237 {232, "epoll_wait"},
238 {233, "epoll_ctl"},
239 {234, "tgkill"},
240 {235, "utimes"},
241 {237, "mbind"},
242 {238, "set_mempolicy"},
243 {239, "get_mempolicy"},
244 {240, "mq_open"},
245 {241, "mq_unlink"},
246 {242, "mq_timedsend"},
247 {243, "mq_timedreceive"},
248 {244, "mq_notify"},
249 {245, "mq_getsetattr"},
250 {246, "kexec_load"},
251 {247, "waitid"},
252 {248, "add_key"},
253 {249, "request_key"},
254 {250, "keyctl"},
255 {251, "ioprio_set"},
256 {252, "ioprio_get"},
257 {253, "inotify_init"},
258 {254, "inotify_add_watch"},
259 {255, "inotify_rm_watch"},
260 {256, "migrate_pages"},
261 {257, "openat"},
262 {258, "mkdirat"},
263 {259, "mknodat"},
264 {260, "fchownat"},
265 {261, "futimesat"},
266 {262, "newfstatat"},
267 {263, "unlinkat"},
268 {264, "renameat"},
269 {265, "linkat"},
270 {266, "symlinkat"},
271 {267, "readlinkat"},
272 {268, "fchmodat"},
273 {269, "faccessat"},
274 {270, "pselect6"},
275 {271, "ppoll"},
276 {272, "unshare"},
277 {273, "set_robust_list"},
278 {274, "get_robust_list"},
279 {275, "splice"},
280 {276, "tee"},
281 {277, "sync_file_range"},
282 {278, "vmsplice"},
283 {279, "move_pages"},
284 {280, "utimensat"},
285 {281, "epoll_pwait"},
286 {282, "signalfd"},
287 {283, "timerfd_create"},
288 {284, "eventfd"},
289 {285, "fallocate"},
290 {286, "timerfd_settime"},
291 {287, "timerfd_gettime"},
292 {288, "accept4"},
293 {289, "signalfd4"},
294 {290, "eventfd2"},
295 {291, "epoll_create1"},
296 {292, "dup3"},
297 {293, "pipe2"},
298 {294, "inotify_init1"},
299 {295, "preadv"},
300 {296, "pwritev"},
301 {297, "rt_tgsigqueueinfo"},
302 {298, "perf_event_open"},
303 {299, "recvmmsg"},
304 {300, "fanotify_init"},
305 {301, "fanotify_mark"},
306 {302, "prlimit64"},
307 {303, "name_to_handle_at"},
308 {304, "open_by_handle_at"},
309 {305, "clock_adjtime"},
310 {306, "syncfs"},
311 {307, "sendmmsg"},
312 {308, "setns"},
313 {309, "getcpu"},
314 {310, "process_vm_readv"},
315 {311, "process_vm_writev"},
316 {312, "kcmp"},
317 {313, "finit_module"},
318 {314, "sched_setattr"},
319 {315, "sched_getattr"},
320 {316, "renameat2"},
321 {317, "seccomp"},
322 {318, "getrandom"},
323 {319, "memfd_create"},
324 {320, "kexec_file_load"},
325 {321, "bpf"},
326 {322, "execveat"},
327 {323, "userfaultfd"},
328 {324, "membarrier"},
329 {325, "mlock2"},
330 {326, "copy_file_range"},
331 {327, "preadv2"},
332 {328, "pwritev2"},
333 {329, "pkey_mprotect"},
334 {330, "pkey_alloc"},
335 {331, "pkey_free"},
336 {332, "statx"},
337 {333, "io_pgetevents"},
338 {334, "rseq"},
339 {335, "uretprobe"},
340 {424, "pidfd_send_signal"},
341 {425, "io_uring_setup"},
342 {426, "io_uring_enter"},
343 {427, "io_uring_register"},
344 {428, "open_tree"},
345 {429, "move_mount"},
346 {430, "fsopen"},
347 {431, "fsconfig"},
348 {432, "fsmount"},
349 {433, "fspick"},
350 {434, "pidfd_open"},
351 {435, "clone3"},
352 {436, "close_range"},
353 {437, "openat2"},
354 {438, "pidfd_getfd"},
355 {439, "faccessat2"},
356 {440, "process_madvise"},
357 {441, "epoll_pwait2"},
358 {442, "mount_setattr"},
359 {443, "quotactl_fd"},
360 {444, "landlock_create_ruleset"},
361 {445, "landlock_add_rule"},
362 {446, "landlock_restrict_self"},
363 {447, "memfd_secret"},
364 {448, "process_mrelease"},
365 {449, "futex_waitv"},
366 {450, "set_mempolicy_home_node"},
367 {451, "cachestat"},
368 {452, "fchmodat2"},
369 {453, "map_shadow_stack"},
370 {454, "futex_wake"},
371 {455, "futex_wait"},
372 {456, "futex_requeue"},
373 {457, "statmount"},
374 {458, "listmount"},
375 {459, "lsm_get_self_attr"},
376 {460, "lsm_set_self_attr"},
377 {461, "lsm_list_modules"},
378 {462, "mseal"}};
379
381inline std::map<std::string, arion::REG> ARCH_REGS = {
382 {"AH", UC_X86_REG_AH}, {"AL", UC_X86_REG_AL}, {"AX", UC_X86_REG_AX},
383 {"BH", UC_X86_REG_BH}, {"BL", UC_X86_REG_BL}, {"BP", UC_X86_REG_BP},
384 {"BPL", UC_X86_REG_BPL}, {"BX", UC_X86_REG_BX}, {"CH", UC_X86_REG_CH},
385 {"CL", UC_X86_REG_CL}, {"CS", UC_X86_REG_CS}, {"CX", UC_X86_REG_CX},
386 {"DH", UC_X86_REG_DH}, {"DI", UC_X86_REG_DI}, {"DIL", UC_X86_REG_DIL},
387 {"DL", UC_X86_REG_DL}, {"DS", UC_X86_REG_DS}, {"DX", UC_X86_REG_DX},
388 {"EAX", UC_X86_REG_EAX}, {"EBP", UC_X86_REG_EBP}, {"EBX", UC_X86_REG_EBX},
389 {"ECX", UC_X86_REG_ECX}, {"EDI", UC_X86_REG_EDI}, {"EDX", UC_X86_REG_EDX},
390 {"EIP", UC_X86_REG_EIP}, {"ES", UC_X86_REG_ES}, {"ESI", UC_X86_REG_ESI},
391 {"ESP", UC_X86_REG_ESP}, {"FPSW", UC_X86_REG_FPSW}, {"FS", UC_X86_REG_FS},
392 {"GS", UC_X86_REG_GS}, {"IP", UC_X86_REG_IP}, {"RAX", UC_X86_REG_RAX},
393 {"RBP", UC_X86_REG_RBP}, {"RBX", UC_X86_REG_RBX}, {"RCX", UC_X86_REG_RCX},
394 {"RDI", UC_X86_REG_RDI}, {"RDX", UC_X86_REG_RDX}, {"RIP", UC_X86_REG_RIP},
395 {"RSI", UC_X86_REG_RSI}, {"RSP", UC_X86_REG_RSP}, {"SI", UC_X86_REG_SI},
396 {"SIL", UC_X86_REG_SIL}, {"SP", UC_X86_REG_SP}, {"SPL", UC_X86_REG_SPL},
397 {"SS", UC_X86_REG_SS}, {"CR0", UC_X86_REG_CR0}, {"CR1", UC_X86_REG_CR1},
398 {"CR2", UC_X86_REG_CR2}, {"CR3", UC_X86_REG_CR3}, {"CR4", UC_X86_REG_CR4},
399 {"CR8", UC_X86_REG_CR8}, {"DR0", UC_X86_REG_DR0}, {"DR1", UC_X86_REG_DR1},
400 {"DR2", UC_X86_REG_DR2}, {"DR3", UC_X86_REG_DR3}, {"DR4", UC_X86_REG_DR4},
401 {"DR5", UC_X86_REG_DR5}, {"DR6", UC_X86_REG_DR6}, {"DR7", UC_X86_REG_DR7},
402 {"FP0", UC_X86_REG_FP0}, {"FP1", UC_X86_REG_FP1}, {"FP2", UC_X86_REG_FP2},
403 {"FP3", UC_X86_REG_FP3}, {"FP4", UC_X86_REG_FP4}, {"FP5", UC_X86_REG_FP5},
404 {"FP6", UC_X86_REG_FP6}, {"FP7", UC_X86_REG_FP7}, {"R8", UC_X86_REG_R8},
405 {"R9", UC_X86_REG_R9}, {"R10", UC_X86_REG_R10}, {"R11", UC_X86_REG_R11},
406 {"R12", UC_X86_REG_R12}, {"R13", UC_X86_REG_R13}, {"R14", UC_X86_REG_R14},
407 {"R15", UC_X86_REG_R15}, {"ST0", UC_X86_REG_ST0}, {"ST1", UC_X86_REG_ST1},
408 {"ST2", UC_X86_REG_ST2}, {"ST3", UC_X86_REG_ST3}, {"ST4", UC_X86_REG_ST4},
409 {"ST5", UC_X86_REG_ST5}, {"ST6", UC_X86_REG_ST6}, {"ST7", UC_X86_REG_ST7},
410 {"XMM0", UC_X86_REG_XMM0}, {"XMM1", UC_X86_REG_XMM1}, {"XMM2", UC_X86_REG_XMM2},
411 {"XMM3", UC_X86_REG_XMM3}, {"XMM4", UC_X86_REG_XMM4}, {"XMM5", UC_X86_REG_XMM5},
412 {"XMM6", UC_X86_REG_XMM6}, {"XMM7", UC_X86_REG_XMM7}, {"XMM8", UC_X86_REG_XMM8},
413 {"XMM9", UC_X86_REG_XMM9}, {"XMM10", UC_X86_REG_XMM10}, {"XMM11", UC_X86_REG_XMM11},
414 {"XMM12", UC_X86_REG_XMM12}, {"XMM13", UC_X86_REG_XMM13}, {"XMM14", UC_X86_REG_XMM14},
415 {"XMM15", UC_X86_REG_XMM15}, {"XMM16", UC_X86_REG_XMM16}, {"XMM17", UC_X86_REG_XMM17},
416 {"XMM18", UC_X86_REG_XMM18}, {"XMM19", UC_X86_REG_XMM19}, {"XMM20", UC_X86_REG_XMM20},
417 {"XMM21", UC_X86_REG_XMM21}, {"XMM22", UC_X86_REG_XMM22}, {"XMM23", UC_X86_REG_XMM23},
418 {"XMM24", UC_X86_REG_XMM24}, {"XMM25", UC_X86_REG_XMM25}, {"XMM26", UC_X86_REG_XMM26},
419 {"XMM27", UC_X86_REG_XMM27}, {"XMM28", UC_X86_REG_XMM28}, {"XMM29", UC_X86_REG_XMM29},
420 {"XMM30", UC_X86_REG_XMM30}, {"XMM31", UC_X86_REG_XMM31}, {"YMM0", UC_X86_REG_YMM0},
421 {"YMM1", UC_X86_REG_YMM1}, {"YMM2", UC_X86_REG_YMM2}, {"YMM3", UC_X86_REG_YMM3},
422 {"YMM4", UC_X86_REG_YMM4}, {"YMM5", UC_X86_REG_YMM5}, {"YMM6", UC_X86_REG_YMM6},
423 {"YMM7", UC_X86_REG_YMM7}, {"YMM8", UC_X86_REG_YMM8}, {"YMM9", UC_X86_REG_YMM9},
424 {"YMM10", UC_X86_REG_YMM10}, {"YMM11", UC_X86_REG_YMM11}, {"YMM12", UC_X86_REG_YMM12},
425 {"YMM13", UC_X86_REG_YMM13}, {"YMM14", UC_X86_REG_YMM14}, {"YMM15", UC_X86_REG_YMM15},
426 {"YMM16", UC_X86_REG_YMM16}, {"YMM17", UC_X86_REG_YMM17}, {"YMM18", UC_X86_REG_YMM18},
427 {"YMM19", UC_X86_REG_YMM19}, {"YMM20", UC_X86_REG_YMM20}, {"YMM21", UC_X86_REG_YMM21},
428 {"YMM22", UC_X86_REG_YMM22}, {"YMM23", UC_X86_REG_YMM23}, {"YMM24", UC_X86_REG_YMM24},
429 {"YMM25", UC_X86_REG_YMM25}, {"YMM26", UC_X86_REG_YMM26}, {"YMM27", UC_X86_REG_YMM27},
430 {"YMM28", UC_X86_REG_YMM28}, {"YMM29", UC_X86_REG_YMM29}, {"YMM30", UC_X86_REG_YMM30},
431 {"YMM31", UC_X86_REG_YMM31}, {"ZMM0", UC_X86_REG_ZMM0}, {"ZMM1", UC_X86_REG_ZMM1},
432 {"ZMM2", UC_X86_REG_ZMM2}, {"ZMM3", UC_X86_REG_ZMM3}, {"ZMM4", UC_X86_REG_ZMM4},
433 {"ZMM5", UC_X86_REG_ZMM5}, {"ZMM6", UC_X86_REG_ZMM6}, {"ZMM7", UC_X86_REG_ZMM7},
434 {"ZMM8", UC_X86_REG_ZMM8}, {"ZMM9", UC_X86_REG_ZMM9}, {"ZMM10", UC_X86_REG_ZMM10},
435 {"ZMM11", UC_X86_REG_ZMM11}, {"ZMM12", UC_X86_REG_ZMM12}, {"ZMM13", UC_X86_REG_ZMM13},
436 {"ZMM14", UC_X86_REG_ZMM14}, {"ZMM15", UC_X86_REG_ZMM15}, {"ZMM16", UC_X86_REG_ZMM16},
437 {"ZMM17", UC_X86_REG_ZMM17}, {"ZMM18", UC_X86_REG_ZMM18}, {"ZMM19", UC_X86_REG_ZMM19},
438 {"ZMM20", UC_X86_REG_ZMM20}, {"ZMM21", UC_X86_REG_ZMM21}, {"ZMM22", UC_X86_REG_ZMM22},
439 {"ZMM23", UC_X86_REG_ZMM23}, {"ZMM24", UC_X86_REG_ZMM24}, {"ZMM25", UC_X86_REG_ZMM25},
440 {"ZMM26", UC_X86_REG_ZMM26}, {"ZMM27", UC_X86_REG_ZMM27}, {"ZMM28", UC_X86_REG_ZMM28},
441 {"ZMM29", UC_X86_REG_ZMM29}, {"ZMM30", UC_X86_REG_ZMM30}, {"ZMM31", UC_X86_REG_ZMM31},
442 {"R8B", UC_X86_REG_R8B}, {"R9B", UC_X86_REG_R9B}, {"R10B", UC_X86_REG_R10B},
443 {"R11B", UC_X86_REG_R11B}, {"R12B", UC_X86_REG_R12B}, {"R13B", UC_X86_REG_R13B},
444 {"R14B", UC_X86_REG_R14B}, {"R15B", UC_X86_REG_R15B}, {"R8D", UC_X86_REG_R8D},
445 {"R9D", UC_X86_REG_R9D}, {"R10D", UC_X86_REG_R10D}, {"R11D", UC_X86_REG_R11D},
446 {"R12D", UC_X86_REG_R12D}, {"R13D", UC_X86_REG_R13D}, {"R14D", UC_X86_REG_R14D},
447 {"R15D", UC_X86_REG_R15D}, {"R8W", UC_X86_REG_R8W}, {"R9W", UC_X86_REG_R9W},
448 {"R10W", UC_X86_REG_R10W}, {"R11W", UC_X86_REG_R11W}, {"R12W", UC_X86_REG_R12W},
449 {"R13W", UC_X86_REG_R13W}, {"R14W", UC_X86_REG_R14W}, {"R15W", UC_X86_REG_R15W},
450 {"IDTR", UC_X86_REG_IDTR}, {"GDTR", UC_X86_REG_GDTR}, {"LDTR", UC_X86_REG_LDTR},
451 {"TR", UC_X86_REG_TR}, {"FPCW", UC_X86_REG_FPCW}, {"FPTAG", UC_X86_REG_FPTAG},
452 {"MSR", UC_X86_REG_MSR}, {"MXCSR", UC_X86_REG_MXCSR}, {"FS_BASE", UC_X86_REG_FS_BASE},
453 {"GS_BASE", UC_X86_REG_GS_BASE}, {"FLAGS", UC_X86_REG_FLAGS}, {"EFLAGS", UC_X86_REG_EFLAGS},
454 {"RFLAGS", UC_X86_REG_RFLAGS}, {"FIP", UC_X86_REG_FIP}, {"FCS", UC_X86_REG_FCS},
455 {"FDP", UC_X86_REG_FDP}, {"FDS", UC_X86_REG_FDS}, {"FOP", UC_X86_REG_FOP}};
456
458inline std::map<arion::REG, uint8_t> ARCH_REGS_SZ = {
459 {UC_X86_REG_AH, 1}, {UC_X86_REG_AL, 1}, {UC_X86_REG_AX, 2}, {UC_X86_REG_BH, 1},
460 {UC_X86_REG_BL, 1}, {UC_X86_REG_BP, 2}, {UC_X86_REG_BPL, 1}, {UC_X86_REG_BX, 2},
461 {UC_X86_REG_CH, 1}, {UC_X86_REG_CL, 1}, {UC_X86_REG_CS, 2}, {UC_X86_REG_CX, 2},
462 {UC_X86_REG_DH, 1}, {UC_X86_REG_DI, 2}, {UC_X86_REG_DIL, 1}, {UC_X86_REG_DL, 1},
463 {UC_X86_REG_DS, 2}, {UC_X86_REG_DX, 2}, {UC_X86_REG_EAX, 4}, {UC_X86_REG_EBP, 4},
464 {UC_X86_REG_EBX, 4}, {UC_X86_REG_ECX, 4}, {UC_X86_REG_EDI, 4}, {UC_X86_REG_EDX, 4},
465 {UC_X86_REG_EIP, 4}, {UC_X86_REG_ES, 2}, {UC_X86_REG_ESI, 4}, {UC_X86_REG_ESP, 4},
466 {UC_X86_REG_FPSW, 2}, {UC_X86_REG_FS, 2}, {UC_X86_REG_GS, 2}, {UC_X86_REG_IP, 2},
467 {UC_X86_REG_RAX, 8}, {UC_X86_REG_RBP, 8}, {UC_X86_REG_RBX, 8}, {UC_X86_REG_RCX, 8},
468 {UC_X86_REG_RDI, 8}, {UC_X86_REG_RDX, 8}, {UC_X86_REG_RIP, 8}, {UC_X86_REG_RSI, 8},
469 {UC_X86_REG_RSP, 8}, {UC_X86_REG_SI, 2}, {UC_X86_REG_SIL, 1}, {UC_X86_REG_SP, 2},
470 {UC_X86_REG_SPL, 1}, {UC_X86_REG_SS, 2}, {UC_X86_REG_CR0, 8}, {UC_X86_REG_CR1, 8},
471 {UC_X86_REG_CR2, 8}, {UC_X86_REG_CR3, 8}, {UC_X86_REG_CR4, 8}, {UC_X86_REG_CR8, 8},
472 {UC_X86_REG_DR0, 8}, {UC_X86_REG_DR1, 8}, {UC_X86_REG_DR2, 8}, {UC_X86_REG_DR3, 8},
473 {UC_X86_REG_DR4, 8}, {UC_X86_REG_DR5, 8}, {UC_X86_REG_DR6, 8}, {UC_X86_REG_DR7, 8},
474 {UC_X86_REG_FP0, 10}, {UC_X86_REG_FP1, 10}, {UC_X86_REG_FP2, 10}, {UC_X86_REG_FP3, 10},
475 {UC_X86_REG_FP4, 10}, {UC_X86_REG_FP5, 10}, {UC_X86_REG_FP6, 10}, {UC_X86_REG_FP7, 10},
476 {UC_X86_REG_R8, 8}, {UC_X86_REG_R9, 8}, {UC_X86_REG_R10, 8}, {UC_X86_REG_R11, 8},
477 {UC_X86_REG_R12, 8}, {UC_X86_REG_R13, 8}, {UC_X86_REG_R14, 8}, {UC_X86_REG_R15, 8},
478 {UC_X86_REG_ST0, 10}, {UC_X86_REG_ST1, 10}, {UC_X86_REG_ST2, 10}, {UC_X86_REG_ST3, 10},
479 {UC_X86_REG_ST4, 10}, {UC_X86_REG_ST5, 10}, {UC_X86_REG_ST6, 10}, {UC_X86_REG_ST7, 10},
480 {UC_X86_REG_XMM0, 16}, {UC_X86_REG_XMM1, 16}, {UC_X86_REG_XMM2, 16}, {UC_X86_REG_XMM3, 16},
481 {UC_X86_REG_XMM4, 16}, {UC_X86_REG_XMM5, 16}, {UC_X86_REG_XMM6, 16}, {UC_X86_REG_XMM7, 16},
482 {UC_X86_REG_XMM8, 16}, {UC_X86_REG_XMM9, 16}, {UC_X86_REG_XMM10, 16}, {UC_X86_REG_XMM11, 16},
483 {UC_X86_REG_XMM12, 16}, {UC_X86_REG_XMM13, 16}, {UC_X86_REG_XMM14, 16}, {UC_X86_REG_XMM15, 16},
484 {UC_X86_REG_XMM16, 16}, {UC_X86_REG_XMM17, 16}, {UC_X86_REG_XMM18, 16}, {UC_X86_REG_XMM19, 16},
485 {UC_X86_REG_XMM20, 16}, {UC_X86_REG_XMM21, 16}, {UC_X86_REG_XMM22, 16}, {UC_X86_REG_XMM23, 16},
486 {UC_X86_REG_XMM24, 16}, {UC_X86_REG_XMM25, 16}, {UC_X86_REG_XMM26, 16}, {UC_X86_REG_XMM27, 16},
487 {UC_X86_REG_XMM28, 16}, {UC_X86_REG_XMM29, 16}, {UC_X86_REG_XMM30, 16}, {UC_X86_REG_XMM31, 16},
488 {UC_X86_REG_YMM0, 32}, {UC_X86_REG_YMM1, 32}, {UC_X86_REG_YMM2, 32}, {UC_X86_REG_YMM3, 32},
489 {UC_X86_REG_YMM4, 32}, {UC_X86_REG_YMM5, 32}, {UC_X86_REG_YMM6, 32}, {UC_X86_REG_YMM7, 32},
490 {UC_X86_REG_YMM8, 32}, {UC_X86_REG_YMM9, 32}, {UC_X86_REG_YMM10, 32}, {UC_X86_REG_YMM11, 32},
491 {UC_X86_REG_YMM12, 32}, {UC_X86_REG_YMM13, 32}, {UC_X86_REG_YMM14, 32}, {UC_X86_REG_YMM15, 32},
492 {UC_X86_REG_YMM16, 32}, {UC_X86_REG_YMM17, 32}, {UC_X86_REG_YMM18, 32}, {UC_X86_REG_YMM19, 32},
493 {UC_X86_REG_YMM20, 32}, {UC_X86_REG_YMM21, 32}, {UC_X86_REG_YMM22, 32}, {UC_X86_REG_YMM23, 32},
494 {UC_X86_REG_YMM24, 32}, {UC_X86_REG_YMM25, 32}, {UC_X86_REG_YMM26, 32}, {UC_X86_REG_YMM27, 32},
495 {UC_X86_REG_YMM28, 32}, {UC_X86_REG_YMM29, 32}, {UC_X86_REG_YMM30, 32}, {UC_X86_REG_YMM31, 32},
496 {UC_X86_REG_ZMM0, 64}, {UC_X86_REG_ZMM1, 64}, {UC_X86_REG_ZMM2, 64}, {UC_X86_REG_ZMM3, 64},
497 {UC_X86_REG_ZMM4, 64}, {UC_X86_REG_ZMM5, 64}, {UC_X86_REG_ZMM6, 64}, {UC_X86_REG_ZMM7, 64},
498 {UC_X86_REG_ZMM8, 64}, {UC_X86_REG_ZMM9, 64}, {UC_X86_REG_ZMM10, 64}, {UC_X86_REG_ZMM11, 64},
499 {UC_X86_REG_ZMM12, 64}, {UC_X86_REG_ZMM13, 64}, {UC_X86_REG_ZMM14, 64}, {UC_X86_REG_ZMM15, 64},
500 {UC_X86_REG_ZMM16, 64}, {UC_X86_REG_ZMM17, 64}, {UC_X86_REG_ZMM18, 64}, {UC_X86_REG_ZMM19, 64},
501 {UC_X86_REG_ZMM20, 64}, {UC_X86_REG_ZMM21, 64}, {UC_X86_REG_ZMM22, 64}, {UC_X86_REG_ZMM23, 64},
502 {UC_X86_REG_ZMM24, 64}, {UC_X86_REG_ZMM25, 64}, {UC_X86_REG_ZMM26, 64}, {UC_X86_REG_ZMM27, 64},
503 {UC_X86_REG_ZMM28, 64}, {UC_X86_REG_ZMM29, 64}, {UC_X86_REG_ZMM30, 64}, {UC_X86_REG_ZMM31, 64},
504 {UC_X86_REG_R8B, 1}, {UC_X86_REG_R9B, 1}, {UC_X86_REG_R10B, 1}, {UC_X86_REG_R11B, 1},
505 {UC_X86_REG_R12B, 1}, {UC_X86_REG_R13B, 1}, {UC_X86_REG_R14B, 1}, {UC_X86_REG_R15B, 1},
506 {UC_X86_REG_R8D, 4}, {UC_X86_REG_R9D, 4}, {UC_X86_REG_R10D, 4}, {UC_X86_REG_R11D, 4},
507 {UC_X86_REG_R12D, 4}, {UC_X86_REG_R13D, 4}, {UC_X86_REG_R14D, 4}, {UC_X86_REG_R15D, 4},
508 {UC_X86_REG_R8W, 2}, {UC_X86_REG_R9W, 2}, {UC_X86_REG_R10W, 2}, {UC_X86_REG_R11W, 2},
509 {UC_X86_REG_R12W, 2}, {UC_X86_REG_R13W, 2}, {UC_X86_REG_R14W, 2}, {UC_X86_REG_R15W, 2},
510 {UC_X86_REG_IDTR, 24}, {UC_X86_REG_GDTR, 24}, {UC_X86_REG_LDTR, 24}, {UC_X86_REG_TR, 24},
511 {UC_X86_REG_FPCW, 2}, {UC_X86_REG_FPTAG, 2}, {UC_X86_REG_MSR, 16}, {UC_X86_REG_MXCSR, 4},
512 {UC_X86_REG_FS_BASE, 8}, {UC_X86_REG_GS_BASE, 8}, {UC_X86_REG_FLAGS, 2}, {UC_X86_REG_EFLAGS, 4},
513 {UC_X86_REG_RFLAGS, 8}, {UC_X86_REG_FIP, 8}, {UC_X86_REG_FCS, 2}, {UC_X86_REG_FDP, 8},
514 {UC_X86_REG_FDS, 2}, {UC_X86_REG_FOP, 2}};
515
517inline std::vector<arion::REG> CTXT_REGS = {
518 UC_X86_REG_FS, UC_X86_REG_GS, UC_X86_REG_RAX, UC_X86_REG_RBP, UC_X86_REG_RBX, UC_X86_REG_RCX,
519 UC_X86_REG_RDI, UC_X86_REG_RDX, UC_X86_REG_RIP, UC_X86_REG_RSI, UC_X86_REG_RSP, UC_X86_REG_SS,
520 UC_X86_REG_CS, UC_X86_REG_DS, UC_X86_REG_FP0, UC_X86_REG_FP1, UC_X86_REG_FP2, UC_X86_REG_FP3,
521 UC_X86_REG_FP4, UC_X86_REG_FP5, UC_X86_REG_FP6, UC_X86_REG_FP7, UC_X86_REG_R8, UC_X86_REG_R9,
522 UC_X86_REG_R10, UC_X86_REG_R11, UC_X86_REG_R12, UC_X86_REG_R13, UC_X86_REG_R14, UC_X86_REG_R15,
523 UC_X86_REG_ST0, UC_X86_REG_ST1, UC_X86_REG_ST2, UC_X86_REG_ST3, UC_X86_REG_ST4, UC_X86_REG_ST5,
524 UC_X86_REG_ST6, UC_X86_REG_ST7, UC_X86_REG_ZMM0, UC_X86_REG_ZMM1, UC_X86_REG_ZMM2, UC_X86_REG_ZMM3,
525 UC_X86_REG_ZMM4, UC_X86_REG_ZMM5, UC_X86_REG_ZMM6, UC_X86_REG_ZMM7, UC_X86_REG_ZMM8, UC_X86_REG_ZMM9,
526 UC_X86_REG_ZMM10, UC_X86_REG_ZMM11, UC_X86_REG_ZMM12, UC_X86_REG_ZMM13, UC_X86_REG_ZMM14, UC_X86_REG_ZMM15,
527 UC_X86_REG_ZMM16, UC_X86_REG_ZMM17, UC_X86_REG_ZMM18, UC_X86_REG_ZMM19, UC_X86_REG_ZMM20, UC_X86_REG_ZMM21,
528 UC_X86_REG_ZMM22, UC_X86_REG_ZMM23, UC_X86_REG_ZMM24, UC_X86_REG_ZMM25, UC_X86_REG_ZMM26, UC_X86_REG_ZMM27,
529 UC_X86_REG_ZMM28, UC_X86_REG_ZMM29, UC_X86_REG_ZMM30, UC_X86_REG_ZMM31, UC_X86_REG_FS_BASE, UC_X86_REG_GS_BASE,
530 UC_X86_REG_RFLAGS,
531};
532
554
556inline arion::ABI_REGISTERS ABI_REGS = arion::ABI_REGISTERS(UC_X86_REG_RIP, UC_X86_REG_RSP);
557
560 UC_X86_REG_RAX, {UC_X86_REG_RDI, UC_X86_REG_RSI, UC_X86_REG_RDX, UC_X86_REG_RCX, UC_X86_REG_R8, UC_X86_REG_R9});
561
564 UC_X86_REG_RAX, UC_X86_REG_RAX,
565 {UC_X86_REG_RDI, UC_X86_REG_RSI, UC_X86_REG_RDX, UC_X86_REG_R10, UC_X86_REG_R8, UC_X86_REG_R9});
566
569
571inline uint32_t HWCAP2 = 2;
572
574inline uint32_t HWCAP = 0xbfebfbff;
575
577inline const size_t PTR_SZ = 8;
578
580inline const uint16_t ARCH_SZ = 64;
581
584
589
592{
593 private:
599 static void syscall_hook(std::shared_ptr<arion::Arion> arion, void *user_data);
603 void setup() override;
604
605 public:
612
618 std::array<arion::BYTE, ARION_VSYSCALL_ENTRY_SZ> gen_vsyscall_entry(uint64_t syscall_no);
623 ks_engine *curr_ks() override;
628 csh *curr_cs() override;
638 void load_tls(arion::ADDR new_tls) override;
639};
640
641}; // namespace arion_x86_64
642
643#endif // ARION_ARCH_X8664_HPP
#define ARION_VVAR_PRESENT
If this flag is set, the loader will map the VVAR segment.
Definition arch_manager.hpp:17
#define ARION_VDSO_PRESENT
If this flag is set, the loader will map the VDSO segment.
Definition arch_manager.hpp:19
#define ARION_VSYSCALL_PRESENT
If this flag is set, the loader will map the VSYSCALL segment.
Definition arch_manager.hpp:21
Definition arch_manager.hpp:180
ArchManager(std::shared_ptr< ARCH_ATTRIBUTES > attrs, std::map< std::string, REG > arch_regs, std::map< REG, uint8_t > arch_regs_sz, std::vector< REG > ctxt_regs, std::map< uint64_t, CPU_INTR > cpu_idt, bool hooks_intr)
Definition arch_manager.hpp:215
An emulation unit associated with a process.
Definition arion.hpp:127
A class responsible for performing architecture specific operations in case of an x86-64 chip emulati...
Definition arch_x86-64.hpp:592
std::array< arion::BYTE, ARION_VSYSCALL_ENTRY_SZ > gen_vsyscall_entry(uint64_t syscall_no)
static void syscall_hook(std::shared_ptr< arion::Arion > arion, void *user_data)
void load_tls(arion::ADDR new_tls) override
arion::ADDR dump_tls() override
ks_engine * curr_ks() override
ArchManagerX8664()
Definition arch_x86-64.hpp:609
Definition arch_x86-64.hpp:18
std::map< uint64_t, std::string > NAME_BY_SYSCALL_NO
A map identifying a x86-64 syscall name given its number.
Definition arch_x86-64.hpp:21
const uint16_t ARCH_SZ
Size in bits of the x86-64 general-purpose registers.
Definition arch_x86-64.hpp:580
arion::ABI_CALLING_CONVENTION ABI_CALLING_CONV
Unicorn x86-64 registers involved in calling convention.
Definition arch_x86-64.hpp:559
std::map< arion::REG, uint8_t > ARCH_REGS_SZ
A map identifying a Unicorn x86-64 register size given the register.
Definition arch_x86-64.hpp:458
uint32_t HWCAP2
Some well working x86-64 chip HWCAP2 value.
Definition arch_x86-64.hpp:571
std::vector< arion::REG > CTXT_REGS
The list of high-level x86-64 registers that make up the context to be saved and restored.
Definition arch_x86-64.hpp:517
arion::KERNEL_SEG_FLAGS SEG_FLAGS
x86-64 flags telling the loader which kernel segments should be mapped in memory.
Definition arch_x86-64.hpp:568
std::map< uint64_t, arion::CPU_INTR > IDT
The x86-64 Interrupt Descriptor Table.
Definition arch_x86-64.hpp:534
uint32_t HWCAP
Some well working x86-64 chip HWCAP value.
Definition arch_x86-64.hpp:574
const size_t PTR_SZ
Size in bytes of a pointer in a x86-64 chip.
Definition arch_x86-64.hpp:577
arion::ABI_SYSCALLING_CONVENTION ABI_SYSCALLING_CONV
Unicorn x86-64 registers involved in syscalling convention.
Definition arch_x86-64.hpp:563
arion::ARCH_ATTRIBUTES ARCH_ATTRS
Multiple architecture specific attributes for x86-64, grouped in a structure for genericity purpose.
Definition arch_x86-64.hpp:586
std::map< std::string, arion::REG > ARCH_REGS
A map identifying a Unicorn x86-64 register given its name.
Definition arch_x86-64.hpp:381
arion::CPU_ARCH ARCH
Arion CPU_ARCH for x86-64.
Definition arch_x86-64.hpp:583
arion::ABI_REGISTERS ABI_REGS
Unicorn x86-64 PC and SP registers for genericity.
Definition arch_x86-64.hpp:556
Definition arch_x86-64.hpp:11
uint64_t ADDR
Identifies a memory address.
Definition global_defs.hpp:36
CPU_ARCH
Identifies a CPU architecture.
Definition global_defs.hpp:128
@ X8664_ARCH
The x86-64 CPU architecture.
Definition global_defs.hpp:134
uint8_t KERNEL_SEG_FLAGS
Flags telling the loader which architecture specific segments should stand in memory.
Definition arch_manager.hpp:31
@ X87_FLOATING_POINT_EXCEPTION
x87 Floating-point exception.
Definition arch_manager.hpp:148
@ OVERFLOW
Overflow exception.
Definition arch_manager.hpp:136
@ DOUBLE_FAULT
Double fault.
Definition arch_manager.hpp:140
@ INVALID_OPCODE
Invalid opcode exception.
Definition arch_manager.hpp:138
@ MACHINE_CHECK
Machine check.
Definition arch_manager.hpp:150
@ DEVICE_NOT_AVAILABLE
Device not available.
Definition arch_manager.hpp:139
@ RESERVED
Reserved interrupt vector.
Definition arch_manager.hpp:147
@ BOUND_RANGE_EXCEEDED
Bound range exceeded.
Definition arch_manager.hpp:137
@ PAGE_FAULT
Page fault.
Definition arch_manager.hpp:146
@ SIMD_FLOATING_POINT_ERROR
SIMD Floating-point exception.
Definition arch_manager.hpp:151
@ DIVIDE_ERROR
Divide-by-zero error.
Definition arch_manager.hpp:132
@ ALIGNMENT_CHECK
Alignment check.
Definition arch_manager.hpp:149
@ GENERAL_PROTECTION_FAULT
General protection fault.
Definition arch_manager.hpp:145
@ COPROCESSOR_SEGMENT_OVERRUN
Coprocessor segment overrun.
Definition arch_manager.hpp:141
@ STACK_SEGMENT_FAULT
Stack segment fault.
Definition arch_manager.hpp:144
@ DEBUG_EXCEPTION
Debug exception.
Definition arch_manager.hpp:133
@ BREAKPOINT
Breakpoint exception.
Definition arch_manager.hpp:135
@ INVALID_TSS
Invalid Task State Segment.
Definition arch_manager.hpp:142
@ NON_MASKABLE_INTR
Non-maskable interrupt.
Definition arch_manager.hpp:134
@ SEGMENT_NOT_PRESENT
Segment not present.
Definition arch_manager.hpp:143
Unicorn registers involved in calling convention.
Definition arch_manager.hpp:52
Unicorn PC and SP registers for genericity.
Definition arch_manager.hpp:37
Unicorn registers involved in syscalling convention.
Definition arch_manager.hpp:68
Multiple architecture specific attributes, grouped in a structure for genericity purpose.
Definition arch_manager.hpp:87