【文章标题】:VC利用调试寄存器实现硬件断点源码
【文章作者】:yhswwr(SilenceRet)
【作者QQ】:3412259
【编写语言】:C++
【使用工具】:VS2008.VC++9
【本文链接】:http://bbs.pediy.com/showthread.php?p=1122838
【参考链接】:http://bbs.pediy.com/showthread.php?t=107515
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!(当前行剽窃自justhxy)

/************************************************************************
SetHardWareBP:
设置线程硬件断点
hThread: 线程句柄
dwAddr: 断点地址
dwDrIndex: 硬件寄存器(0~3)
nType: 断点类型(0:执行,1:读取,2:写入)
nLen: 读写断点数据长度(1,2,4)
/************************************************************************/ BOOL SetHardWareBP(HANDLE hThread,DWORD dwAddr,DWORD dwDrIndex=0,UINT nType=0,UINT nLen=1)
{
BOOL bResult=FALSE; CONTEXT context = {0};
context.ContextFlags=CONTEXT_DEBUG_REGISTERS;
if(::GetThreadContext(hThread,&context))
{
DWORD dwDrFlags=context.Dr7; //将断点地址复制进入对应Dr寄存器(参考CONTEXT结构)
memcpy(((BYTE *)&context)+4+dwDrIndex*4,&dwAddr,4); //决定使用哪个寄存器
dwDrFlags|=(DWORD)0x1<<(2*dwDrIndex); //见OD读写断点时 这个置位了,执行没有(置位也正常-_-)
dwDrFlags|=0x100; //先[COLOR="Sienna"]将对应寄存器对应4个控制位清零(先或,再异或,还有其它好方法吗)[/COLOR] =.= 悲催的小学生
dwDrFlags|=(DWORD)0xF<<(16+4*dwDrIndex);
dwDrFlags^=(DWORD)0xF<<(16+4*dwDrIndex); //设置断点类型,执行:00 读取:11 写入:01
//([B][COLOR="Olive"]不知何故,测试时发现不论是11还是01,读写数据时均会断下来[/COLOR][/B])
if (nType==1)
dwDrFlags|=(DWORD)0x3<<(16+4*dwDrIndex); //读取
else if(nType==2)
dwDrFlags|=(DWORD)0x1<<(16+4*dwDrIndex); //写入
//else if(nType==0)
//dwDrFlags=dwDrFlags //执行 //设置读写断点时数据长度
if (nType!=0)
{
if(nLen==2 && dwAddr%2==0)
dwDrFlags|=(DWORD)0x1<<(18+4*dwDrIndex); //2字节
else if(nLen==4 && dwAddr%4==0)
dwDrFlags|=(DWORD)0x3<<(18+4*dwDrIndex); //4字节
} context.Dr7=dwDrFlags;
if (::SetThreadContext(hThread,&context)) bResult=TRUE;
}
return bResult;
}
//异常处理
//直接从工程中拷出来的
typedef ULONG (WINAPI *pfnRtlDispatchException)(PEXCEPTION_RECORD pExcptRec,CONTEXT * pContext);
static pfnRtlDispatchException m_fnRtlDispatchException=NULL; BOOL RtlDispatchException(PEXCEPTION_RECORD pExcptRec,CONTEXT * pContext); ULONG WINAPI CSysHook::_RtlDispatchException( PEXCEPTION_RECORD pExcptRec,CONTEXT * pContext )
{
if(RtlDispatchException(pExcptRec,pContext)) return 1;
return m_fnRtlDispatchException(pExcptRec,pContext);
} //Hook程序异常处理,当程序发生异常时,由ring0转回ring3时调用的第一个函数:KiUserExceptionDispatcher
BOOL CSysHook::HookSystemSEH()
{
BOOL bResult=FALSE;
BYTE *pAddr=(BYTE *)::GetProcAddress(::GetModuleHandleA("ntdll"),"KiUserExceptionDispatcher");
if (pAddr)
{
while (*pAddr!=0xE8)pAddr++; //XP~Win7正常,Win8尚无缘得见
m_fnRtlDispatchException=(pfnRtlDispatchException)((*(DWORD *)(pAddr+1))+5+(DWORD)pAddr); //得到原函数地址
DWORD dwNewAddr=(DWORD)_RtlDispatchException-(DWORD)pAddr-5; //计算新地址
CMemory::WriteMemory((DWORD)pAddr+1,(BYTE *)&dwNewAddr,4); //这个写内存的自己改造吧
bResult=TRUE;
}
return bResult;
} [COLOR="Olive"]//异常处理函数
BOOL RtlDispatchException(PEXCEPTION_RECORD pExcptRec,CONTEXT * pContext)
{
返回TRUE,这个异常我已经处理好了,继续运行程序
返回FALSE,这个异常不是我的,找别人处理去
}[/COLOR]

jpg改rar

VC利用调试寄存器实现硬件断点源码的更多相关文章

  1. 调试寄存器 原理与使用:DR0-DR7

    调试寄存器 原理与使用:DR0-DR7 下面介绍的知识性信息来自intel IA-32手册(可以在intel的开发手册或者官方网站查到),提示和补充来自学习调试器实现时的总结. 希望能给你带去有用的信 ...

  2. 转——调试寄存器 原理与使用:DR0-DR7

    下面介绍的知识性信息来自intel IA-32手册(可以在intel的开发手册或者官方网站查到),提示和补充来自学习调试器实现时的总结. 希望能给你带去有用的信息. (DRx对应任意的一个调试寄存器. ...

  3. Windows程序调试系列: 使用VC++生成调试信息 转

    Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,zhangtao.it@gmail.com, 译自 “Generating debug information with Vi ...

  4. 利用CMD查看系统硬件信息

    利用CMD查看系统硬件信息对于在windows下查看系统信息大家一定不陌生了,我现在说几个最常用的方法,对命令感兴趣的朋友看看,(给菜鸟看的,老手就不要笑话我了,大家都是从那个时候过来的,^_^).一 ...

  5. 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案

    最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...

  6. 利用PHP QR Code生成二维码(带logo)

    转自:http://www.cnblogs.com/txw1958/p/phpqrcode.html HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示 ...

  7. 利用伪寄存器对MSVC++进行调试的介绍

    简介 让我们从我写这篇文章的原因开始.一天,一个同事让我帮他调试他遇到的问题.所以我看着他在输入代码,这时我注意到下面一行: int test = GetLastError(); 他这样做是因为他想知 ...

  8. VC++ 利用PDB和dump文件定位问题并进行调试

    转载:https://blog.csdn.net/zfs_kuai/article/details/43646665 转载:https://blog.csdn.net/i_chaoren/articl ...

  9. 如何在VC++ 中调试MEX文件

    MEX文件对应的是将C/C++文件语言的编写之后 得到的相关文件加载到Matlab中运行的一种方式, 现对于Matlab 中的某些程序运行效率而言, C/C++ 代码某些算法的领域上面执行效率很高,若 ...

随机推荐

  1. discuz 模板中如何使用方法和语言标签?

    第一个问题:如何调用方法? 关于模板中eval的使用{eval php 语句}比如:<!--{eval echo "Hello World!"}--> 工作中遇到一个小 ...

  2. PHP做Web开发的MVC框架(Smarty使用说明 )

    PHP做Web开发的MVC框架(Smarty使用说明 ) 一.Smarty简明教程 1.安装演示 下载最新版本的Smarty-3.1.12,然后解压下载的文件.接下来演示Smarty自带的demo例子 ...

  3. JUnit套件测试实例

    “套件测试”是指捆绑了几个单元测试用例并运行起来.在JUnit中,@RunWith 和 @Suite 这两个注解是用来运行套件测试. 下面的例子演示这两个单元测试:JunitTest1 和 Junit ...

  4. C#之内存分配

    在C#中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等 ...

  5. C#或者.NET下的强制垃圾回收办法

    转载 2011年03月16日 17:21:00 标签: c# / .net / button / object / stream / class 8185 今天来谈谈C#的GC,也就是垃圾回收机制,非 ...

  6. Ubuntu 12.04安装Java开发环境(jdk1.7 + Eclipse)

    首先,去官网下载linux版本的jdk和eclipse tar包,并将其解压出来.我将jdk包发在了/usr/java/目录下,eclipse放在了/opt/目录下. 然后,配置java开发环境,即安 ...

  7. PLSQL导入Excel文件预览不到数据行问题

    今天,从Excel导入Oracle一些数据,在导入的过程中,遇到一个问题,Excel里面有好几万条数据,但是通过PLSQL导入向导导入Excel文件之后,在PLSQL里却预览不到数据行,只能看见标题行 ...

  8. RNAcentral 数据库简介

    RNAcentral 是EBI 开发的一个非编码RNA的数据库. 网址如下: http://rnacentral.org/ RNAcentral 整合了包括 Ensembl, GENCODE,Gree ...

  9. Dataguard中日志传输服务

    之前,原本已经尝试过配置oracle实例的逻辑和物理standby结构,并且做个一些role交换操作,可是由于昨天学习rman的部分命令时没留意,误删掉了primary DB上的所有归档日志,因为原来 ...

  10. Intellij Idea反向生成Hibernate实体类

    每次根据数据库的表反向生成实体类老不记得步骤...脑子不够用,这里特意记录一下.碰到的问题也及时更新到这里来. 1. 工程添加Hibernate支持 两种方式: 第一种:工程上右键选择 "A ...