首页 > 其他 > 详细

05 软件断点

时间:2019-11-30 22:31:23      阅读:68      评论:0      收藏:0      [点我收藏+]

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

 

问题:

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将线程继续执行

05 软件断点

原文:https://www.cnblogs.com/onetrainee/p/11963978.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!