180920(记事本WriteFileAPI钩取+调试器)

记事本WriteFileAPI钩取

调试器(Debugger)进行调试的程序
被调试者(Debuggee):被调试的程序
调试器用来确认被调试者是否正确运行,发现程序错误。调试器能够逐一执行被调试者的指令,拥有对寄存器与内存所有访问权限。
调试器无法处理或者不关心的调试事件最终由OS处理。
EXCEPTION_BREAKPOINT异常是必须被处理的。断点对应的汇编指令为INT3,IA-32指令为0xCC。代码调试遇到INT3指令即中断运行,异常事件被传送到调试器。

实验中首先将notepad用od打开,然后进行一次操作,在od中使用api设置断点手法,通过对进程栈的查看找到数据缓冲区的地址,可以进而通过对目标地址内容的操作达到对程序运行的字符串的修改.我们通过这种方法得知了我们应该修改被调试进程内存的哪一部分。

注意我们在设置断点后,起始地址遇到INT3(0xCC)指令就,EIP的值会增加1个字节.(被调试者的地址因此改变了),但OD等调试器不会显示INT3指令,会自动把字节恢复。

为了防止程序执行流陷入死循环,应该脱钩,即修改起始地址处的0xCC为0x6A,取消对API的钩取。
通过DebugActiveProcess()API将调试器附加到该运行的进程上.
WaitForDebugEvent()发生调试事件,就会将相关事件信息设置到其第一个参数的变量,然后立刻返回。
ReadProcessMemory()来获取第一个字节并暂时存储,WriteProcessMemory()来把第一个字节下断点。

脱钩过程不是必须的,可以取消对相关API的调用,也可以调用用户自定义的函数.
Windows OS是一个多线程(multi-thread)操作系统,同一进程 可以同时运行多个线程。
必须在调试器终止前“脱钩”

调试器

WinDbg

OD和IDA pro都是用户态调试器,WinDbg不仅是用户态调试器,还是内核态调试器,主要用于内核模式调试。可以用来直接下载系统文件符号(Symbol),获取系统内部结构体及API的相关信息。还能用来读取、分析windows OS的转储文件。
图形用户界面比较差。