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