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将线程继续执行
posted @ 2019-11-30 21:11  OneTrainee  阅读(414)  评论(0编辑  收藏  举报