【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

目录
相关文章
|
9天前
|
机器学习/深度学习 安全 算法
十大主流联邦学习框架:技术特性、架构分析与对比研究
联邦学习(FL)是保障数据隐私的分布式模型训练关键技术。业界开发了多种开源和商业框架,如TensorFlow Federated、PySyft、NVFlare、FATE、Flower等,支持模型训练、数据安全、通信协议等功能。这些框架在灵活性、易用性、安全性和扩展性方面各有特色,适用于不同应用场景。选择合适的框架需综合考虑开源与商业、数据分区支持、安全性、易用性和技术生态集成等因素。联邦学习已在医疗、金融等领域广泛应用,选择适配具体需求的框架对实现最优模型性能至关重要。
158 79
十大主流联邦学习框架:技术特性、架构分析与对比研究
|
3月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
21天前
|
测试技术 双11 开发者
一文分析架构思维之建模思维
软件里的要素不是凭空出现的,都是源于实际的业务。本文从软件设计本源到建模案例系统的介绍了作者对于建模的思维和思考。
|
3月前
|
数据采集 自然语言处理 搜索推荐
基于qwen2.5的长文本解析、数据预测与趋势分析、代码生成能力赋能esg报告分析
Qwen2.5是一款强大的生成式预训练语言模型,擅长自然语言理解和生成,支持长文本解析、数据预测、代码生成等复杂任务。Qwen-Long作为其变体,专为长上下文场景优化,适用于大型文档处理、知识图谱构建等。Qwen2.5在ESG报告解析、多Agent协作、数学模型生成等方面表现出色,提供灵活且高效的解决方案。
331 49
|
2月前
|
机器学习/深度学习 存储 人工智能
基于AI的实时监控系统:技术架构与挑战分析
AI视频监控系统利用计算机视觉和深度学习技术,实现实时分析与智能识别,显著提升高风险场所如监狱的安全性。系统架构包括数据采集、预处理、行为分析、实时决策及数据存储层,涵盖高分辨率视频传输、图像增强、目标检测、异常行为识别等关键技术。面对算法优化、实时性和系统集成等挑战,通过数据增强、边缘计算和模块化设计等方法解决。未来,AI技术的进步将进一步提高监控系统的智能化水平和应对复杂安全挑战的能力。
|
23天前
|
人工智能 供应链 搜索推荐
中国CRM市场深度分析:主流供应商排名与特点解析
随着中国企业数字化转型的深入,CRM(客户关系管理)软件市场迅速发展,形成了多个优秀解决方案提供商。销售易、纷享销客、明源云客、金蝶云之家、简道云、红圈营销和爱客CRM等供应商各具特色。销售易在大型企业市场表现突出,提供全链路营销销售一体化及强大的AI能力;纷享销客以易用性和高性价比著称,适合中小企业;明源云客专注房地产行业,提供全流程解决方案;金蝶云之家与ERP系统深度整合,适合传统制造业;简道云是低代码平台,灵活性高;红圈营销专注零售业,支持全渠道营销;爱客CRM则主打智能营销功能。企业在选择CRM时需综合考虑实施难度、价格定位、技术支持等因素,并结合自身需求进行试用和调研,确保选择最适合
|
2月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
3月前
|
测试技术 开发者 Python
使用Python解析和分析源代码
本文介绍了如何使用Python的`ast`模块解析和分析Python源代码,包括安装准备、解析源代码、分析抽象语法树(AST)等步骤,展示了通过自定义`NodeVisitor`类遍历AST并提取信息的方法,为代码质量提升和自动化工具开发提供基础。
138 8
|
2月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
77 4
|
2月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。

推荐镜像

更多