日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2025/6/17 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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↑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 相當復雜 ;

總結

以上是生活随笔為你收集整理的【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。