android應用程序fps meter[幀數顯示]的分析 —— 淺談root的風險 (1)

fps meter是常用的檢測幀率的軟件,該軟件需要root權限才能工作,一直比較好奇它一個apk是如何知道系統當前的幀率情況的,就針對此apk分析瞭一下其工作原理。

Apk組成
首先看一下apk的組成,apk文件就是一個壓縮包,可以解壓縮軟件如winrar解壓查看,也可以用[apktools]反編譯apk,以供進一步分析。

 

從運行結果和代碼組織上的推測

java代碼主要負責上層控制和顯示。
bin0和lib0.so是一個真正獲取fps的binary工作進程的代碼
jni層的libnp_read.so,負責和工作進程橋接,通過pipe與工作進程通信,上報分析的數據給java層顯示。
Apk的靜態分析
Apk的包組成結構如上圖。常規的dex/res/lib目錄下的內容外,還要看一下res/raw和assets目錄下是否有東西,這裡通常是藏污納垢的場所。fps meter這個apk中,在res/raw/下有bin0和lib0.so 兩個文件。

使用[dex2jar]反編譯java代碼,查看其中的信息。對於這個apk,可以看到它使用瞭[RootTools]的jar庫,來實現通過su過的shell執行一些命令或binary程序。從dex文件的常量字符中可以看到,這個apk中使用的庫是v2.2版本,該版本的源碼可以在[https://code.google.com/p/roottools/source/checkout]下載到到,svn版本號是208。

Java代碼:
接下來我們可以分析java代碼。java代碼都已經被加擾過瞭,不過如果你有足夠的耐心並足夠仔細,還是能從中讀出很多內容。對java代碼的分析,一般都是從activity/Application或service的onCreate方法入手(對外的接口不可能加擾,這些方法還是存在的),可以對照AndroidManifest.xml找到入口的Activity及Service,再查看相關信息

在FPSMActivity的onCreate中,如下兩句:

[java]
t.a(this, 2131034112, "0", "744"); 
t.a(this, 2131034113, "0.so", "744"); 

t.a(this, 2131034112, "0", "744");
t.a(this, 2131034113, "0.so", "744");這是混淆過的代碼,不過從參數來分析,這是調用RootTools的installBinary()方法,可以直接對照RootTools的源碼來看。這個方法的作用是將apk的res/raw下的bin0和lib0.so分別安裝到/data/data/com.aatt.fpsm/files/下,分別命名為0和0.so。

FPSMService的onStartCommand方法中,可以看到這個機制就是創建一個pipe:/data/data/com.aatt.fpsm/pipe,不停的從這個pipe中讀取數據,顯示在前端創建的的浮動window中。可以在adb shell中,

[plain
busybox dumphex /data/data/com.aatt.fpsm/pipe 

busybox dumphex /data/data/com.aatt.fpsm/pipe
驗證幀率的值,剛好是從這個pipe中讀入的。

其他位置未看到特別有用的信息。

JNI代碼:
Jni庫libnp_reader的分析,主要是一些Java的native方法的實現,並沒有看到特別異常的現象。

[plain]
$ arm-linux-androideabi-readelf -s libnp_read.so   
   
Symbol table '.dynsym' contains 69 entries:   
   Num:    Value  Size Type    Bind   Vis      Ndx Name   
      0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND   
      1: 00000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_finalize   
      2: 00000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit   
      3: 00000ed5    32 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe   
      4: 00000000     0 FUNC    GLOBAL DEFAULT  UND umask   
      5: 00000000     0 FUNC    GLOBAL DEFAULT  UND mknod   
      6: 000017c4     8 FUNC    WEAK   DEFAULT    7 __aeabi_unwind_cpp_pr1   
      7: 00000ef5    16 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe   
      8: 00000000     0 FUNC    GLOBAL DEFAULT  UND remove   
      9: 00000f05    40 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe   
     10: 00000000     0 FUNC    GLOBAL DEFAULT  UND read   
     11: 00004004     4 OBJECT  GLOBAL DEFAULT   16 fd   
     12: 00004008     4 OBJECT  GLOBAL DEFAULT   16 trash   
     13: 000017cc     8 FUNC    GLOBAL DEFAULT    7 __aeabi_unwind_cpp_pr0   
     14: 00000f2d    36 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe   
     15: 00000000     0 FUNC    GLOBAL DEFAULT  UND open   
     16: 00000f51    20 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe   
     17: 00000000     0 FUNC    GLOBAL DEFAULT  UND close   
     18: 00000f65    36 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe   
     19: 0000400c     4 OBJECT  GLOBAL DEFAULT   16 value   
     20: 00004004     0 NOTYPE  GLOBAL DEFAULT  ABS _edata   
     21: 00004004     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start   
     22: 00004010     0 NOTYPE  GLOBAL DEFAULT  ABS _end   
     23: 00000000     0 FUNC    WEAK   DEFAULT  UND __gnu_Unwind_Find_exidx   
     24: 00000000     0 FUNC    GLOBAL DEFAULT  UND abort   
     25: 00000000     0 FUNC    GLOBAL DEFAULT  UND memcpy   
     26: 000017bc     8 FUNC    WEAK   DEFAULT    7 __aeabi_unwind_cpp_pr2   
     27: 00001d88     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP_   
     28: 00001d78     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP   
     29: 00001d98     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP_   
     30: 00001da8     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_WMMX   
     31: 00001e30     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_WMMX   
     32: 00001d64    20 FUNC    GLOBAL DEFAULT    7 restore_core_regs   
     33: 0000134c    68 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Get   
     34: 000013b8    68 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Set   
     35: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_begin_cleanup   
     36: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_type_match   
     37: 00001f64   916 FUNC    GLOBAL DEFAULT    7 __gnu_unwind_execute   
     38: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_call_unexpected   
     39: 000017d4   856 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Pop   
     40: 00001d90     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP_D   
     41: 00001d80     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP   
     42: 00001da0     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP_D_1   
     43: 00001dec     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_WMMXD   
     44: 00001e44     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_WMMXC   
     45: 00001b2c     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetCFA   
     46: 00001b34   164 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_RaiseExcepti   
     47: 00001bd8    28 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_ForcedUnwind   
     48: 00001bf4   108 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Resume   
     49: 00001c60    32 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Resume_or_Re   
     50: 00001c80     4 FUNC    GLOBAL DEFAULT    7 _Unwind_Complete   
     51: 00001c84    32 FUNC    GLOBAL DEFAULT    7 _Unwind_DeleteException   
     52: 00001ca4   192 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Backtrace   
     53: 00001d64    20 FUNC    GLOBAL DEFAULT    7 __restore_core_regs   
     54: 00001e58    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_RaiseException   
     55: 00001e58    36 FUNC    GLOBAL DEFAULT    7 _Unwind_RaiseException   
     56: 00001e7c    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Resume   
     57: 00001e7c    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Resume   
     58: 00001ea0    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Resume_or_Rethr   
     59: 00001ea0    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Resume_or_Rethrow   
     60: 00001ec4    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_ForcedUnwind   
     61: 00001ec4    36 FUNC    GLOBAL DEFAULT    7 _Unwind_ForcedUnwind   
     62: 00001ee8    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Backtrace   
     63: 00001ee8    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Backtrace   
     64: 000022f8    64 FUNC    GLOBAL DEFAULT    7 __gnu_unwind_frame   
     65: 00002338    44 FUNC    GLOBAL DEFAULT    7 _Unwind_GetRegionStart   
     66: 00002364    56 FUNC    GLOBAL DEFAULT    7 _Unwind_GetLanguageSpecif   
     67: 0000239c     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetDataRelBase   
     68: 000023a4     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetTextRelBase  

$ arm-linux-androideabi-readelf -s libnp_read.so 
 
Symbol table '.dynsym' contains 69 entries: 
   Num:    Value  Size Type    Bind   Vis      Ndx Name 
      0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
      1: 00000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_finalize 
      2: 00000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit 
      3: 00000ed5    32 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe 
      4: 00000000     0 FUNC    GLOBAL DEFAULT  UND umask 
      5: 00000000     0 FUNC    GLOBAL DEFAULT  UND mknod 
      6: 000017c4     8 FUNC    WEAK   DEFAULT    7 __aeabi_unwind_cpp_pr1 
      7: 00000ef5    16 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe 
      8: 00000000     0 FUNC    GLOBAL DEFAULT  UND remove 
      9: 00000f05    40 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe 
     10: 00000000     0 FUNC    GLOBAL DEFAULT  UND read 
     11: 00004004     4 OBJECT  GLOBAL DEFAULT   16 fd 
     12: 00004008     4 OBJECT  GLOBAL DEFAULT   16 trash 
     13: 000017cc     8 FUNC    GLOBAL DEFAULT    7 __aeabi_unwind_cpp_pr0 
     14: 00000f2d    36 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe 
     15: 00000000     0 FUNC    GLOBAL DEFAULT  UND open 
     16: 00000f51    20 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe 
     17: 00000000     0 FUNC    GLOBAL DEFAULT  UND close 
     18: 00000f65    36 FUNC    GLOBAL DEFAULT    7 Java_com_aatt_fpsm_FPSMSe 
     19: 0000400c     4 OBJECT  GLOBAL DEFAULT   16 value 
     20: 00004004     0 NOTYPE  GLOBAL DEFAULT  ABS _edata 
     21: 00004004     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start 
     22: 00004010     0 NOTYPE  GLOBAL DEFAULT  ABS _end 
     23: 00000000     0 FUNC    WEAK   DEFAULT  UND __gnu_Unwind_Find_exidx 
     24: 00000000     0 FUNC    GLOBAL DEFAULT  UND abort 
     25: 00000000     0 FUNC    GLOBAL DEFAULT  UND memcpy 
     26: 000017bc     8 FUNC    WEAK   DEFAULT    7 __aeabi_unwind_cpp_pr2 
     27: 00001d88     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP_ 
     28: 00001d78     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP 
     29: 00001d98     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP_ 
     30: 00001da8     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_WMMX 
     31: 00001e30     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_WMMX 
     32: 00001d64    20 FUNC    GLOBAL DEFAULT    7 restore_core_regs 
     33: 0000134c    68 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Get 
     34: 000013b8    68 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Set 
     35: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_begin_cleanup 
     36: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_type_match 
     37: 00001f64   916 FUNC    GLOBAL DEFAULT    7 __gnu_unwind_execute 
     38: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_call_unexpected 
     39: 000017d4   856 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Pop 
     40: 00001d90     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP_D 
     41: 00001d80     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP 
     42: 00001da0     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP_D_1 
     43: 00001dec     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_WMMXD 
     44: 00001e44     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_WMMXC 
     45: 00001b2c     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetCFA 
     46: 00001b34   164 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_RaiseExcepti 
     47: 00001bd8    28 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_ForcedUnwind 
     48: 00001bf4   108 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Resume 
     49: 00001c60    32 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Resume_or_Re 
     50: 00001c80     4 FUNC    GLOBAL DEFAULT    7 _Unwind_Complete 
     51: 00001c84    32 FUNC    GLOBAL DEFAULT    7 _Unwind_DeleteException 
     52: 00001ca4   192 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Backtrace 
     53: 00001d64    20 FUNC    GLOBAL DEFAULT    7 __restore_core_regs 
     54: 00001e58    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_RaiseException 
     55: 00001e58    36 FUNC    GLOBAL DEFAULT    7 _Unwind_RaiseException 
     56: 00001e7c    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Resume 
     57: 00001e7c    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Resume 
     58: 00001ea0    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Resume_or_Rethr 
     59: 00001ea0    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Resume_or_Rethrow 
     60: 00001ec4    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_ForcedUnwind 
     61: 00001ec4    36 FUNC    GLOBAL DEFAULT    7 _Unwind_ForcedUnwind 
     62: 00001ee8    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Backtrace 
     63: 00001ee8    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Backtrace 
     64: 000022f8    64 FUNC    GLOBAL DEFAULT    7 __gnu_unwind_frame 
     65: 00002338    44 FUNC    GLOBAL DEFAULT    7 _Unwind_GetRegionStart 
     66: 00002364    56 FUNC    GLOBAL DEFAULT    7 _Unwind_GetLanguageSpecif 
     67: 0000239c     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetDataRelBase 
     68: 000023a4     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetTextRelBase 從elf信息可以見到,這個庫主要是JNI的實現及將unwind實現包含在庫中,unwind庫一般是用作異常處理的,用它可以獲取函數的調用棧信息。

這裡由於使用pipe,則懷疑這裡需要跨進程通信;而此pipe的通信使用是apk私有的pipe,則推論此apk通過rootTool中提供的Shell類來運行su後的shell,su的作用是通過linux開的後門,允許用戶程序通過setuid系統調用,更改用戶id,達到root效果。su root後,執行一個native程序,native程序應該就是res/raw/下的bin0。初步懷疑pipe的寫端是這個bin0,bin0的symbol信息:
 

[plain]
$ readelf.exe -s bin0 
 
Symbol table '.dynsym' contains 32 entries: 
   Num:    Value  Size Type    Bind   Vis      Ndx Name 
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_init 
     2: 00000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit 
     3: 00000000     0 FUNC    GLOBAL DEFAULT  UND snprintf 
     4: 00000000     0 FUNC    GLOBAL DEFAULT  UND fopen 
     5: 00000000     0 FUNC    GLOBAL DEFAULT  UND fgets 
     6: 00000000     0 FUNC    GLOBAL DEFAULT  UND strstr 
     7: 00000000     0 FUNC    GLOBAL DEFAULT  UND strtok 
     8: 00000000     0 FUNC    GLOBAL DEFAULT  UND strtoul 
     9: 00000000     0 FUNC    GLOBAL DEFAULT  UND fclose 
    10: 00000000     0 FUNC    GLOBAL DEFAULT  UND __stack_chk_fail 
    11: 00000000     0 OBJECT  GLOBAL DEFAULT  UND __stack_chk_guard 
    12: 00000000     0 FUNC    GLOBAL DEFAULT  UND memcpy 
    13: 00000000     0 FUNC    GLOBAL DEFAULT  UND ptrace 
    14: 00000000     0 FUNC    GLOBAL DEFAULT  UND waitpid 
    15: 00000000     0 FUNC    GLOBAL DEFAULT  UND opendir 
    16: 00000000     0 FUNC    GLOBAL DEFAULT  UND readdir 
    17: 00000000     0 FUNC    GLOBAL DEFAULT  UND atoi 
    18: 00000000     0 FUNC    GLOBAL DEFAULT  UND sprintf 
    19: 00000000     0 FUNC    GLOBAL DEFAULT  UND strcmp 
    20: 00000000     0 FUNC    GLOBAL DEFAULT  UND closedir 
    21: 00000000     0 FUNC    GLOBAL DEFAULT  UND dlsym 
    22: 00000000     0 FUNC    GLOBAL DEFAULT  UND strlen 
    23: 0000c000     0 NOTYPE  GLOBAL DEFAULT  ABS _edata 
    24: 0000c000     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start 
    25: 0000c004     0 NOTYPE  GLOBAL DEFAULT  ABS _end 
    26: 00000000     0 FUNC    WEAK   DEFAULT  UND __gnu_Unwind_Find_exidx 
    27: 00000000     0 FUNC    GLOBAL DEFAULT  UND abort 
    28: 00000000     0 FUNC    GLOBAL DEFAULT  UND raise 
    29: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_begin_cleanup 
    30: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_type_match 
    31: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_call_unexpected 

$ readelf.exe -s bin0

Symbol table '.dynsym' contains 32 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_init
     2: 00000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit
     3: 00000000     0 FUNC    GLOBAL DEFAULT  UND snprintf
     4: 00000000     0 FUNC    GLOBAL DEFAULT  UND fopen
     5: 00000000     0 FUNC    GLOBAL DEFAULT  UND fgets
     6: 00000000     0 FUNC    GLOBAL DEFAULT  UND strstr
     7: 00000000     0 FUNC    GLOBAL DEFAULT  UND strtok
     8: 00000000     0 FUNC    GLOBAL DEFAULT  UND strtoul
     9: 00000000     0 FUNC    GLOBAL DEFAULT  UND fclose
    10: 00000000     0 FUNC    GLOBAL DEFAULT  UND __stack_chk_fail
    11: 00000000     0 OBJECT  GLOBAL DEFAULT  UND __stack_chk_guard
    12: 00000000     0 FUNC    GLOBAL DEFAULT  UND memcpy
    13: 00000000     0 FUNC    GLOBAL DEFAULT  UND ptrace
    14: 00000000     0 FUNC    GLOBAL DEFAULT  UND waitpid
    15: 00000000     0 FUNC    GLOBAL DEFAULT  UND opendir
    16: 00000000     0 FUNC    GLOBAL DEFAULT  UND readdir
    17: 00000000     0 FUNC    GLOBAL DEFAULT  UND atoi
    18: 00000000     0 FUNC    GLOBAL DEFAULT  UND sprintf
    19: 00000000     0 FUNC    GLOBAL DEFAULT  UND strcmp
    20: 00000000     0 FUNC    GLOBAL DEFAULT  UND closedir
    21: 00000000     0 FUNC    GLOBAL DEFAULT  UND dlsym
    22: 00000000     0 FUNC    GLOBAL DEFAULT  UND strlen
    23: 0000c000     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    24: 0000c000     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    25: 0000c004     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    26: 00000000     0 FUNC    WEAK   DEFAULT  UND __gnu_Unwind_Find_exidx
    27: 00000000     0 FUNC    GLOBAL DEFAULT  UND abort
    28: 00000000     0 FUNC    GLOBAL DEFAULT  UND raise
    29: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_begin_cleanup
    30: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_type_match
    31: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_call_unexpected
我們通過ps來看一下運行時的進程情況,並沒有看到此bin0進程,看樣子不像是常駐內存的,那麼它太不可能是pipe的write端。

從elf的symbol來看,此bin文件應該會使用dlsym和ptrace。使用ptrace的話,基本可以確定,這個bin文件會通過PTRACE_ATTACH到別的進程中,然後修改別的進程數據或代碼,以達到自己的目的。ptrace的執行過程應該就是分析的關鍵,接下來需要從ptrace入手。

小結
這個fps meter沒有按照android應用程序的開發規范,通過使用SDK和NDK開發java和jni代碼實現,而是使用第三方庫,通過su獲取root權限,執行自己的可執行binary程序,apk自己實現的庫或binary程序,以android資源的形式打包在apk中。這種運行方式,對用戶安全及系統穩定來說,是一個危險的動作。

本小結簡單瞭解瞭此apk的內容,下節將詳細介紹下apk資源包中bin文件通過ptrace感染android系統進程的過程。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *