zoukankan      html  css  js  c++  java
  • bochs调试VT代码

    参考:https://blog.csdn.net/u011343776/article/details/106683840

    这边使用bochs调试代码实在是太郁闷了. 今天我索性要将我所有bochs上遇到的调试问题说一下.想要用bochs调试(VT)代码一定要耐心, 不然就想杀人.

    安装bochs的系统参考这个帖子 http://bbs.pediy.com/showthread.php?t=134693&highlight=bochs

    首先看了这篇帖子(http://bbs.pediy.com/showthread.php?t=139031)说开启VT的办法. 然后我去下载了bochs 2.6 版本的代码.注意了是2.6版本的代码, bochs每个版本的代码编译都不一样. 最新的2.6.2编译就恶心多了.

    bochs 2.6版本的代码编译非常简单, 直接将config.h

    #define BX_SUPPORT_VMX 0
    
    改成
    
    #define BX_SUPPORT_VMX 2

    到这里Cpu就已经支持VT了. 但是BIOS没有开启. 改这个

    BX_CPU_THIS_PTR msr.ia32_feature_ctrl =
    /*BX_IA32_FEATURE_CONTROL_LOCK_BIT | */BX_IA32_FEATURE_CONTROL_VMX_ENABLE_BIT;

    把注释去掉.

    BX_CPU_THIS_PTR msr.ia32_feature_ctrl =
    BX_IA32_FEATURE_CONTROL_LOCK_BIT | BX_IA32_FEATURE_CONTROL_VMX_ENABLE_BIT;

    完了之后, 编译处理就是开启VT的bochs了. 可以直接跑VT程序了. 我看整个网上的人抄来抄去也就是这么点内容了.我在想这些人是怎么进行VT代码调试的呢? windbg只能进入noroot模式. 进入root模式以后我的windbg直接就没响应了.所以要搞定调试, 需要这么几步, 首先要编译一个bochsdbg.exe出来. 在2.6版本的代码上将

    #define BX_DEBUGGER 0
    改成
    #define BX_DEBUGGER 1

    编译一堆错, 不应该啊, 网上文章什么的都说改了这个标记位就可以了啊. 报这个错.

    #error "Handler-chaining-speedups are not supported together with internal debugger or gdb-stub!"

    我靠. 不按套路出牌? 索性把这个定义改了.

    #define BX_SUPPORT_HANDLERS_CHAINING_SPEEDUPS 1
    
    改成
    
    #define BX_SUPPORT_HANDLERS_CHAINING_SPEEDUPS 0

    整个世界清静了. 代码成功编译出来, 搞个release版本的出来, 改名bochsdbg.exe覆盖2.6的那个bochsdbg.exe哈哈. 启动起来就断在第一行代码了. 兴奋不已. 装个windows. 这个网上有方法了. 完了之后开启magic_break断点. 在配置文件添加这么一行

    magic_break: enabled=1

    这样遇到xchg bx,bx指令的时候就会断下. 类似windbg的插入int 3断点, 但是问题来了. 你开启magic_break断点以后估计你永远也跑不到windows的界面. 因为中间有个地方有这个指令, 并且会循环的运行到. 我靠. 居然有这样的事情. 原来在写保护模式代码的时候就纠结过一次了. 不过那次反正也不进windows, 无所谓了. 但是现在不行啊.

    百度 google.. 都没有遇到这个问题?? 你们都是怎么调试的?我就不信你们能够单步进windows. 那你们是下断点?bochs好像没有类似windbg .process cr3的功能. 也就是说没法在未知的情况下下线性地址断点. 下硬件断点断windows有点开玩笑. 比较好的做法还是xchg bx,bx断点啊, 可是现在windows有个循环就有这么条纠结的指令.

    既然前面都改了bochs的源码, 那只能一条道走到黑了. 最后跟了下bochs的代码, 没有想象中的难嘛. 最后定位到这个函数

    BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::XCHG_EwGwR(bxInstruction_c *i){}

    在这里就有一个判断opcode的地方.

    // Note for mortals: the instruction to trigger this is "xchgw %bx,%bx"
    if (bx_dbg.magic_break_enabled && (i->src() == 3) && (i->dst() == 3))

    哈哈. scr = 3, dst = 3那就是bx, bx了. 了解指令编码的人应该都很容易修改了. 我本来想一条非常偏门的指令的比如CMOVO. 但是为了简单. 我直接在将代码改成这样.

    //
    // 这里我们改成 xchg sp,sp
    //
    if (bx_dbg.magic_break_enabled && (i->src() == 4) && (i->dst() == 4))
    {
    BX_CPU_THIS_PTR magic_break = 1;
    BX_NEXT_INSTR(i);
    }

    哈哈. 搞定. 直接进去windows都没有出声了. 加载个驱动. 里面加一行 xchg sp,sp马上断下来. 太牛逼了. 真是雪我十余年激愤.. 这下终于可以舒服的调试bochs的代码了.恩这边顺便把修改好的VS2008代码也上传下. 方便大家. 方便自己.

    http://www.joenchen.com/JoenTools/bochs-2.6-vs2008.rar

    这代码是已经支持VT技术, BIOS也开启了VT. 同时magic_break 改成了 xchg sp,sp了. 最后YY一下, 如果可以改下bochs的代码, 给他加上微软的调试符号那就牛逼了. 当然只是YY. YY啊.

     
  • 相关阅读:
    JasperReports项目中的应用
    请问两个div之间的上下距离怎么设置
    Spring MVC Flash Attribute 的讲解与使用示例
    8.ireport 取消自动分页,detail不分页
    python网络爬虫学习笔记
    ShareSDK for Android 2.3.8它已发表
    OllyDbg 使用注意事项 (十)
    ListView的cacheColorHint与listSelector物业和fragment里面onActivityResult问题没有响应
    Hdu 3341 Lost's revenge (ac+自己主动机dp+hash)
    PhoneGap 开发与应用 上传 App Store 在
  • 原文地址:https://www.cnblogs.com/kuangke/p/14702288.html
Copyright © 2011-2022 走看看