imageBase的值只是系统加载进内存时映像的第一个字节的首选地址,pecoff文档中这样说明, 当加载进内存时1.映像的第一个字节的首选地址。它必须是64K的倍数。DLL默认是0x10000000。Windows CE EXE默认是0x00010000。Windows NT、Windows 2000、Windows XP、 Windows 95、Windows 98和 Windows Me 默认是0x00400000。他可没有说win7.因此程序装载的基地址imagebase存在重定向的可能,当然节表也都存在重新定向的可能。 2.你.net节表是否成功加载,我倒是比较怀疑的,你先检查下section中是否增加了你希望的节? 3.加载地址发生了变化又有什么关系,pe文件中所有的地址都是相当与基地的偏移量,内存中是rva,文件中是raw,只要我们通过getmodulehandle获得基本地址即可。 4.再说你要找到特定的节,那么我们也只需要我们也只需要根据NumberOfSections,枚举所有节,找到你加入的特定节既可(节头的节表中查找节名称即可)。
再说明白点pe文件分为以下几层
1. dos头
2. Dos存根代码
3. pe 头
4. 第一节
5. 第二节
...
第 n 节
特殊数据
普通文件要新增一节需要检测第n节(最后一节)是否有足够的空间去增加新节,如果不够则不能增加。很不幸.net程序基本上都有特殊数据
我现在区段是可以加上的
现在的问题是 XP系统下 我的区段是从0x00040000开始那么我可以知道0x00040F38就是我要的数据
然而在win7的系统下是从 0x00050000这个开始的也就说 加载到内存中的地址变化了。可是普通VC写的程序 都没有这样的变化 是多少就是多少!很郁闷!
也可以这样说,如何操作 可以使得在不同的操作系统下,在相同内存地址处存储的数值都是固定不变的。谢谢!!!!
我连续发三次帖子了不能顶贴了 路过的朋友帮忙顶下 谢谢!!!!!
2.你.net节表是否成功加载,我倒是比较怀疑的,你先检查下section中是否增加了你希望的节?
3.加载地址发生了变化又有什么关系,pe文件中所有的地址都是相当与基地的偏移量,内存中是rva,文件中是raw,只要我们通过getmodulehandle获得基本地址即可。
4.再说你要找到特定的节,那么我们也只需要我们也只需要根据NumberOfSections,枚举所有节,找到你加入的特定节既可(节头的节表中查找节名称即可)。
2.我自己加的.net节 经过确认是上去了,我可以在内存中找到我加的节的
3.问题就在这个地方,所以就在想是否有什么办法 可以找到 在不同的系统下。相同的地址处 有着相同的内存数据,这个就是我想要的。那怕 只有100个字节或是更少呢。
4.其实第四点的话,我觉得应该也是第三点的问题。因为用到的都是RAV(我应该没有写错吧,反正就是相对的虚拟地址),虽然这些值是一样的,但是由于基础地址加载的不同从而导致所做的偏移也是随着变化的。
5.非常感谢您的回答
关键:是否可以找到在不同系统下的相同地址处具有相同的内存值哪怕是100个字节或是更少 又或是内存的数值都是0x00 都可以的。