【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

简介: 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

文章目录

一、分析 malloc 函数的 arm 汇编语言





一、分析 malloc 函数的 arm 汇编语言


在上一篇博客 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 使用 IDA 打开 arm 动态库文件 | 切换 IDA 中汇编代码显示样式 ) 打开并配置了选项 ;


分析 libc.so 的汇编代码的 malloc 方法 ;


image.png



malloc 方法汇编代码 :


======== S U B R O U T I N E =======================================
.text:00017458
.text:00017458
.text:00017458                 EXPORT malloc
.text:00017458 malloc                                  ; CODE XREF: j_malloc+8↑j
.text:00017458                                         ; DATA XREF: LOAD:00000F9C↑o ...
.text:00017458                 LDR             R1, =(__libc_globals - 0x1745E)
.text:0001745A                 ADD             R1, PC  ; __libc_globals
.text:0001745C                 LDR             R1, [R1,#(dword_9102C - 0x91000)]
.text:0001745E                 CBNZ            R1, loc_17464
.text:00017460                 B.W             je_malloc
.text:00017464 ; ---------------------------------------------------------------------------
.text:00017464
.text:00017464 loc_17464                               ; CODE XREF: malloc+6↑j
.text:00017464                 BX              R1
.text:00017464 ; End of function malloc
.text:00017464
.text:00017464 ; ---------------------------------------------------------------------------
.text:00017466                 ALIGN 4
.text:00017468 off_17468       DCD __libc_globals - 0x1745E
.text:00017468                                         ; DATA XREF: malloc↑r



LDR 是伪指令 , 从全局符号中加载数据到 R1 寄存器 ; 然后加上 PC , PC 是当前位置 与 =(__libc_globals - 0x1745E) 地址的偏移量 ;


PC 与 =(__libc_globals - 0x1745E) 地址相加 , 指向的是 malloc 函数真正的地址 ;


LDR             R1, =(__libc_globals - 0x1745E)
ADD             R1, PC  ; __libc_globals



CBNZ 是不为 0 跳转指令 , 如果不为 0 , 则跳转到 R1


CBNZ            R1, loc_17464


如果 R1 不为 0 , 跳转到此处 ;


BX 是切换状态跳转 , 如果当前是 arm 状态 , 则切换到 thumb 状态 ; 如果当前是 thumb 状态 , 则切换到 arm 状态 ;


这里是第一种情况 , 当前是 arm 状态 , 切换到 thumb 状态 ;


.text:00017464 ; ---------------------------------------------------------------------------
.text:00017464
.text:00017464 loc_17464                               ; CODE XREF: malloc+6↑j
.text:00017464                 BX              R1
.text:00017464 ; End of function malloc
.text:00017464
.text:00017464 ; ---------------------------------------------------------------------------


如果 R1 为 0 , 则直接跳转到 je_malloc 位置 ;


.text:00017460                 B.W             je_malloc


je_malloc : 传统的 malloc 中所有的线程 申请内存 , 都要一起竞争 , 线程越多 , 竞争越激烈 , 效率越低 , 而且是随着线程数量增加 , 效率指数级降低 ;


je_malloc 改进了上述机制 , 每个线程都有自己的内存区域 , 线程增多 , 效率不会指数级下降 , 效率只是缓慢下降 ; 但是如果将线程内存用完 , 也是会指数级降低效率 ;


.text:00065918 ; =============== S U B R O U T I N E =======================================
.text:00065918
.text:00065918
.text:00065918 je_malloc                               ; CODE XREF: malloc+8↑j
.text:00065918                                         ; DATA XREF: .data.rel.ro:0008AD6C↓o
.text:00065918
.text:00065918 var_40          = -0x40
.text:00065918 var_38          = -0x38
.text:00065918 var_34          = -0x34
.text:00065918 var_2C          = -0x2C
.text:00065918 var_28          = -0x28
.text:00065918
.text:00065918 ; __unwind {
.text:00065918                 PUSH.W          {R4-R11,LR}
.text:0006591C                 SUB             SP, SP, #0x1C
.text:0006591E                 MOV             R11, R0
.text:00065920                 LDR.W           R0, =(__stack_chk_guard_ptr - 0x65930)
.text:00065924                 LDR.W           R1, =(je_opt_abort - 0x65932)
.text:00065928                 CMP.W           R11, #0
.text:0006592C                 ADD             R0, PC  ; __stack_chk_guard_ptr
.text:0006592E                 ADD             R1, PC  ; je_opt_abort
.text:00065930                 LDR             R0, [R0] ; __stack_chk_guard
.text:00065932                 LDR             R0, [R0]
.text:00065934                 STR             R0, [SP,#0x40+var_28]
.text:00065936                 LDRB            R0, [R1,#(malloc_slow - 0x8F8A0)]
.text:00065938                 IT EQ
.text:0006593A                 MOVEQ.W         R11, #1
.text:0006593E                 CMP             R0, #1
.text:00065940                 BEQ             loc_65A1C
.text:00065942                 LDR.W           R0, =(je_tsd_tsd_ptr - 0x6594A)
.text:00065946                 ADD             R0, PC  ; je_tsd_tsd_ptr
.text:00065948                 LDR             R0, [R0] ; je_tsd_tsd
.text:0006594A                 LDR             R0, [R0]
.text:0006594C                 BLX             j_pthread_getspecific
.text:00065950                 MOV             R5, R0
.text:00065952                 CMP             R5, #0
.text:00065954                 BEQ.W           loc_65BB4
# ... 省略 ...

image.png


je_malloc 相当复杂 ;


image.png

目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1762 4
|
存储 机器学习/深度学习 数据库
阿里云服务器X86/ARM/GPU/裸金属/超算五大架构技术特点、场景适配参考
在云计算技术飞速发展的当下,云计算已经渗透到各个行业,成为企业数字化转型的关键驱动力。选择合适的云服务器架构对于提升业务效率、降低成本至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供大家了解和选择参考。
1802 61
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
消息中间件 数据可视化 Kafka
docker arm架构部署kafka要点
本内容介绍了基于 Docker 的容器化解决方案,包含以下部分: 1. **Docker 容器管理**:通过 Portainer 可视化管理工具实现对主节点和代理节点的统一管理。 2. **Kafka 可视化工具**:部署 Kafka-UI 以图形化方式监控和管理 Kafka 集群,支持动态配置功能, 3. **Kafka 安装与配置**:基于 Bitnami Kafka 镜像,提供完整的 Kafka 集群配置示例,涵盖 KRaft 模式、性能调优参数及数据持久化设置,适用于高可用生产环境。 以上方案适合 ARM64 架构,为用户提供了一站式的容器化管理和消息队列解决方案。
1370 10
|
存储 机器学习/深度学习 算法
阿里云X86/ARM/GPU/裸金属/超算等五大服务器架构技术特点、场景适配与选型策略
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别。本文将深入解析这些架构的特点、优势及适用场景,帮助用户更好地根据实际需求做出选择。
|
弹性计算 编解码 运维
飞天技术沙龙回顾:业务创新新选择,倚天 Arm 架构深入探讨
飞天技术沙龙回顾:业务创新新选择,倚天 Arm 架构深入探讨
565 1
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
1217 15
Android 系统缓存扫描与清理方法分析
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器ECS架构区别及选择参考:X86计算、ARM计算等架构介绍
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别,本文主要简单介绍下这些架构各自的主要性能及适用场景,以便大家了解不同类型的架构有何不同,主要特点及适用场景有哪些。
2395 10

推荐镜像

更多