-
-
[旧帖] [求助][求助][讨论]关于实现OD内存断点问题 大牛求解 0.00雪花
-
发表于: 2013-7-10 10:24 1372
-
实现思路是这样的
调用VirtualProtect 修改一段代码的内存页面保护为 PAGE_NOACCESS
测试发现 VirtualProtect 第二个参数好像有点鸡肋 虽然是指定字节 但是实际是以页位单位
假如我需要断点的位置是0x42000这个地址是处于页面尾部 一页的大小是4KB 也就是说他的首地
是0x41000 只要代码在执行0x41000 - 0x42000之间的代码都会引发异常 引发异常之后 我在
异常处理代码中需要恢复页面保护 让他继续执行 但这里又得考虑修改回来! 于是我改写TF值让
他引发单步异常 从而实现精确定位 因为小弟对TF异常特性不是太了解 写的代码会陷入死循环
不知道如何实现精确定位 下面贴上我异常处理代码 希望大牛可以位我解惑
C代码
DWORD NTAPI ExceptionHandler(EXCEPTION_POINTERS * ExceptionInfo) //异常接受函数
{
//if (ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP) //硬件断点执行触发的是单步调试
//MessageBox(NULL,"111","111",NULL);
DWORD Temp;
VirtualProtect((LPVOID)0x86bd40,1,PAGE_EXECUTE_READWRITE,&Temp); //恢复属性 因为下面有判断需要访问
MEMORY_BASIC_INFORMATION Bit;
VirtualQuery((LPVOID)0x86bd40,&Bit,sizeof(MEMORY_BASIC_INFORMATION)); //获取页面首地址
if((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress == 0x86db40) //判断当前发送异常的位置是否是我要的位置
{
//MessageBox(NULL,"111","111",NULL);
ExceptionInfo->ContextRecord->Eax = 1;
ExceptionInfo->ContextRecord->Esp = ExceptionInfo->ContextRecord->Esp + 0x10;
ExceptionInfo->ContextRecord->Eip = ExceptionInfo->ContextRecord->Eip + 0x5;
OldAddrs = (DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress;
ExceptionInfo->ContextRecord->EFlags |= 0x100;
return EXCEPTION_CONTINUE_EXECUTION;
}
if((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress >= (DWORD)Bit.BaseAddress &&
(DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress < (DWORD)Bit.BaseAddress+0x1000)//如果异常出现在我所修改的页面保护中 就设置TF标志位 让他进行单步
{
//MessageBox(NULL,"222","222",NULL);
ExceptionInfo->ContextRecord->EFlags |= 0x100;
OldAddrs = (DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress;
return EXCEPTION_CONTINUE_EXECUTION;
}
//上面这句好像会陷入死循环
VirtualProtect((LPVOID)0x86bd40,1,PAGE_NOACCESS,&Temp); //如果不属于我下端的页面地址中所引发的异常 我就修改页面保护为不可访问 然后不处理
return EXCEPTION_CONTINUE_SEARCH;
}
调用VirtualProtect 修改一段代码的内存页面保护为 PAGE_NOACCESS
测试发现 VirtualProtect 第二个参数好像有点鸡肋 虽然是指定字节 但是实际是以页位单位
假如我需要断点的位置是0x42000这个地址是处于页面尾部 一页的大小是4KB 也就是说他的首地
是0x41000 只要代码在执行0x41000 - 0x42000之间的代码都会引发异常 引发异常之后 我在
异常处理代码中需要恢复页面保护 让他继续执行 但这里又得考虑修改回来! 于是我改写TF值让
他引发单步异常 从而实现精确定位 因为小弟对TF异常特性不是太了解 写的代码会陷入死循环
不知道如何实现精确定位 下面贴上我异常处理代码 希望大牛可以位我解惑
C代码
DWORD NTAPI ExceptionHandler(EXCEPTION_POINTERS * ExceptionInfo) //异常接受函数
{
//if (ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP) //硬件断点执行触发的是单步调试
//MessageBox(NULL,"111","111",NULL);
DWORD Temp;
VirtualProtect((LPVOID)0x86bd40,1,PAGE_EXECUTE_READWRITE,&Temp); //恢复属性 因为下面有判断需要访问
MEMORY_BASIC_INFORMATION Bit;
VirtualQuery((LPVOID)0x86bd40,&Bit,sizeof(MEMORY_BASIC_INFORMATION)); //获取页面首地址
if((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress == 0x86db40) //判断当前发送异常的位置是否是我要的位置
{
//MessageBox(NULL,"111","111",NULL);
ExceptionInfo->ContextRecord->Eax = 1;
ExceptionInfo->ContextRecord->Esp = ExceptionInfo->ContextRecord->Esp + 0x10;
ExceptionInfo->ContextRecord->Eip = ExceptionInfo->ContextRecord->Eip + 0x5;
OldAddrs = (DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress;
ExceptionInfo->ContextRecord->EFlags |= 0x100;
return EXCEPTION_CONTINUE_EXECUTION;
}
if((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress >= (DWORD)Bit.BaseAddress &&
(DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress < (DWORD)Bit.BaseAddress+0x1000)//如果异常出现在我所修改的页面保护中 就设置TF标志位 让他进行单步
{
//MessageBox(NULL,"222","222",NULL);
ExceptionInfo->ContextRecord->EFlags |= 0x100;
OldAddrs = (DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress;
return EXCEPTION_CONTINUE_EXECUTION;
}
//上面这句好像会陷入死循环
VirtualProtect((LPVOID)0x86bd40,1,PAGE_NOACCESS,&Temp); //如果不属于我下端的页面地址中所引发的异常 我就修改页面保护为不可访问 然后不处理
return EXCEPTION_CONTINUE_SEARCH;
}
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
他的文章
- [讨论]内存访问断点如何过滤异常 1628
- [讨论]关于模仿OD单步执行的问题 1661
- [求助][求助][讨论]关于实现OD内存断点问题 大牛求解 1373
看原图
赞赏
雪币:
留言: