zoukankan      html  css  js  c++  java
  • 05 软件断点

    【太多事情要做了,这部分难度对我来说又很大,先写一下大体框架,到时候具体函数逆向分析过程给写出来】

    问题:

    1. INT 3 断点,操作系统检测到的处理流程是什么?

    2. 系统设置的INT 3 断点我们应该如何处理?

    3. 调试器如何下INT 3 断点?

    4. 调试器如何恢复 INT 3 断点?

    1. 调试器检测INT 3的流程

      当发现 CC 指令时,其会查找 IDT 表走 Trap03,3号中断处理函数。

      

      之后就是我们之前学习过的异常派发流程

      

    2. 系统设置的INT 3 断点我们应该如何处理?

      这个我们不用处理,直接 Continue ,系统自动会恢复系统断点。

    3. 调试器如何自己下 INT 3 断点

      首先,先用ReadProcessMemory 读取原来的地址字节(恢复使用)。

      之后,再用 WriteProcessMemory 来写入 CC指令。

    1 // 读取原来的断点
    2     BOOL isRead = ReadProcessMemory(handle, (PVOID)debugAddress, &oldOrgCode, 1, NULL);
    3     UCHAR wirteInt = 0xcc;
    4     
    5     // 写入CC断点
    6     isRead = WriteProcessMemory(handle, (PVOID)debugAddress, &wirteInt, 1, NULL);
    7     

    4. 调试器如何恢复INT 3 断点?

      思路很简单,将CC字节恢复成原来的字节,之后修正EIP将其回到程序之前的。

        WriteProcessMemory(handle, (PVOID)dbgEvent.u.Exception.ExceptionRecord.ExceptionAddress, &oldOrgCode, 1, NULL);
        handleInt3 = TRUE;
        //��ʾ�����
    
        //��ʾ�Ĵ���
        //�ָ�int 3
        HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, TRUE, dbgEvent.dwThreadId);
        CONTEXT context;
        context.ContextFlags = CONTEXT_FULL;
        
        GetThreadContext(hThread, &context); // 获取原来的线程环境
        context.Eip--; // 修正eip
        SetThreadContext(hThread, &context); // 将修改后的eip将线程继续执行
  • 相关阅读:
    打印空格
    进程间的通信
    堆排序算法
    大小端的判断
    bash help
    [Android] How to disable the screen orientation?
    图片的静态动态显示效果
    WPF Threads: Build More Responsive Apps With The Dispatcher
    用node.js+express自建网站发布静态网页
    利用Apache mod_expires 与 mod_headers 实现文件缓存及mod_deflate压缩输出
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11963978.html
Copyright © 2011-2022 走看看