草庐IT

Android之区段信息解析

编码安全 2023-03-28 原文

​ 背景

在进行对so的动态调试分析或者静态代码分析的过程中,都免不了和如下的区段相关信息打交道。

上图是ida工具中静态分析so文件代码中的展示,可以通过快捷键shift+F7进行展示(也可以用ndk自带的readelf程序进行查看区段信息)。

上图通过ndk自带的​readelf程序进行查看so文件的区段信息(命令:readelf -S xx.so)。

下面就针对以上的区段名称信息做下梳理。

LOAD解析

它表示的是共享文件(so文件)的加载部分,linker会根据load区段中的偏移信息把整个so文件加载起来。

plt解析

plt也称为:过程链接表,主要用于函数和全局变量的调用。

Plt它是延迟绑定,延迟绑定的规则为只有在符号被真正引用时才进行重定位,而不是在刚开始就对所有的动态符号进行重定位,一方面加快了程序的启动,将整个动态加载时间分摊到程序运行期间,另一方面,对于共享库中没有用到的符号,不再进行重定位,节省了重定位的时间,随着共享库的发展更新,这种优势变得越来越明显。

plt 的好处在于所有需要重定位的指令跳转都保存在 plt 中,便于集中管理、索引,另一方面,plt 还实现了判断符号是否重定位并提供动态链接器的调用功能,这是延迟绑定技术的核心部分。

text解析

代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。

这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。

在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

bss解析

这个bss它包含着将出现在程序的内存映像中的未初始化数据,这个区段它不占用文件空间。

bss段的全称:Block Started by Symbol,它通常是指用来存放程序中未初始化的全局变量的一块内存区域,它是属于静态内存分配。当程序运行结束后有系统释放。

init_array解析

init_array是程序代码可以控制的最早时机, 其次才加载Jni_onload。这个也是很多在动态调试分析下断点的关键地方。

它包含着进程初始化所运行的函数指针数组。

它就如类对象的初始化构造函数。

fini_array解析

它存储的是终止函数段(也就是函数指针数组)。它是程序代码中最后执行的代码。

它就像类对象的析构函数。

got解析

它全名为 global offset table,即全局偏移表。

在执行的指令中,本来需要引用符号 A ,但是 A 存在于动态库中,链接过程并不知道它的地址,于是将 A 的地址部分改写为 GOT 表中某一项数据,在编译阶段 GOT 表中是没有真实数据的,但是在动态链接的加载阶段,动态链接器就可以将符号 A 的真实地址填写到 GOT 表中对应的数据项中,这样指令对 A 就产生了正确的引用。

GOT 中每一个表项占用 4 个字节(32位),表示运行时的符号的真实地址。它是针对外部符号引用的。

用来存放链接器找到的 函数/变量地址,也就是函数的绝对地址。

data解析

数据段:data segment.

它通常是指用来存放程序中已初始化的全局变量的一块内存区域,它是属于静态内存分配。

它在程序的内存映像中存在。

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/

本文转载自微信公众号「编码安全」,可以通过以下二维码关注。转载本文请联系编码安全公众号。

有关Android之区段信息解析的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  5. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  8. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  9. ruby - 如何使用 Nokogiri 解析纯 HTML 表格? - 2

    我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315

  10. ruby - what is - gets is a directory - 错误信息 - 2

    我遇到了这个奇怪的错误.../Users/gideon/Documents/ca_ruby/rubytactoe/lib/player.rb:13:in`gets':Isadirectory-spec(Errno::EISDIR)player_spec.rb:require_relative'../spec_helper'#theuniverseisvastandinfinite...itcontainsagame....butnoplayersdescribe"tictactoegame"docontext"theplayerclass"doit"musthaveahumanplay

随机推荐