《Python灰帽子》之构建自己的windows调试器2--获取寄存器状态信息

1925阅读 0评论2012-04-19 XylDll
分类:Python/Ruby

 在上一篇中主要说的是如何在调试器中加载进程,这一篇说一下如何获取已加载进程的寄存器状态信息

通常我们所说的CPU状态信息是对于线程而言的,所以在获取相关的寄存器信息之前,首先要找到进程下的线程。

假设现在我们已经将某个进程附加到了调试器中,并且已经知道了该进程的PID值。接着,我来说说如何获取相关的寄存器信息。

1.用CreateToolhelp32Snapshot()进行线程枚举,可以得到系统中的线程列表,返回该列表的句柄值;

CreateToolhelp32Snapshot()可以帮助我们获取系统进程列表、系统中的线程列表、被加载到某一进程中的所有模块列表、某个进程所属的堆列表。

该函数有两个参数,我们在使用时第一个参数设置为TH32CS_SNAPTHREAD(0x00000004);第二个参数为该进程的PID值(此时函数在为我们提取线程信息时不理会该参数)。

2.用Thread32First()获取线程列表中的第一个线程;

该API有两个参数,第一个为线程列表的句柄值;第二个指向一个THREADENTRY32结构体类型的变量,该结构体中的dwSize必须正确的设置为该结构体的大小。

3.在上一步执行完后,THREADENTRY32结构体变量就会被赋值,通过比较结构体中的th32OwnerProcessID与该进程的PID值来判断该线程是否属于这个进程,若属于,则将它的TID写入列表中(append函数),否则跳过

      
4.Thread32Next()获取线程列表中的下一个线程
和第3步的处理方式相同,并且重复执行第4步,直到遍历完该线程列表。即获取到了该进程中所有线程的TID。
5.对于每一个线程,先用OpenThread()获取线程句柄
和OpenProcess()使用方法相同。
6.然后用GetThreadContext()获取线程中的上下文信息
两个参数,第一个是线程句柄,第二个是指向一个CONTEXT结构体类型的变量(包含了所有寄存器的当前取值信息)
7.用CloseHandle()关闭该线程列表和所有的线程
只有一个参数,即句柄。
《Python灰帽子》之构建自己的windows调试器二 - XylDll - 七秒钟的记忆
上一篇:《Python灰帽子》之构建自己的windows调试器1--加载进程
下一篇:PE文件与虚拟内存之间的映射