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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【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

目录
相关文章
|
11天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
53 6
|
11天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
27 1
|
11天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
12天前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
20天前
|
边缘计算 自动驾驶 5G
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
20天前
|
消息中间件 编解码 开发者
深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构
本文深入探讨了 Flutter 在屏幕适配、横竖屏切换及多屏协作方面的兼容架构。介绍了 Flutter 的响应式布局、逻辑像素、方向感知、LayoutBuilder 等工具,以及如何通过 StreamBuilder 和 Provider 实现多屏数据同步。结合实际应用场景,如移动办公和教育应用,展示了 Flutter 的强大功能和灵活性。
88 6
|
20天前
|
存储 SQL 缓存
AnalyticDB 实时数仓架构解析
AnalyticDB 是阿里云自研的 OLAP 数据库,广泛应用于行为分析、数据报表、金融风控等应用场景,可支持 100 trillion 行记录、10PB 量级的数据规模,亚秒级完成交互式分析查询。本文是对 《 AnalyticDB: Real-time OLAP Database System at Alibaba Cloud 》的学习总结。
37 1
|
22天前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
51 1
|
22天前
|
数据管理 Nacos 开发者
"Nacos架构深度解析:一篇文章带你掌握业务层四大核心功能,服务注册、配置管理、元数据与健康检查一网打尽!"
【10月更文挑战第23天】Nacos 是一个用于服务注册发现和配置管理的平台,支持动态服务发现、配置管理、元数据管理和健康检查。其业务层包括服务注册与发现、配置管理、元数据管理和健康检查四大核心功能。通过示例代码展示了如何在业务层中使用Nacos,帮助开发者构建高可用、动态扩展的微服务生态系统。
67 0