首页
社区
课程
招聘
[旧帖] [求助][求助][讨论]关于实现OD内存断点问题 大牛求解 0.00雪花
发表于: 2013-7-10 10:24 1372

[旧帖] [求助][求助][讨论]关于实现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;

}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//