简单调试器的实现(三)

单步的实现

就是之前设置的TF标志位

//设置TF标志位
void SetTrapFlag() {
	CONTEXT context = {0};
	GetDebuggeeContext(&context);
	context.EFlags |= 0x100;
	SetDebuggeeContext(&context);

}

步出则是在ebp+4的地址设置断点

BOOL MoveOut()
{
    // 获取ebp
    CONTEXT    Context = {0};
    GetDebuggeeContext(&Context);
    // 获取ebp+4处保存的返回地址
    SIZE_T    addr = 0;
    if(!ReadDebuggeeMemory(Context.Ebp + 4,sizeof(addr),(LPVOID)&addr))
    {
        return FALSE;
    }
    // 设置一次性断点
    SetCCBreakPointAt(addr,SOFTTYPE_ONCE);
    return TRUE;
}

步过则是获得下一条指令长度,在下下条指令下断点

步过,获得eip下一条指令的长度,越过这条指令下断点,这样就不会进入call里面
BOOL MoveOver()
{
    CONTEXT    Context = {0};
    GetDebuggeeContext(&Context);
    SIZE_T addr = GetCoodeLen(Context.Eip) + Context.Eip;
    SetCCBreakPointAt(addr,SOFTTYPE_ONCE);
    return TRUE;
}

然后关于之前硬件断点的问题,发现设置1个字节的断点就能断下来,不过在断点恢复的时候,设置TF恢复就不能正常运行

也有点问题。

这个调试器也拖了很久没弄了,感觉放下了就很久不会弄,甚至不会在弄了,脚步不踏实,什么时候能够脚踏实地呢。

链接  http://pan.baidu.com/s/1qXYKjxU

时间: 2024-10-24 00:18:49

简单调试器的实现(三)的相关文章

简单调试器的实现(三)完善调试器

Dll加载: case LOAD_DLL_DEBUG_EVENT: // Read the debugging information included in the newly // loaded DLL. Be sure to close the handle to the loaded DLL // with CloseHandle. //Dll加载时会进行这个事件 dwContinueStatus = OnLoadDllDebugEvent(DebugEvent); break; DWO

windows简单调试器源码2700行左右代码

简单调试器项目中on开头的函数为接收系统的调试事件并做相应的处理,简单调试器实现过程中主要的调试事件为异常事件,相应的处理函数为DispatchException. 在异常事件中访问异常.int3异常.单步异常是跟实现调试器功能密切相关的异常事件,这里用三个函数分别处理三个函数分别为OnExceptionAccess.OnExceptionBreakPoint.OnExceptionSingleStep. 异常处理函数中如果为调试器自己设置的异常程序就会停下来接收用户输入等待下一步处理,相应的用

简单调试器的实现(二)使用反汇编引擎&建立第一个程序

让程序停下来: 动态调试器的一个重要特点就是:让程序停下来,这样我们才可以观测到程序的即时情况. 不过现在我们并不需要研究怎么下断点,系统已经帮我们激活了第一个断点.在创建调试进程时,系统会帮我们在ntdll.dll中设置一个INT3断点,我们就让程序在这里断下来. switch (DebugEvent->u.Exception.ExceptionRecord.ExceptionCode)//Int3断点的事件 { case EXCEPTION_BREAKPOINT: // ((DWORD )0

简单调试器的实现(一)调试循环与反汇编引擎

最近对调试器的原理感兴趣,自己写了一个简单的demo 打开调试进程: 要调试一个进程,需要在使用CreateProcess打开一个文件时,将第6个参数设为DEBUG_PROCESS. BOOL WINAPI CreateProcess( _In_opt_     LPCTSTR lpApplicationName, _Inout_opt_  LPTSTR lpCommandLine, _In_opt_     LPSECURITY_ATTRIBUTES lpProcessAttributes,

简单调试器的实现(四)断点

Int3断点原理: 在一个指令处设置断点有2步,1.将指令的第1个字节保存起来,2.将这个字节替换成 0xCC 我们可以用我写的调试器看一下: u指令显示了在地址 14e1bbb处的指令   E8 3EAC000;   Call  14ec7fe  . 然后查看这个地址存放的内容. 接着,在14e1bbb设置一个断点, bp 14e1bbb . 再次查看14e1bbb的内容,明显发现  前1个字节设置成了0xCC. 断点实现流程: 以下是设置INT3 断点的实现代码. DWORD SetBrea

MyDebugeer 一个简单调试器的实现

学习的是网上的帖子,所以就不贴源码了. 整个程序以调试循环为主体,实现了启动调试,继续执行,内存查看,读取寄存器值,显示源代码,断点的设置.查看.删除,三种单步执行:StepIn.StepOver.StepOut,显示变量列表.显示指定类型内存内容,显示函数调用栈等功能. 原贴写的很好,从中学到了很多,特别是对<DbgHelp.h>有了接触和了解,学习了Windows提供给用户调试的API,当然这可能是这个程序的不足,因为基本上所有的功能都是利用API实现的,没有提及一些特别的知识和方法.不过

[Win32]一个调试器的实现(三)异常

[Win32]一个调试器的实现(三)异常 作者:Zplutor 出处:http://www.cnblogs.com/zplutor/ 本文版权归作者和博客园共有,欢迎转载.但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 这回接着处理上一篇文章留下的问题:如何处理EXCEPTION_DEBUG_EVENT这类调试事件.这类调试事件是调试器与被调试进程进行交互的最主要手段,在后面的文章中你会看到调试器如何使用它完成断点.单步执行等操作.所以,关于这类调

打造简单的调试器

本文转自:http://www.freebuf.com/sectool/92279.html 0×1 概述 在Fuzzing过程中,必须要监控程序的执行状态,若程序发生异常,立即保存测试用例,以便将来对其进行重现.监控器的作用就是监控程序的执行,如果程序有异常时通知给Fuzzing主线程. 目前Fuzzing工具各种各样,监控器也有很多种,但大多都是以调试器的方式实现.一个简单的监控器是这样实现的: (一)以调试模式启动进程,为目标进程开启调试端口,可使用参数DEBUG_ONLY_THIS_PR

cpp学习(三)使用VS进行简单调试

接着学习一下使用VS进行简单的代码调试.非常简单,都是操作性的东西.在学完c++以后我会继续讲解调试原理,并和大家一起打造一款自己的调试器.首先新建一个工程,并在项目属性里面关闭SDL检查:(参考上一篇) 日后正常开发中还是要打开,用VS的安全函数比较好,由于我们的目的在于复习C语言,所以为了不必要的麻烦先关掉. 然后我们构造一个函数Debug,函数的参数为一个数组,功能为遍历打印数组的十个元素,然后我们传入一个只有容量为5的数组,引发一个数组越界,并进行调试.代码如下:#include<std