美文网首页
2018-08-15 Windows调试和内核

2018-08-15 Windows调试和内核

作者: kotw_zjc | 来源:发表于2018-08-16 18:23 被阅读0次

Windows调试

软件调试分类。按目标代码的执行模式:内核态调试,用户态调试;按调试器与调试目标的相对位置:本机调试,远程调试;按活动目标的活动:活动目标调试,转储文件调试。

断点。根据断点的设置位置:代码断点、数据断点、IO断点;根据断点的设置方式:软件断点、硬件断点;条件断点。

栈回溯:目前的主流CPU架构都是使用栈来进行函数调用的,

基本原则:用头脑去分析思考与错误征兆有关的信息;避开死胡同;只把调试工具当做手段,利用调试工具,可以帮助思考,但不能代替思考;避免用试探法,最多把它当做最后手段;在出现错误的地方,可能还有别的错误;修改错误的一个常见失误是只修改了这个错误的征兆或表现,没有修改错误本身;注意修改一个错误的同时可能会引入新的错误;修改错误的同时迫使人们进入程序设计阶段,修改错误也是程序设计的一个表现形式。

调试系统的实现。调试器与被调试程序建立联系,程序向调试器发送调试信息,调试器暂停程序处理完调试信息后再恢复程序运行,如此周而复始。调试任务的顺利进行在于调试器与调试程序两者间的事件交互,既然是两个进程间的交互,那么必定涉及进程间通信的问题,进程间通信是靠所有进程共享高2G内核空间中的内核对象。调试对象就是调试器与被调试程序间通讯的桥梁,调试对象保存在调试器TEB线程环境变量块DbgSsReserved[1]中,保存在被调试进程的DebugPort字段中。所以判断一个进程是否被调试可以看这个进程的DebugPort字段。游戏保护其中的一种保护手段就是通过不断抹除DebugPort,从而达到反调试的目的。

调试消息传递过程。调用CreateThread函数时,函数建立了线程必要的内核对象和数据结构,做了必要的登记后,最终会调用PspUserthreadStartUp函数,准备启动该线程。为了支持调试,PspUserThreadStartUp函数总是会调用DbgkCreateThread,以便采集调试事件。DbgCreateThread函数会检查自己的DebugPort字段是否为空来判断自己是否被调试,如果被调试,则采集调试信息调用DbgkpSendApiMessage函数向DebugPort发送消息。同理可得LoadLibrary会调用系统函数NtMapViewOfSection然后会调用采集函数DbgkMapViewOfMapSection,最后判断自己是否被调试决定是否采集调试事件来调用DbgkpSendApiMessage。


Windows内核

内核。内核是执行体的下一个层次,它为执行体提供一些最基本的功能,简单的对象,而执行体就通过在这些简单对象上加上一些安全属性,控制属性来完成更为复杂的功能。它主要提供以下四种函数:线程调度、陷阱处理和异步调度、中断处理和调度、多处理器同步。

内核提供了一个低层次的系统原语和机制供执行体来调用以实现其功能。内核只是提供了底层的机制,而不做任何策略性的食物。但线程的调度和异常处理是在内核中实现的,内核永远都运行在核心态。

一类对象叫做控制对象,包括APC、DPC对象以及I/O要用到的对象,如中断对象;一类对象叫做调度对象,用于线程调度。这些对象包括线程、互斥体、事件、内核事件对,信号量,定时器,可等待定时器。

硬件支持。内核的另一主要功能是使得执行体和设备驱动独立于硬件,这个工作包含处理多个方面的差异:中断处理,异常处理,多处理器同步方式的差异。

设备驱动程序。设备驱动程序是核心态可加载模块(以.SYS为扩展名),它们是I/O管理器和相关硬件设备的接口。它们运行于以下三种环境之下:在一个初始化了I/O函数的用户线程环境中;在内核模式的系统线程中;中断发生后(不在任何进程和线程中运行,中断发生时哪一个进程或者线程正在运行)。设备驱动程序通过使用HAL可以实现平台无关性

相关文章

网友评论

      本文标题:2018-08-15 Windows调试和内核

      本文链接:https://www.haomeiwen.com/subject/vjjibftx.html