用C#写的应用程序 怎么加区段,普通vc写的程序都没有问题 请问大家有木有这样的工具如果有请给个链接谢谢
如果必须要自己写的话,OGM  最好不要这样,也给代码或是思路之类的。非常感谢!!!

解决方案 »

  1.   

    因为net程序在节表结束后,还有一些不需要特定文件的偏移数据(简单理解就是特殊数据把),因此,能够增加节表的空间是有限的,没位置增加节表当然增加不上去。
    再说明白点pe文件分为以下几层
    1. dos头      
    2. Dos存根代码
    3. pe 头
    4. 第一节
    5. 第二节
        ...
       第 n  节 
       特殊数据
    普通文件要新增一节需要检测第n节(最后一节)是否有足够的空间去增加新节,如果不够则不能增加。很不幸.net程序基本上都有特殊数据
      

  2.   

    恩 这个我也发现了不知道我的理解是否正确啊我的这个程序加入一个节后,比如啊 只是一个比如 他本应该是从 0x00040000 开始 在0x00040F38这个地方开始 才是我加入节的数据 也就是说相差了0xF38个字节。
    我现在区段是可以加上的
    现在的问题是 XP系统下 我的区段是从0x00040000开始那么我可以知道0x00040F38就是我要的数据
    然而在win7的系统下是从 0x00050000这个开始的也就说 加载到内存中的地址变化了。可是普通VC写的程序 都没有这样的变化 是多少就是多少!很郁闷!
    也可以这样说,如何操作 可以使得在不同的操作系统下,在相同内存地址处存储的数值都是固定不变的。谢谢!!!!
      

  3.   

    你们看看 我都无语了也不说什么复杂的 就单说MZ这个地方吧  我在XP系统下 加载到内存之后的地址是0x00400000 在win7 SP1下 变成了 0x006D0000搞不懂了  怎么会跑到这里来了?凭啥跑到这里来了?
      

  4.   

    抱歉刚才错了 我又自己看了下 在win7 SP1 64位 下 变成了 0x01000000 这个地方,我感觉他们加载地址的不同 就是因为这两个系统 加载的基地址  不一样导致的,可是为什么会因为系统的不同 导致加载的基地址不同的呢?
    我连续发三次帖子了不能顶贴了 路过的朋友帮忙顶下 谢谢!!!!!
      

  5.   

    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,枚举所有节,找到你加入的特定节既可(节头的节表中查找节名称即可)。
      

  6.   

    上面说错了句,当然节表也都存在重新定向的可能,应该为所有加载的dll模块
      

  7.   

    1.说真的我不太明白他为什么他们的基地址不一样,如果像您所说的那样的话,不同的系统有不同的规定,
    2.我自己加的.net节 经过确认是上去了,我可以在内存中找到我加的节的
    3.问题就在这个地方,所以就在想是否有什么办法 可以找到 在不同的系统下。相同的地址处 有着相同的内存数据,这个就是我想要的。那怕 只有100个字节或是更少呢。
    4.其实第四点的话,我觉得应该也是第三点的问题。因为用到的都是RAV(我应该没有写错吧,反正就是相对的虚拟地址),虽然这些值是一样的,但是由于基础地址加载的不同从而导致所做的偏移也是随着变化的。
    5.非常感谢您的回答
    关键:是否可以找到在不同系统下的相同地址处具有相同的内存值哪怕是100个字节或是更少 又或是内存的数值都是0x00 都可以的。