首页
社区
课程
招聘
硬件断点过CRC(日常笔记分享)
发表于: 2022-2-9 15:23 7567

硬件断点过CRC(日常笔记分享)

2022-2-9 15:23
7567

1.注册Veh

1
2
3
4
5
(errhandlingapi.h)
PVOID AddVectoredExceptionHandler(
    ULONG                       First,
    PVECTORED_EXCEPTION_HANDLER Handler
    );

• ==First==
• 应调用处理程序的顺序。如果参数不为零,则处理程序是第一个要调用的处理程序。如果参数为零,则处理程序是要调用的最后一个处理程序。

 

• ==Handler==
• 指向要调用的处理程序的指针。(我们写个处理硬件断点断下来的函数,handler就是函数地址)有关详细信息,请参阅矢量处理程序。

 

• ==返回值==
• 如果函数成功,则返回值是异常处理程序的句柄。
• 如果函数失败,则返回值为 NULL。

• 言论

• 如果 First 参数不为零,则在使用对 AddVectoredExceptionHandler 的后续调用将不同的处理程序指定为第一个处理程序之前,该处理程序是第一个要调用的处理程序。
• 如果 VectoredHandler 参数指向 DLL 中的函数,并且该 DLL 已卸载,则仍会注册该处理程序。这可能会导致应用程序错误。
• 若要注销处理程序,请使用 RemoveVectoredExceptionHandler 函数函数。
• 若要编译使用此函数的应用程序,请将_WIN32_WINNT宏定义为0x0500或更高版本。有关详细信息,请参阅使用 Windows 标头。

• 来自 https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-addvectoredexceptionhandler

 

2.异常捕捉

1
2
3
4
5
6
7
8
9
10
11
12
13
DWORD NTAPI ExceptionHandler (EXCEPTION_POINTERS * ExceptionInfo)
{
    if ( (DIWORD)ExceptionInfo-> ExceptionRecord
    -> ExceptionAddress == 0x00401895)
    {
        //6是因为修改的地址jnz所占内存字节为6
        ExceptionInfo >ContextRecord->Eip += 6;
        //已经处理了异常,不需要再调用下一个异常处理来处理此异常
        return EXCEPTION_CONTINUE_EXECUTION:
    }
    //调用下一个处理器
    return EXCEPTTON_CONVTINUE_SEARCH;
}

3.设置 硬件断点

1
2
3
4
5
6
7
8
9
10
void SetHwBreakPoint (HANDLE hThread)
{
    CONTEXT ctx;
    ctx. ContextFlags = CONTEXT_ALL;
    GetThreadContext (hThread,&ctx) ;
    ctx. Dr7 = (DWORD) 0x5; //0X5=101设置 0位和2位开
    ctx. Dr0 = (DWORD) 0x00401053; //要硬断的地址
    SetThreadContext(hThread, &ctx) ;
    GetThreadContext(hThread,&ctx) ;
}

//不要尝试对正在运行的程序设置上下文,这样造成的后果无法估计,所以在设置调用SetThreadContext时,需要先使用SuspendThread函数挂起线程。
//因为dll是主线程里加载的,我们的dll又要挂起主线程,这样会造成冲突,所以,另开一条线程去挂起线程,设置上下文.

 

程序大概:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//在dll启动时的代码 ,winxp无法调用AddVectoredExceptionHandler
AddVectoredExceptionHandler(1,(PVECTORED_EXCEPTION_HANDLERExceptionHandler );
 
/*因为要设置线程上下文的程序是运行时,所以要挂起主线程,并且为了防止线程堵塞(程序卡死),所以
要先开另一条线程去执行 挂起->断点->恢复
*/
//线程参数:是主线程ID
HANDLE hTread=CreateThread(NULL,0,ThreadProc,GetCurrentThreadId(),0);
 
//线程函数代码
//参数1:要传入主线程ID
DWORD WINAPI ThreadProc(_In_ LPVOID lpParameter)
{
    //打开线程句柄
    HANDLE hThead=OpenThread(THREAD_ALL_ACCESS,TRUE,(DWORD)lpParameter);
    SuspendThread(hThead);//挂起主线程
    SetHwBreakPoint(hThead);
    RespendThread(hThead);//恢复主线程
    return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 9024
活跃值: (6245)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2

拷贝整个程序内存区,然后在内存区里做自己的hook
之后找程序的某些API调用,调用完API修改eip地址,让程序跳到你拷贝的内存区里。


或者找到程序主循环的地方直接做个钩子把EIP带到拷贝区域。

最后于 2022-2-9 21:21 被mudebug编辑 ,原因:
2022-2-9 21:20
1
雪    币: 148
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
又学到新知识了,谢谢兄弟
2022-2-9 21:25
1
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
呓语。 又学到新知识了,谢谢兄弟[em_6]

回错贴,无法删除。

最后于 2022-4-23 00:33 被许胜编辑 ,原因:
2022-4-23 00:31
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mudebug 拷贝整个程序内存区,然后在内存区里做自己的hook之后找程序的某些API调用,调用完API修改eip地址,让程序跳到你拷贝的内存区里。或者找到程序主循环的地方直接做个钩子把EIP带到拷贝区域。
状态同步,其它玩家校验。再由裁判判决。是科学的antiCheat逻辑,随你改,给你玩的快乐,过会封你
2022-4-23 00:32
0
游客
登录 | 注册 方可回帖
返回
//