游戏安全实验室 首页 技术入门 查看内容

 阅读目录

ida-调试中断

发布于:2017-3-23 16:37   |    145462次阅读 作者: 管理员    |   原作者: TP   |   来自: 原创

前言:

Windows内核调试很多时侯都是使用Windbg + VMWare的搭配进行调试, 但这个搭配还是依赖于Windows自身的调试体系进行的, 假如我们有一个需求是要调试调试体系自身的话( 比如调试INT 3中断处理函数),  这个搭配就会因为变得不好使, 原因是因为异常分发始终没有得到正常的处理。

 

亦因为调试体系不能调试自身, VMWare的开发人员也是不能接受的, 因此他们也汇出了一套调试接口使用流程如下, 原理是VMWare在仿真指令时可以透传一份上下文给GDB:

 

我们可以透我们可以透过增加以下两句语句 让vmware的调试体系生效              

 

 

这个接口是透过网络连接的原理实现的, 也就是设置后, VMWare会设置一个埠, 等待连接, 这时侯我们可以使用透过IDA GDB Debugger进行远程调试:

 

 

连接本地埠 localhost: 8864, 32位统则是8832

 

选择进程ID0

 

成功的话可以看到以下的框了

 

 

 

虽然系统已经停下来,可是什么代码都看不到的, 这时侯我们需要手动创建内存区域:

 

 

右键->Insert

 

 

按如下设置 即可以浏览0~FFFFFFFFFFFFFFF0的代码

 

 

创建后可按运行, 系统就会继续跑起来

 

 

这时侯应该会弹出以下的框, 再单击Suspend 即可断到Guest OS当前正在执行的指令(假如因为某原因系统死循环卡死了, RIP就会停在循环中的某一句)

 

  

实例: 比如我们需要调试INT 3中断处理函数,

1. 我们可以先使用Windbg进行普通双机调试取得中断函数地址, 比如为int 3中断,

2. 我们要是直接使用WindbgINT 3处理函数中下断, 必然会因为异常分发永远得不到正常处理而卡死,

3. 因此我们可以在IDA中往这个地址下断, VMWare的自己的调试流程来进行调试, 而不是走Windows的内核调试机制

 

使用!idt 命令查看IDT

 

 

Suspend停止系统后, IDA单击’g’ 输入其地址, IDA不会自动把内存区的2进制变成汇编我们可单击’c’ 进行反汇编

 


这时侯代码就出来了, 我们可以直接在这中断函数下F2断点, 然后跑起系统...

 

 

在系统任意时刻触发INT 3中断, 比如使用WINDBG主动断下

 

 

IDA就会断下了, 我们就可以看到当时侯的栈, 甚至单步都是可以的

 

 


这类调试技巧可以应用的场合众多: 比如调试各种系统假死, 调试中断处理函数, VT驱动调试等

分享到:
踩1 赞1

收藏

下一篇:【Android】ELF格式及动态加载过程

最新评论
B Color Image Link Quote Code Smilies

发表评论