如不雅你想本身看看的话,你平日可以在 /usr/include/sys/user.h 找到存放器数据构造,别的 DWARF 存放器编号取自 System V x86_64 ABI。
- uint64_t get_register_value(pid_t pid, reg r) {
- user_regs_struct regs;
- ptrace(PTRACE_GETREGS, pid, nullptr, ®s);
- //...
- }
ptrace 使得我们可以随便马虎获得我们想要的数据。我们只须要结垢荷琐 user_regs_struct 实例并把它和 PTRACE_GETREGS 请求传递给 ptrace。
- auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors),
- [r](auto&& rd) { return rd.r == r; });
- return *(reinterpret_cast<uint64_t*>(®s) + (it - begin(g_register_descriptors)));
到 uint64_t 的转换是安然的,因为 user_regs_struct 是一个标准构造类型,但我认为指针算术技巧上是不决义的行动undefined behavior。当前没有编译器会对此产生警告,我也懒得修改,然则如不雅你想保持最严格的┞俘确性,那就写一个大年夜的 switch 语句。
set_register_value 异常类似,我们只噬烫蛛该地位并在最后写回存放器:
- void set_register_value(pid_t pid, reg r, uint64_t value) {
- user_regs_struct regs;
- ptrace(PTRACE_GETREGS, pid, nullptr, ®s);
- auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors),
- [r](auto&& rd) { return rd.r == r; });
推荐阅读
在当局改革范畴,淄博市大年夜力履行“互联网+”政务办事,开通网上干事大年夜厅、微信"大众,"办事平台、移动办公APP等网上申报功能,干事企业和群众足不出户就可解决审批,市级网上解决事项零次劈叉和一次>>>详细阅读
地址:http://www.17bianji.com/lsqh/36047.html
1/2 1