首页
社区
课程
招聘
[求助]关于硬件断点没有进入注册的异常的疑惑
发表于: 2020-10-27 10:30 2694

[求助]关于硬件断点没有进入注册的异常的疑惑

2020-10-27 10:30
2694

注册看雪论坛多年,一看注册时间已经11年...作为一个业余选手,经过了11年才慢慢觉得原来看雪论坛的帖子真的很好,以前太菜看不懂,浪费了这个注册号多年,现在重新收拾起来,经过多年的业余积累,终于能看的懂某些技术帖子,尽管看的懂的还只是一丢丢. 废话了这么多,现在进入正题.
首先感谢 大牛pangdou于2020-3-13的帖子
https://bbs.pediy.com/thread-258083.htm
让我从中找到过crc的灵感,从硬件断点来hook可以不用修改代码,从而绕过crc.
之前的游戏readprocessmemory来读取数据校验,当初纠结了很久,才找到原因,也是看雪论坛帖子帮的忙,后来本人从驱动层inline hook了ntreadvirtualmemory,伪造数据绕过检测.让我第一次获得了一点点的成就感;然而,没多久,登录器更新以后,他并非从readprocessmemory读取数据也不是直接访问.所以想伪造数据就再也找不到门路了.
最终,看到了硬件断点这个思路,所以,本菜鸟就仿造大牛的帖子写了硬件断点,却发现始终进不去注册的异常处理函数.想让大牛们指点一下,看看我的代码是否出了什么问题,是不是写的不对,感激不尽.先上代码如下

 

#include "stdafx.h"

 

#include "windows.h"

 

#include "WINBASE.H"
using namespace System;

 

#include <stdio.h>

 

DWORD mainthreadid = NULL; //主线程id

 

void test1()
{
printf("test1\n");
}

 

void test2()
{
printf("test2\n");
}

 

//异常捕获
DWORD NTAPI ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo) {
printf("进入异常分发函数");
if (ExceptionInfo->ExceptionRecord->ExceptionAddress == test1)
{
ExceptionInfo->ContextRecord->Eip = (DWORD)test2;
return EXCEPTION_CONTINUE_EXECUTION;
}

1
return EXCEPTION_CONTINUE_SEARCH;

}

 

void SetHwBreakPoint(HANDLE hThread) {
CONTEXT ctx;
//ctx.ContextFlags = CONTEXT_ALL;
ctx.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
GetThreadContext(hThread, &ctx);
printf("设置之前:dr0:%p;dr7:%x\n", ctx.Dr0, ctx.Dr7);
ctx.Dr0 = (DWORD)test1;
ctx.Dr7 = 0x1;
ctx.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
SetThreadContext(hThread, &ctx);

1
2
3
CONTEXT ctx2;
GetThreadContext(hThread, &ctx2);
printf("设置之后:dr0:%p;dr7:%x\n", ctx2.Dr0, ctx2.Dr7);

}

 

DWORD WINAPI threadPro(In LPVOID lpParam)
{
//打开主线程
printf("lpParam:%d\n", lpParam);
HANDLE hadl = OpenThread(THREAD_ALL_ACCESS, true, (DWORD)lpParam);
SuspendThread((HANDLE)hadl);
printf("新线程正在设置环境。。。。\n");
SetHwBreakPoint(hadl);
ResumeThread((HANDLE)hadl);
return 0;
}

 

int main(array<System::String ^> ^args)
{

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
getchar();
 
printf("test1,address:%x\n", test1);
printf("test2,address:%x\n", test2);
 
test1();
 
mainthreadid = GetCurrentThreadId();
printf("主线程id:%d\n", mainthreadid);
//注册一个异常VEH
AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)ExceptionHandler);
 
CreateThread(NULL, NULL, threadPro, (LPVOID)GetCurrentThreadId(), NULL, NULL);
 
Sleep(1000);
printf("设置之后\n");
 
 
 
test1();
 
 
printf("Hello World!\n");
getchar();
 
int a = 0;
 
int b = 100 / a;
 
getchar();
return 0;

}

 

=============================
运行结果如下:

 

test1,address:ab129b
test2,address:ab12a1
test1
主线程id:2080
lpParam:2080
新线程正在设置环境。。。。
设置之前:dr0:00000000;dr7:0
设置之后:dr0:00D12558;dr7:cf0000
设置之后
test1
Hello World!

 

进入异常分发函数
未经处理的异常: System.DivideByZeroException: 尝试除以零。
在 main(String[] args) 位置 f:\test3\test3\test3.cpp:行号 103
在 mainCRTStartupStrArray(String[] arguments) 位置 f:\dd\vctools\crt\crtw32\msilcrt\mcrtexe.cpp:行号 249

 

=========================

 

如上结果显示,貌似是在设置硬件断点时候,没设置上,打印出来的结果和预料的不一样,所以访问test1的时候,进不去注册的异常函数.我的代码也参考了不少帖子,貌似是没有问题的,谁能指点一下吗,感激不尽..系统是win10 64位,本机运行,非虚拟机


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 4
支持
分享
最新回复 (1)
雪    币: 51
活跃值: (112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
代码有误,忘记加上权限ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;了.纠正以后,看来硬件断点是已经设置成功.打印如下
设置之前:dr0:00000000;dr7:0
设置之后:dr0:00A212C7;dr7:1

那么,不进入异常处理函数的原因是为何呢,也不出错.
2020-10-27 11:20
0
游客
登录 | 注册 方可回帖
返回
//