.net 如果我想重新设置DLL的基址';s、 我该怎么做呢?

.net 如果我想重新设置DLL的基址';s、 我该怎么做呢?,.net,dll,rebasing,.net,Dll,Rebasing,这是本书的延续 我正在测试是否重新调整.NET DLL的基址,并且对它们进行加密将在终端服务器的内存中为我提供更多的共享代码 然而,我的计划似乎有一个缺陷,那就是我似乎无法找到一种工作方法来计算一组工作地址 我想我能做的是: 只要建造并修复一切 启动程序,确保已加载所有DLL 使用/R PROGRAMNAME获取运行实例当前正在使用的地址列表 使用重新映射的DLL的地址作为这些DLL的新基址 解开所有的东西,从1点开始 然而,这已经变成了一个练习,因为对某些DLL重新设置基址的行为显然改变了加载

这是本书的延续

我正在测试是否重新调整.NET DLL的基址,并且对它们进行加密将在终端服务器的内存中为我提供更多的共享代码

然而,我的计划似乎有一个缺陷,那就是我似乎无法找到一种工作方法来计算一组工作地址

我想我能做的是:

  • 只要建造并修复一切
  • 启动程序,确保已加载所有DLL
  • 使用/R PROGRAMNAME获取运行实例当前正在使用的地址列表
  • 使用重新映射的DLL的地址作为这些DLL的新基址
  • 解开所有的东西,从1点开始
  • 然而,这已经变成了一个练习,因为对某些DLL重新设置基址的行为显然改变了加载顺序或操作系统重新定位其他DLL的方式

    例如,假设在初次运行之后,我有一个列表,上面说DLL a、B和C需要位于地址1000、2000和3000。没有提到DLL D、E和F,它们也是同一个系统的一部分。大概这些都是在当前的基地址加载的,否则我会假设ListDLL会告诉我这一点

    所以我改变了A,B,C的地址,重复所有的操作,现在DLL C,D和E都被重新定位了。A和B现在都正常了,E和F现在被重新定位了,C仍然在移动

    我意识到这个练习有点徒劳无益,因为不管我在我的机器上发现了什么,目标终端服务器上正在使用和注入的DLL可能会干扰这张图片,但我认为,如果我至少能够确保某些DLL位于其指定的基址,那么同一程序的多个实例之间的共享代码量就会增加。只是说,只是为了不需要“提醒”我:)

    由于所有DLL的原始基址都是默认的,这意味着每个DLL(可能除了第一个加载的DLL)都被重新定位,并因此映射到页面文件,因此我认为可能会有超过0的潜在增益


    有什么建议吗?

    您可以使用DUMPBIN(在Visual Studio中提供)找到DLL首选的加载地址和内存范围,并根据这些数字进行规划

    dumpbin/headers将为您提供:

     7DC90000 image base (7DC90000 to 7DD5FFFF)
    

    如果您根据首选加载地址进行规划,您应该没有问题。

    您可以使用DUMPBIN(在Visual Studio中提供)找到DLL首选加载地址和内存范围,并根据这些数字进行规划

    dumpbin/headers将为您提供:

     7DC90000 image base (7DC90000 to 7DD5FFFF)
    

    如果您根据首选加载地址进行计划,您应该不会有任何问题。

    您不是指海森堡,而是指薛定谔(即哥本哈根解释)。不确定性描述了一个系统中如何存在有限的已知信息集,哥本哈根是关于交互行为如何改变状态(非常松散)。“重定基址”折叠了代码波:)Linux等ELF系统上的prelink首先扫描系统上的每个共享库和二进制文件,然后计算最佳布局。在窗户上没有办法做到这一点吗?你不是指海森堡,你是指薛定谔(也就是哥本哈根解释)。不确定性描述了一个系统中如何存在有限的已知信息集,哥本哈根是关于交互行为如何改变状态(非常松散)。“重定基址”折叠了代码波:)Linux等ELF系统上的prelink首先扫描系统上的每个共享库和二进制文件,然后计算最佳布局。在Windows上没有办法做到这一点吗?