想要了解IDA Pro的内存段如何重命名,以及内存段权限显示异常时应该怎样检查,首先要做的一件事,是把段名称、段类型和段权限这三者区分清楚。段名称主要是为了帮助分析人员识别代码区、数据区和资源区,而Read、Write、Execute这些权限,则会影响IDA对数据是否可写、代码是否可执行的判断。在动手修改之前,应当先核对原始文件的结构,以及程序运行时的内存映射关系,不要为了界面看起来更整齐,反而改错了分析属性。
一、IDA Pro内存段怎么重命名
对内存段进行重命名,并不会直接改动原始程序里的内容,它实际修改的是IDA数据库中记录的段属性。合理的命名能够使反汇编结果、伪代码和交叉引用读起来更加清楚,但段名称本身也有可能会误导反编译器,使其对只读数据做出错误的判断。
1、定位目标内存段
先将光标移动到目标地址上,然后进入【Edit】→【Segments】→【Edit segment】,也可以使用Alt加S快捷键,打开当前段的属性窗口。
在段属性窗口中,会显示起始地址、结束地址、段名称、段类别、寻址模式和访问权限等信息。修改之前,需要先确认当前地址确实属于目标段,避免改错相邻的代码区或数据区。IDA要求每一个有效的程序地址都归属于一个明确的段,一旦段范围出现错误,其中相关的字节就可能无法正常转换为代码或数据。
2、修改段名称
在段属性窗口里找到Segment Name,输入新的名称并保存。
新名称最好能反映该段的实际用途,例如可以命名为启动代码、驱动代码、配置数据、堆区或外设映射区。重命名只会改变IDA数据库中的显示名称,并不会修改PE、ELF或固件文件里原有的节名称,也不会改变程序运行时的加载地址。
3、避免误导反编译器
不要把可写的数据段随意命名为rdata、rodata、const,或者其他明显表示只读的名称。
反编译器会结合段权限、段类别和段名称,来判断一块内存是否可以被修改。如果原本可写的数据被识别成了常量,生成的伪代码中就可能隐藏掉某些条件判断,或者出现向常量内存写入数据的警告。
二、IDA Pro内存段权限显示异常怎么检查
遇到权限显示不正常的情况,不能只靠段名称来做判断。需要将IDA中的Read、Write、Execute设置,与原始文件头、加载器得到的结果以及调试时真实的内存权限放在一起对照。
1、检查权限组合
进入目标段的属性,查看Read、Write和Execute这几项权限,是否符合该区域的实际用途。
普通代码段通常需要读取和执行权限,可写数据段一般需要读取和写入权限,只读常量区多数只给读权限。但加壳程序、自修改代码、即时编译区域和嵌入式固件,可能会使用不同的权限组合,不能直接套用固定规则。
2、核对文件加载方式
确认一下文件是通过PE、ELF这类标准加载器导入的,还是作为原始二进制文件由人工手动加载的。
标准格式的文件一般会带有节属性,IDA可以据此建立段权限。原始固件缺少完整的文件头时,其中的权限往往由加载地址和人工配置决定,因此更容易出现所有区域都显示成相同权限的情况。这时就需要结合芯片内存手册、链接文件或运行时映射,重新进行判断。
3、区分静态段和调试段
在调试过程中,新出现的堆、动态库和解压代码区,可能是由调试器根据当前进程内存临时创建的。
这类Debugger Segment反映的是调试时的状态,不一定与静态文件里的段完全一致。部分临时段在调试结束后就会消失,也可能不参与完整的自动分析。如果看到静态视图和调试视图的权限不一样,应当先确认程序在运行期间是否自行修改了页面权限。
三、段权限设置错误怎么修正
当确认IDA中显示的权限确实有误之后,就可以动手修改段属性,但要明白,这只是在校准分析数据库,并不会自动修改原始程序以及操作系统中真实的内存保护。
1、修改访问权限
进入【Edit】→【Segments】→【Edit segment】,重新勾选Read、Write和Execute,然后保存修改。
如果可写的变量被错误识别成了只读数据,可以把Write权限补充上去。修改完成后,重新按F5刷新伪代码,以便反编译器按照新的段属性重新生成结果。
2、检查段类别和类型
如果权限已经正确,但分析结果依然不正常,就要再去查看Segment Class以及段类型。
像CODE、DATA、STACK和UNK这些类别,都会影响IDA处理段内容的方式。修改段类别时要谨慎一些,因为类别的变化可能会连带改变段的类型。如果代码区显示成了普通数据,变量也无法生成交叉引用,往往需要将权限和类别放在一起检查。
3、不要随意修改段边界
不能为了修正权限,就顺便调整起始地址、结束地址、寻址模式或加载基址。
改动寻址模式,可能会把段内已经识别出的指令和数据一次性清除掉;移动或重定位段,也可能导致原有的交叉引用全部失效。在进行这类操作之前,应该先备份IDB或I64数据库,先将名称和权限改正,再决定是否真的需要重新加载文件。
总结
IDA Pro内存段如何重命名,以及内存段权限显示异常如何检查,可以按照“先定位目标段、再核对地址范围、接着修改名称、然后对照文件与运行时权限”这样的顺序来处理。段名称主要用来提高分析时的可读性,而Read、Write和Execute权限则会直接影响反编译器对代码和数据的判断。发现异常后,应当先确认文件加载方式和运行状态,再去调整段权限,不要一开始就去更改段边界、寻址模式和加载地址。
