作家
登录

开发一个Linux调试器(三):寄存器和内存

作者: 来源: 2017-07-05 16:07:24 阅读 我要评论

"rsi" }, 
  •     { reg::rdi, 5, "rdi" }, 
  •     { reg::orig_rax, -1, "orig_rax" }, 
  •     { reg::rip, -1, "rip" }, 
  •     { reg::cs, 51, "cs" }, 
  •     { reg::rflags, 49, "eflags" }, 
  •     { reg::rsp, 7, "rsp" }, 
  •     { reg::ss, 52, "ss" }, 
  •     { reg::fs_base, 58, "fs_base" }, 
  •     { reg::gs_base, 59, "gs_base" }, 
  •     { reg::ds, 53, "ds" }, 
  •     { reg::es, 50, "es" }, 
  •     { reg::fs, 54, "fs" }, 
  •     { reg::gs, 55, "gs" }, 
  • }}; 
  • 如不雅你想本身看看的话,你平日可以在 /usr/include/sys/user.h 找到存放器数据构造,别的 DWARF 存放器编号取自 System V x86_64 ABI。

    1. uint64_t get_register_value(pid_t pid, reg r) { 
    2.     user_regs_struct regs; 
    3.     ptrace(PTRACE_GETREGS, pid, nullptr, &regs); 
    4.     //... 

    ptrace 使得我们可以随便马虎获得我们想要的数据。我们只须要结垢荷琐 user_regs_struct 实例并把它和 PTRACE_GETREGS 请求传递给 ptrace。

    1. auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), 
    2.                        [r](auto&& rd) { return rd.r == r; }); 
    3. return *(reinterpret_cast<uint64_t*>(&regs) + (it - begin(g_register_descriptors))); 

    到 uint64_t 的转换是安然的,因为 user_regs_struct 是一个标准构造类型,但我认为指针算术技巧上是不决义的行动undefined behavior。当前没有编译器会对此产生警告,我也懒得修改,然则如不雅你想保持最严格的┞俘确性,那就写一个大年夜的 switch 语句。

    set_register_value 异常类似,我们只噬烫蛛该地位并在最后写回存放器:

    1. void set_register_value(pid_t pid, reg r, uint64_t value) { 
    2.     user_regs_struct regs; 
    3.     ptrace(PTRACE_GETREGS, pid, nullptr, &regs); 
    4.     auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), 
    5.                            [r](auto&& rd) { return rd.r == r; }); 

        推荐阅读

        山东淄博以“互联网+”改革促老工业城市转型发展

      在当局改革范畴,淄博市大年夜力履行&ldquo;互联网+&rdquo;政务办事,开通网上干事大年夜厅、微信"大众,"办事平台、移动办公APP等网上申报功能,干事企业和群众足不出户就可解决审批,市级网上解决事项零次劈叉和一次>>>详细阅读


      本文标题:开发一个Linux调试器(三):寄存器和内存

      地址:http://www.17bianji.com/lsqh/36047.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)