当前位置:操作系统 > 安卓/Android >>

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   
    

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,