解析进程在内存中映射的信息

来源:互联网 发布:js实现图片旋转效果 编辑:程序博客网 时间:2024/05/19 18:38

 

 

上面这个程序是用来测试用的,大体思路是这样的,通过此程序的进程名获得此进程的PID,进而获取进程信息,将进程信息写到自己定义的缓冲区中(考虑到通用性,缓冲区的类型是BYTE),此时缓冲区里面就存放了这个进程的一些信息,由于是BYTE类型的,不是我们要的类型,所以就要解析(笔者解析的是int型数据)主要看看解析方法:
首先,从缓冲区里面按照一定的大小来读去数据量平台的不一样会导致编译结果的不一样,进而内存信息的地址就会有差别,VC6.0下连续的int类型之间没有空余地址,是紧挨着的,但是VS2008就不一样了,她在编译的时候每个int 类型之间留有8个字节的空字节没有用,此时我们在读的时候就应该以12作为步长来读(int 的四字节加上 预留的8个空字节字节);
下来,就是解析了,笔者利用位操作,将每一个字节的八位数据求出来,存放到一个数组中,数组里存放的就是信息的二进制编码,思路很简单,但是操作起来并不是那样的,举一个例子,拿num1来说,她有四个字节,编译程序的时候一个一个字节都PUSH到栈里面,但是在通过handle读进程信息的时候,会把最后一个字节先读,这样,会导致四个字节数据的逆置,切忌,是四个字节的逆置, 不是左右位的逆置 如下图:
11110000  |  10101000  | 10101010 | 01010101
       1                   2                   3                4
 01010101 | 10101010   | 10101000 | 11110000
4    3 2   1

是字节的逆置,不是位的逆置,此程序当中,四个变量在压栈的时候也满足上面所说,所以解析出的结果,num1,num2,num3,num4也是逆置的。还有一个问题应该注意,那就是在移位操作的时候是从低位开始的取值的,赋值的时候需要从字符串的后面开始赋值,才能取得正确的二进制编码,其实,咱们不需要那样做,大家想一下,咱们是为了解析int,要的是int值,不是二进制编码,利用二进制的零幺编码加上各个位上的权值来算int值的,那么我们就不需要按照逻辑上的从高位到低位来存编码,比如说,咱们算出来的最低位(即第一个算出来的编码)是幺,那么它所确定的值就是1 * 2^0,正好,我们就把第一个权值定义成2^0,也符合认得逻辑思维,权值从小到大排起来。这样以来,按照一个编码对应一个权值就可以把值算出来。此法打破常规,笔者觉得很不错。
接着,我们开始对解析的二进制编码进行int化(笔者把二进制转成int值叫int化),遍历二进制编码数组,遇到幺了就将此时对应的权值加到sum里,最后的结果就是sum,这样就得到那个int值。

注意:在定义全局变量的时候,若要在.cpp文件,和main函数文件中利用那个全局变量,需要在.h文件中声明全局变量为extern的,然后只需要在剩余的那两个.cpp文件中随意的一个文件中定义一下,那么另外一个.cpp文件就知道那个变量是其他文件的了,否则会出现全局变量的多次定义。
下面这个就是我的解析程序,希望大家多提宝贵意见,代码风格,代码解释,语法等,均可提意见,笔者很乐意与大家交流。