【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
文章目錄
- 一、分析 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↑rLDR 是偽指令 , 從全局符號中加載數據到 R1 寄存器 ; 然后加上 PC , PC 是當前位置 與 =(__libc_globals - 0x1745E) 地址的偏移量 ;
PC 與 =(__libc_globals - 0x1745E) 地址相加 , 指向的是 malloc 函數真正的地址 ;
LDR R1, =(__libc_globals - 0x1745E) ADD R1, PC ; __libc_globalsCBNZ 是不為 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_mallocje_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 相當復雜 ;
總結
以上是生活随笔為你收集整理的【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】arm 汇编 (
- 下一篇: 【Android 逆向】IDA 工具使用