文章目录
一、分析 malloc 函数的 arm 汇编语言
一、分析 malloc 函数的 arm 汇编语言
在上一篇博客 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 使用 IDA 打开 arm 动态库文件 | 切换 IDA 中汇编代码显示样式 ) 打开并配置了选项 ;
分析 libc.so 的汇编代码的 malloc 方法 ;
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 # ... 省略 ...
je_malloc 相当复杂 ;