注册看雪论坛多年,一看注册时间已经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直播授课