Chinaunix首页 | 论坛 | 博客
  • 博客访问: 445099
  • 博文数量: 63
  • 博客积分: 1175
  • 博客等级: 少尉
  • 技术积分: 1204
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 11:33
文章分类
文章存档

2015年(1)

2014年(3)

2013年(7)

2012年(52)

分类: Python/Ruby

2012-04-19 11:52:45

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

通常我们所说的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 - 七秒钟的记忆
阅读(1895) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~