首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
编程技术
发新帖
0
5
x64异常的bug
发表于: 2024-12-27 12:02
3253
x64异常的bug
逆向爱好者
2024-12-27 12:02
3253
dll代码 // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" #include<stdio.h> PVOID Hooaddr = 0; LONG FirstVEHandler( EXCEPTION_POINTERS* ExceptionInfo ) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == 0x00C0000005) { if (ExceptionInfo->ExceptionRecord->ExceptionAddress == Hooaddr) { printf("线程到达断点位置%p\n", GetCurrentThreadId()); getchar(); } else { PVOID ExceptionAddress = ExceptionInfo->ExceptionRecord->ExceptionAddress; ULONG64 srartaddress = (ULONG64)ExceptionAddress & 0xFFFFFFFFF000; ULONG64 Hoodstartaadress= (ULONG64)Hooaddr & 0xFFFFFFFFF000; // printf("11\n"); if (srartaddress == Hoodstartaadress) { CONTEXT Context = { 0 }; Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; GetThreadContext(GetCurrentThread(), &Context); //2. 设置陷阱标志位 Context.EFlags |= 0x100; //3. 设置线程上下文 SetThreadContext(GetCurrentThread(), &Context); DWORD oldprotect = 0; VirtualProtect(Hooaddr, 0x1000, PAGE_EXECUTE_READ, &oldprotect); return EXCEPTION_CONTINUE_EXECUTION; } else { printf("ExceptionAddress%p\n", ExceptionAddress); MessageBox(NULL, L"", L"", MB_OK); return EXCEPTION_CONTINUE_SEARCH; } } } if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) { CONTEXT Context = { 0 }; Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; GetThreadContext(GetCurrentThread(), &Context); //2. 判断是否是硬件断点导致的异常 if (Context.Dr6 & 0xF) //B0~B3不为空 硬件断点 { return EXCEPTION_CONTINUE_SEARCH; } else //单步异常 { if (ExceptionInfo->ExceptionRecord->ExceptionAddress == Hooaddr) { printf("线程到达断点位置%p\n", GetCurrentThreadId()); getchar(); } else { PVOID ExceptionAddress = ExceptionInfo->ExceptionRecord->ExceptionAddress; ULONG64 srartaddress = (ULONG64)ExceptionAddress & 0xFFFFFFFFF000; ULONG64 Hoodstartaadress = (ULONG64)Hooaddr & 0xFFFFFFFFF000; if (srartaddress == Hoodstartaadress) { CONTEXT Context = { 0 }; Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; GetThreadContext(GetCurrentThread(), &Context); //2. 设置陷阱标志位 Context.EFlags |= 0x100; //3. 设置线程上下文 SetThreadContext(GetCurrentThread(), &Context); DWORD oldprotect = 0; VirtualProtect(Hooaddr, 0x1000, PAGE_NOACCESS, &oldprotect); return EXCEPTION_CONTINUE_EXECUTION; } else { return EXCEPTION_CONTINUE_SEARCH; } } } } //EXCEPTION_SINGLE_STEP: return EXCEPTION_CONTINUE_SEARCH; } void Init() { MessageBox(NULL, L"点我设置异常", L"", MB_OK); Hooaddr = GetModuleHandle(0); Hooaddr = (PVOID)((ULONG64)Hooaddr + 0x1227C); AddVectoredExceptionHandler(1, FirstVEHandler); DWORD oldprotec = 0; VirtualProtect(Hooaddr, 0x1000, PAGE_NOACCESS, &oldprotec); } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { CreateThread(0, 0,(LPTHREAD_START_ROUTINE) Init, 0, 0, 0); return 1; } case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } exe代码 #include<Windows.h> #include<stdio.h> void runcode() { while (1) { HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, 0, 0x14); PVOID buffer = 0; ReadProcessMemory(handle, (LPVOID)0xFFFFFFFF, &buffer, 8, 0); Sleep(1000); } } int main() { printf("runcode%p\n", runcode); LoadLibrary(L"test.dll"); //CreateThread(0, 0, (LPTHREAD_START_ROUTINE)runcode, 0, 0, 0); //CreateThread(0, 0, (LPTHREAD_START_ROUTINE)runcode, 0, 0, 0); Sleep(1000); CreateThread(0, 0, (LPTHREAD_START_ROUTINE)runcode, 0, 0, 0); Sleep(-1); } 实验结果  那个runcode所在页不可读了 线程第一次读取了那个页后触发异常,然后进入系统异常处理流程,系统异常处理流程又读了那个地址 又触发一个异常,不了了之
回复或点赞可查看完整内容
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
#系统内核
收藏
・
0
点赞
・
5
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
mb_lthgjpwj
为你点赞!
2026-8-21 09:53
npc0vo
感谢你的贡献,论坛因你而更加精彩!
2026-4-26 02:06
wenxuqi
这个讨论对我很有帮助,谢谢!
2025-2-17 20:02
huangyalei
谢谢你的细致分析,受益匪浅!
2024-12-28 00:13
NoHeart
感谢你分享这么好的资源!
2024-12-27 17:32
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
5
)
qj111111
雪 币:
1342
活跃值:
(7015)
能力值:
( LV3,RANK:20 )
在线值:
发帖
14
回帖
222
粉丝
36
关注
私信
qj111111
2
楼
看看是什么
2024-12-27 14:47
0
啊你好哇123
雪 币:
723
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
362
粉丝
0
关注
私信
啊你好哇123
3
楼
学习学习
2024-12-28 01:15
0
NoHeart
雪 币:
1458
活跃值:
(1876)
能力值:
( LV2,RANK:10 )
在线值:
发帖
36
回帖
299
粉丝
7
关注
私信
NoHeart
4
楼
为啥不考虑在内核层做?不用int3是否也能做hook呢?
最后于
2024-12-28 11:36 被NoHeart编辑 ,原因:
2024-12-28 11:32
0
fanfall
雪 币:
659
活跃值:
(1555)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
42
粉丝
0
关注
私信
fanfall
5
楼
学习学习
2025-4-5 00:42
0
mb_irrqcmsq
雪 币:
280
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
60
粉丝
0
关注
私信
mb_irrqcmsq
6
楼
谢谢,太厉害了
2026-5-28 10:55
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
逆向爱好者
37
发帖
280
回帖
20
RANK
关注
私信
他的文章
[讨论]ollvm对函数大小有限制?
339
[建议]capstone_bug
405
[求助]x64系统中 32位程序单步执行遇到切换x64环境崩溃问题
1781
[求助]capstone反汇编引擎问题
1728
[讨论]mouse-event 和 SendInput 混用 + 高频调用
1446
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部