`

看你知道不知道之-为进程内部件设置基地址

阅读更多

在用Project Analyzer 进行一个VB6的Dll工程进行代码分析的时候得到这么一个警告:

Problem description - WFWKernel
 
Base address unoptimal: WFWKernel
 
Type      Optimization
Severity  Warning
Location  WFWKernel.vbp
 
Description
 
A library project's base address is set to the default value (&H11000000) in project options. When loading the library, the operating system tries to load it at this address. If not possible, it relocates the library. Changing this address to another value will help to reduce the likelihood of relocation, thus making the library load faster. The base address affects ActiveX OCX, ActiveX DLL and .NET Class Library projects. Notice that in .NET projects, different configurations (Debug/Release) can have different base address values. The rule works on the currently selected configuration.
 
Project Analyzer 7.0.05 (2006-2-13)

这是什么原因呢?什么是Base address unoptimal警告呢?

MSDN解释如下:

为进程内部件设置基地址

在 32 位的操作系统中,只要部件被加载在它的基地址上,使用部件的各个进程就可以共享进程内部件(.dll 或 .ocx 文件)的代码页。这样,可以有三个客户应用程序使用部件中的控件,而代码只需向内存中加载一次。
相反,如果进程内部件使用的内存地址与另一个进程内部件或可执行程序的使用内存地址发生了冲突,部件就必须被重定基址到可执行进程空间的另一个逻辑内存位置。
重定基址需要操作系统动态地重新计算代码和数据加载的逻辑内存位置。这种重新计算会减慢进程的加载,而被动态重定位的代码一般不能被可执行文件共享。
合理选择基地址,可以极大地改善部件对内存的使用。

设置基地址

要输入部件的基地址,打开“工程属性”对话框,然后选择“编译”选项卡。在“DLL 基地址”框中以无符号的十进制或十六进制整数输入地址。
缺省值是 &H11000000 (285,212,672)。如果不改变这个值,部件会与每个使用缺省值编译的进程内部件冲突。建议使用远离这个地址的基地址。
选择基地址
在 16M (16,777,216 或 &H1000000) 字节和 2G (2,147,483,648 或 &H80000000) 字节之间选择基地址。
基地址必须是 64K 的倍数。部件使用的内存从初始基地址开始,大小为编译了的文件大小四舍五入为 64K 的倍数。
程序不能大于 2G,因此,最大的基地址实际上是 2G 字节再减去部件使用的内存大小。
注意 可执行文件一般加载在 4M 字节的逻辑地址处。小于 4M 字节的区域是保留给 Windows 95 的,而 2G 以上的区域是保留给 Windows 95 和 Windows NT 的。

使用良好的随机数生成器

由于无法知道用户使用的其它进程内部件会选择什么基地址,所以,最实用的办法就是在指定范围内随机地选择一个地址,并四舍五入为 64K 的倍数。
如果公司制作了很多进程内部件,为第一个部件随机计算基地址,其它部件的地址远离第一个部件地址。这样,至少一个公司的部件就不会有内存冲突问题了。

呵呵,原来如此,但是有多少人在做DLL的时候处理基地址了呢?还有几个人做代码检查的时候使用P7呢?

分享到:
评论

相关推荐

    查找(Dll)基地址和指定函数地址的一种方法

    当DLL被加载到进程的地址空间时,系统会为它分配一块连续的内存区域,并将其基地址与DLL头文件中的信息关联起来。 接下来,我们要提到的是输出表(Export Table)。这是DLL中用于记录可供其他程序调用的函数和变量...

    易读言读取进程基址

    当一个EXE文件加载到内存时,操作系统会为它分配一块连续的内存区域,这就是进程的基地址。DLL是可被多个进程共享的代码模块,它们也有各自的基地址。 读取EXE基址通常是为了获取程序的关键数据或函数指针。在...

    进程模块查看工具-PCHunter

    PCHunter的主要功能便是查看这些进程模块,它可以清晰地列出当前系统中所有运行进程的模块信息,包括模块名称、基地址、大小、加载状态等,帮助用户识别是否存在异常的DLL加载。这对于排查潜在的安全风险至关重要,...

    易语言隐藏所有进程模块

    一旦知道模块基地址,就可以访问和操作模块内的数据和函数。 3. **子程序_读内存地址**:在Windows中,进程间通信(IPC)或修改其他进程内存状态时,需要读取或写入内存地址。这个子程序提供了读取内存的能力,是...

    通过进程句柄取得PID的软件源码

    在给定的代码示例中,主要关注的是`ProcessBasicInformation`类别的信息,这包含了诸如进程状态、PEB基地址、亲和掩码、基本优先级、唯一进程ID等关键数据。 ### 二、`PROCESS_BASIC_INFORMATION`结构体 `PROCESS_...

    易语言遍历CSRSS进程源码

    理解如何解析这些模块信息,包括模块名称、基地址、大小等,可以帮助我们分析进程的行为。 此外,遍历线程时,我们需要使用“获取线程列表”命令。每个线程都有自己的ID和状态,我们可以跟踪它们的执行情况。通过...

    进程模块查看器,支持32位和64位进程

    2. **基地址**:每个模块在进程的虚拟地址空间中都有一个起始地址,称为基地址。这是模块在内存中的加载位置,对于动态定位和代码执行至关重要。 3. **模块入口点**:这是模块执行的起点,通常在可执行文件中是程序...

    [E语言]枚举进程模块(例程)源码

    你可以打印模块名称,记录其基地址,或者进行其他分析。 4. **关闭进程句柄**:完成枚举后,记得使用`close_handle`关闭进程句柄,释放资源。 在源码中,`[原创]枚举进程模块(例程).e`很可能包含了实现以上步骤的...

    取指定进程所有模块信息 易源

    这涉及到操作系统内部的进程管理、内存管理和模块加载机制。下面将详细解释这个过程及其相关的知识点。 首先,我们需要了解什么是“进程”。在计算机科学中,进程是操作系统资源分配的基本单位,它代表了一个正在...

    进程模块dll查看器dll查看器

    3. 模块名:加载到进程中的DLL文件的名称,包括基地址和大小。 4. 加载时间:DLL被加载到进程中的时间戳。 5. 版本信息:DLL的版本号、公司名、产品名等详细信息,有助于识别是否为最新或正确版本。 6. 数字签名:...

    进程间谍1.0.6.0

    通过"进程间谍",用户可以查看每个进程加载的模块列表,包括模块名称、大小、基地址等,这有助于识别潜在的恶意注入或非法模块活动。 3. **线程监控**:线程是进程内的执行单元,每个进程可以包含多个线程。软件...

    取系统所有进程及父进程模块.zip易语言项目例子源码下载

    在Windows中,可以使用`EnumProcessModules`函数来枚举一个进程的所有模块,再通过`GetModuleBaseName`获取模块的基地址和名称。 易语言项目中的源码将展示如何封装这些系统调用,创建易语言的接口供用户使用。通过...

    用Delphi内嵌汇编实现缷载任意进程的某个DLL.zip

    2. **找到DLL在进程中的基地址**:接着,我们需要知道DLL在目标进程中加载的基地址。这可以通过枚举进程的模块列表(使用`EnumProcessModules`和`GetModuleBaseName`函数)来实现。 3. **内嵌汇编实现**:在Delphi...

    物理存储器与进程逻辑地址空间的管理.pdf

    而逻辑地址空间,也称为虚拟地址空间,是指操作系统为每个运行的进程提供一个看上去是连续的、私有的地址空间。 物理存储器管理涉及如何将物理存储器分配给进程使用,这包括内存的分配和回收。操作系统为有效管理...

    完整版所有进程模块.rar

    这包括每个进程加载的动态链接库、它们的版本信息、依赖关系以及模块在内存中的基地址等。这种信息对于系统管理员来说非常有价值,可以帮助他们识别潜在的安全问题(比如未授权的DLL注入),调试软件错误,或者优化...

    《你必须知道的495个C语言问题》

    2.18 既然数组名可以用作数组的基地址,为什么对结构不能这样? 29 2.19 程序运行正确,但退出时却“core dump ”(核心转储)了,怎么回事? 29 联合 30 2.20 结构和联合有什么区别? 30 2.21 有办法初始化...

    易语言遍历进程模块源码.zip

    学习并理解这个源码,不仅能帮助你掌握易语言的基本编程技巧,还能让你深入理解Windows系统内部的工作原理,特别是进程和模块管理的部分。对于希望从事系统编程或逆向工程的开发者来说,这是一段非常有价值的实践...

    中科大软件学院历年面试真题.pdf

    - **定义**: 存储段基地址的寄存器。 - **作用**: 用于段式内存管理中。 **55. 进程线程树图** - **定义**: 一种表示进程与线程之间关系的图形。 - **用途**: 展示进程和线程的层次结构。 **56. 作业与进程的区别...

    Windows Memory Layout, User-Kernel Address Spaces

    - **ImageBaseAddress**:当前进程的可执行映像基地址。 - **Ldr**:指向PEB_LDR_DATA结构的指针,用于管理加载的DLL列表。 - **ProcessParameters**:指向RTL_USER_PROCESS_PARAMETERS结构的指针,包含进程启动参数...

    ARM的CP15协处理寄存器

    | 1 | 各种控制位 | 存储保护和控制 | 地址转换表基地址 | | 2 | Cachability的控制位 | 缓存能力的控制 | 保留 | | 3 | 存储保护和控制 | 域访问控制位 | Bufferablity控制位 | | 4 | 存储保护和控制 | 保留 | 保留...

Global site tag (gtag.js) - Google Analytics