工程化C程序 Lab3 Minimal Debugger 新手指南

实验链接

Lab3 Minimal Debugger

说明:

本文只是作者在做USTC-System Programming in C课程的实验过程中遇到的一些坑,或者觉得新手可能会卡住浪费时间的点。只是提示性的说明,并不是参考答案,不保证正确性。希望大家自己动手,才能更深入理解实验内容

Exercise 1:

Tips:

  • 下载的源代码需要先编译得到ssedb可执行文件。然后自己建一个 hello.c 文件,输入提供的那段代码,再编译得到 hello 可执行文件,把hello放到ssedb同文件夹中,之后就可以在terminal里用 ./ssedb hello 来运行debugger。

Exercise 2:

Tips:

  • objdump -d hello > content.txt 下划线部分记得加,否则在终端输出不好找;
  • 在content.txt中可以Ctrl+F搜"print"快速找到print()函数的入口地址;

My Comprehension:(Not sure)

我的print函数的入口地址为0x401775,该处指令的机器码为0xf30f1efa;

到达断点处运行regs命令得到的rip值为0x401776,比实际断点位置大1;

运行x/x 0x401775得到该处的机器码为0xcc0f1efa,首字节0xf3变成了0xcc;

发现rip的值比断点处大了1,0x401775处原本的0xf3变成了0xcc 

这是不对的,我们把断点处的机器码改成0xcc是为了让子进程运行到此处时产生中断从而暂停,当子进程执行到0xcc指令后,会暂停运行,rip(程序计数器PC)会自增1到下一个指令地址。

此时我们需要恢复0x401775处的机器码为0xf3,然后将rip的值回退1,这样当继续执行子进程时,才能保证子进程的正确性不会因为设置断点而改变。

Exercise 3:

zydis准备工作:

  1. 在虚拟机上安装git
  2. 在我们的ssedb项目中创建deps文件夹(与 CMakeLists.txt 在同一层),进入deps文件夹运行如下命令,将开源项目zydis克隆到deps文件夹中(这一步可能有网络问题,如果失败就把已经克隆的文件删了再无限重试,大力出奇迹)
    git clone --recursive 'https://github.com/zyantific/zydis.git'
  3. 修改 CMakeLists.txt 如下

        cmake_minimum_required(VERSION 3.20)
        project(ssedb C)


        option(ZYDIS_BUILD_TOOLS "" OFF)
        option(ZYDIS_BUILD_EXAMPLES "" OFF)
        add_subdirectory("deps/zydis")

        set(CMAKE_C_STANDARD 99)

        add_executable(ssedb ast.c cmdFuncs.c main.c)


        target_link_libraries(ssedb PRIVATE "Zydis")

Tips:

  • 参考github里该项目的README——Examples——Disassembler中的示例代码,根据我们lab的需要进行修改就可以

  • 注意PEEKDATA取出的long型数据中,高低位字节的顺序问题

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值