当前位置: 首页 > 科技观察

Androidsection信息分析

时间:2023-03-13 15:34:12 科技观察

背景在so的动态调试分析或者静态代码分析过程中,不可避免的要处理以下section相关的信息。上图是在ida工具中静态分析so文件代码时的显示,可以通过快捷键shift+F7显示(也可以使用ndk自带的readelf程序查看段信息)。上图中,通过ndk自带的readelf程序(命令:readelf-Sxx.so)查看so文件的section信息。以下是以上节名信息的汇总。LOAD将其解析为表示共享文件(so文件)的加载部分,链接器会根据加载部分中的偏移信息加载整个so文件。plt分析plt又叫:过程链接表,主要用于调用函数和全局变量。Plt是延迟绑定。延迟绑定的规则是只在实际引用符号时才重定位,而不是一开始就重定位所有动态符号。一方面,它加快了程序的启动速度,将整个动态加载时间分配给了程序的运行。另一方面,共享库中未使用的符号不再重定位,从而节省了重定位时间。随着共享库的发展和更新,这种优势越来越明显。plt的好处是所有需要重定位的指令跳转都存储在plt中,便于集中管理和索引。另一方面,plt也实现了判断符号是否重定位,提供动态链接器调用的功能。技术的核心部分。文本解析代码段(codesegment/textsegment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行之前就已经确定了,内存区域通常是只读的(有些架构还允许代码段是可写的,这样就可以修改程序)。在代码段中,还可以包含一些只读的常量变量,比如字符串常量等。bss解析这个bss,其中包含未初始化的数据,这些数据会出现在程序的内存映像中。此部分不占用文件空间。bss段全称:BlockStartedbySymbol,通常指程序中用来存放未初始化全局变量的一块内存区域,属于静态内存分配。当程序运行结束后,会被系统释放。init_array解析init_array是程序代码能控制的最早时间,其次是Jni_onload。这也是动态调试分析下很多断点的重点。它包含进程初始化运行的函数指针数组。它就像类对象的初始化构造函数。fini_array解析它存储的是终止函数段(即函数指针数组)。它是程序代码中最后执行的代码。它就像类对象的析构函数。Got解析了它的全称asglobaloffsettable,也就是全局偏移表。在执行的指令中,原本需要引用符号A,但是A存在于动态库中,链接进程不知道它的地址,所以将A的地址部分改写为GOT表中的某一项数据.在编译阶段,GOT表中的符号A并没有真正的数据,但是在动态链接的加载阶段,动态链接器可以将符号A的真实地址填入GOT表中对应的数据项中,从而使指令生成对A的正确引用。GOT中的每一项占用4个字节(32位),代表符号在运行时的真实地址。它是针对外部符号引用的。用于存放链接器找到的函数/变量地址,即函数的绝对地址。数据分析数据段:数据段。通常指的是程序中用来存放初始化的全局变量的一块内存区域,属于静态内存分配。它存在于程序的内存映像中。ret解析它的作用:当这个程序被加载到内存中时,它通过自己的rel入口告诉链接器哪些地方需要重定位。只要是rel开头的,就表示搬迁相关的信息。Rodata将其解析为主要是字符串常量段。它包含只读数据,这些数据通常会参与过程映像的只读代码段。extern对其进行解析表明是外部导入函数,也就是这个so文件中需要使用的外部函数。data.rel.ro解析它的作用是代表程序初始化时的只读数据段。ARM.extab解析。ARM.extab作为.ARM.exidx的附属存在,用于存储数据,但不能直接找到每条数据的入口。ARM.exidx解析包含展开堆栈信息的部分。dynsym和dynstr解析dynsym和dynstr统称为符号表。对于在链接阶段没有解析的符号,需要在动态链接阶段解析和重定位。这些未解析的符号存储在.dynsym中,对应的字符串存储在.dynstr中。.dynstr和.dynsym都是以'\0'结尾的动态符号表字符串信息。dynsym是保存动态链接相关的符号,记录它们的偏移值。dynstr是dynsym的辅助部分。更多详细内容请参考arm文档:https://developer.arm.com/本文转载自微信公众号“编码安全”,可通过以下二维码关注。转载本文请联系编码安全公众号。