Android/CyanogenMod 发烧笔记

来自Jack's Lab
跳转到: 导航, 搜索

Android-hack-header.jpg


目录

1 缘起

手上的三星 Android 机 T959 用了快三年了,一直用原生系统,挺好用,一直没有分析的动力。

最近刷了 MIUI V5,内置了一堆的吸流量、浪费系统资源的应用,开机后,可用内存只有 10% 左右(51MB前后),苦不堪言。内置的百度输入法,一个输入法,居然没事就去访问我的通讯录、通话记录和GPS坐标,要知道其是有网络通讯权限的,也就是说装了百度输入法的用户,他就会偷用户的通讯录、通话记录和当前地理位置(GPS坐标),并记录在其服务器上


另外,Android 系统上,各种安全威胁越来越严重,其很有可能重复当年PC上,流氓软件横扫WINDOWS用户的场景

Android上已有安全威胁,参考: http://cn.trustmobi.com/anquanzhongxin.php?number=1

一个典型的 APK 包分析报告: https://anubis.iseclab.org/?action=result&format=html&task_id=185b2c2d9a1883854919318c92ffb5b4e



2 探索你的手机系统

正常的系统里,您用“文件管理器”是看不到你整天用的手机系统的是个啥样的(类似看不到window 下的 C:\windows 文件夹的内容),也就看看管理管理“我的文档”下面的内容


要想看到、甚至精简你的整个系统,有两种主要方法:


1. ROOT 获取系统管理员权限,然后使用 Root Explorer 这个APP去访问根目录、去 /system/app 下删除出厂系统里删不了流氓APP(通过“设置”-->“系统设置”-->“应用”),比如 “米币”,“系统更新” 等等

2. 使用调试工具 ADB,ADB 是Android官方提供给开发者的一种调试工具,很容易使用,可以随心所欲地控制、修改你的手机系统。Android 的好处就是,人人都能通过简单的学习,自由地修改你的系统。当然,ADB 要发挥真正的威力,也得先 ROOT


2.1 ROOT

ROOT 就是获取手机的管理员权限,拥有控制、修改自己系统的自由

没有ROOT的系统,/system 目录是只读的,没有写权限,也就不能绞杀(删除)厂商预装在 /system/app 目录下的应用(多数为绑架用户的流氓应用)


出厂的手机系统,对 ROOT 权限的封锁,集中在:

  • 默认使用非ROOT权限用户。“adb shell” 进入系统的,实际手机端运行了 /sbin/adbd 这个进程(Note2上对应用户是 shell,uid=2000);APP 运行时,其对应的用户则是 u0_aN(N是个整型值,动态分配),这些用户都没有管理员权限,也就不能修改系统
  • 对关键系统目录(如 "/","/system")挂载为只读文件系统
  • 对必须要进行读写的目录(比如 "/data"),虽将其挂载为可读写的文件系统,但也封杀普通用户的写权限,甚至读权限也不给
  • 系统没有 sudo, su 这些有可能提升权限的应用程序

http://en.wikipedia.org/wiki/Android_rooting



2.1.1 MI2s ROOT

下载 ROOT 包:http://vdisk.weibo.com/s/dn5OZrwllvkJ

运行“系统更新”-》菜单键-》“选择安装包”安装此ROOT包即可



2.2 ADB

ADB 本是Android SDK(APP 开发环境)内置的调试工具,可以通过 USB/WiFi 连接手机,获取ROOT权限,执行 shell 命令,上传下载数据等。ADB 功能强大,是骨灰级发烧友杀人越货之必备良器

Google 有独立的包,1MB 左右,根据你的平台选用相应的包即可。

http://dl.google.com/android/repository/platform-tools_r19-linux.zip
http://dl.google.com/android/repository/platform-tools_r19-windows.zip
http://dl.google.com/android/repository/platform-tools_r19-macosx.zip

比如 WINDOWS 下,解压 zip 包后,把 adb.exe AdbWinApi.dll AdbWinUsbApi.dll 拷贝到 C:\WINDOWS 下 (省得改环境变量)

然后打开“运行”,输入cmd,回车,开启一个命令行窗口,输入 adb devices,如果你安装了手机的 USB 驱动,在手机里 “设置” --> “开发者选项” --> “USB调试模式” 打开的话,你就能看到

adb devices
List of devices attached 
32334071DA1D00EC	device

表明 adb 已经发现手机设备了


运行 adb shell 则会获得一个 shell,你就可以像在 Linux 中一样了

adb shell

root@android:/ # id
uid=0(root) gid=0(root)

root@android:/ # cat /proc/version                                             
Linux version 3.0.52-Semaphore_JB_2.6.1sv (stratosk@semaphore.gr) (gcc version 4.7.3 20121001 (prerelease) 
(crosstool-NG linaro-1.13.1-4.7-2012.10-20121022 - Linaro GCC 2012.10) ) #313 PREEMPT Sun Nov 25 20:47:09 EET 2012

root@android:/ # cat /proc/cpuinfo                                             
Processor	: ARMv7 Processor rev 2 (v7l)
BogoMIPS	: 99.26
Features	: swp half thumb fastmult vfp edsp thumbee neon vfpv3 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x2
CPU part	: 0xc08
CPU revision	: 2

Hardware	: aries
Revision	: 0030
Serial		: 32334071da1d00ec

root@android:/ # free -m                                                       
             total         used         free       shared      buffers
Mem:        401084       395532         5552            0         1648
-/+ buffers:             393884         7200
Swap:            0            0            0

更多信息输出,可参考 MIUI V5 在老机三星 T959 上的第一眼


备份手机的装机应用到 t959-system-app/ 目录下(用户自己装的应用,位于 /data/app 下):

$ adb pull /system/app t959-system-app/
pull: building file list...
pull: /system/app/YellowPage.apk -> t959-system-app/YellowPage.apk
pull: /system/app/WeatherProvider.apk -> t959-system-app/WeatherProvider.apk
pull: /system/app/Weather.apk -> t959-system-app/Weather.apk
......
......

对于系统的装机应用,adb uninstall 是移除不了的,得直接进 shell,手动删除之:

$ adb uninstall /system/app/LiveWallpapers.apk
Failure

$ adb shell
root@android:/ # cd /system/app/                                               
root@android:/system/app # rm LiveWallpapers.apk
root@android:/system/app # ls LiveWallpapers.apk
LiveWallpapers.apk: No such file or directory

还有其他强大的命令:

adb shell am          # 强大的 Activity Manager
adb shell dumpstate 
adb shell dumpsys 
adb shell ime list 

adb reboot recovery   # 进入恢复模式



2.3 fastboot

ADB 的连接需要手机启动进入系统,手机在进入 Android 系统后,启动了一个 adbd 的守护进程,PC端的 adb 就是通过 USB线或者WiFi 与 adbd 之间交互的。因此当手机不能进入Android系统后,比如只停留在bootloader(类似于PC的BIOS)阶段的时候咋办呢?

platform-tools 包里也提供一个非常有用的工具: fastboot,可以在手机进入 bootloader后与手机建立连接

$ adb reboot-bootloader
$ fastboot devices

$ fastboot oem unlock          # 解锁 bootloader
$ fastboot oem get-bootinfo



2.4 清理顽固流氓

ROM 中不能从正常途径卸载的装机应用(如米币,小米商城等),一般都可以ROOT后,用 RootExplorer 直接从 /system/app/ 中删除即可

但有些顽固的流氓应用隐藏很深,比如 MIUI V5 自带的病毒扫描(腾讯提供),你根本找不到他的APK包在哪,运行他实时用 adb shell ps 查看,你会发现:系统并没有新的可疑进程


2.4.1 MIUI V5的病毒扫描去除

连上USB线到PC,手机系统“设置”里打开 “USB调试”, 打开病毒扫描应用,只有在其扫描的过程中,你用 top 才能发现 com.android.settings 这个关键系统应用的CPU占有率太异常了:

$ adb shell top -n 1 -d 1 -m 10 -t

User 27%, System 13%, IOW 0%, IRQ 0%
User 29 + Nice 0 + Sys 14 + Idle 64 + IOW 0 + IRQ 0 + SIRQ 0 = 107

  PID   TID PR CPU% S     VSS     RSS PCY UID      Thread          Proc
 3020  3020  0  21% S 334328K  75816K  fg system   ndroid.settings com.android.settings
 6120  6120  0   7% R   1240K    600K     root     top             top
  185   332  0   3% S  44376K  23560K  fg system   SurfaceFlinger  /system/bin/surfaceflinger
 6109  6109  0   1% S      0K      0K     root     kworker/u:2     
 6114  6114  0   1% S      0K      0K     root     kworker/u:3     
  185   185  0   1% S  44376K  23560K  fg system   surfaceflinger  /system/bin/surfaceflinger
  185   765  0   0% S  44376K  23560K  fg system   Binder_3        /system/bin/surfaceflinger
 4293  4293  0   0% S      0K      0K     root     kworker/0:0     
  185   360  0   0% S  44376K  23560K  fg system   Binder_1        /system/bin/surfaceflinger
  185   358  0   0% S  44376K  23560K  fg system   EventThread     /system/bin/surfaceflinger

在不开病毒扫描时,大部分情形下com.android.settings 的CPU占有为0%

因此,这个病毒扫描应该隐藏在 com.android.settings 这个关键系统应用中:

$ adb shell dumpstate | grep -i virusscan
      Service com.android.settings.VirusScanService:
      Service com.android.settings.VirusScanService:
        4: [2013-12-13 19:26:08.228] executeForLastInsertedRowId took 1ms - succeeded, sql="INSERT INTO applications ('_id', 
       'name', 'description', 'package', 'class', 'icon', 'launch_count', 'last_resume_time') VALUES (?, ?, ?, ?, ?, ?, 
       COALESCE(?, 0), COALESCE(?, 0));", bindArgs=[null, "病毒扫描", "应用", "com.android.settings", 
       "com.android.settings.VirusScanActivity", "android.resource://com.android.settings/drawable/virus_scan_icon", 27,1386933816654]
        41246fb8 com.android.settings/.VirusScanActivity filter 41247298
        41247698 com.android.settings/.VirusScanService filter 41247898
        41247698 com.android.settings/.VirusScanService filter 41247898
      com.android.settings.VirusScanAppActivity
    com.android.settings.VirusScanActivity: 1 starts, 500-750ms=1
    com.android.settings.VirusScanActivity: 22 starts, 500-750ms=10, 750-1000ms=4
    com.android.settings.VirusScanAppActivity: 14 starts, 0-250ms=6, 250-500ms=5, 500-750ms=1, 750-1000ms=1, >=5000ms=1


原来确实丫是隐藏在核心应用 com.android.settings(设置)中的,真TM够毒的!

其是 com.android.settings 的一个 Activity,完整的 INTENT 为: "com.android.settings/.VirusScanAppActivity"


下面来探究探究:

# 启动病毒扫描
$ adb shell am start -n "com.android.settings/.VirusScanAppActivity"
Starting: Intent { cmp=com.android.settings/.VirusScanAppActivity }

# 启动对应的 Service
$ adb shell am startservice -n "com.android.settings/.VirusScanService"
Starting service: Intent { cmp=com.android.settings/.VirusScanService }

$ adb shell am kill-all com.android.settings

# 此两条命令执行后,病毒扫描图标就从桌面消失了
$ adb shell pm disable -n "com.android.settings/.VirusScanActivity"
Component {com.android.settings/com.android.settings.VirusScanActivity} new state: disabled
$ adb shell pm disable -n "com.android.settings/.VirusScanAppActivity"
Component {com.android.settings/com.android.settings.VirusScanAppActivity} new state: disabled

#再想启动的话就会:
$ adb shell am start -n "com.android.settings/.VirusScanAppActivity"
Starting: Intent { cmp=com.android.settings/.VirusScanAppActivity }
Error type 3
Error: Activity class {com.android.settings/com.android.settings.VirusScanAppActivity} does not exist.

#当然,这只是软件关闭,其代码还是在 /system/app/Settings.apk 这个 APK 包中,如要彻底清除,可尝试解开 APK 包,移除 VirusScanApp.java 的代码

更多 adb am 用法参考:http://developer.android.com/tools/help/adb.html#am



2.4.2 MIUI V5文件管理中的快盘

另外一个隐藏较深的是“快盘”,这也是一个怎么也找不到其 APK 文件的主,但点其图标运行后,会进入 “文件管理器“ 的一个界面,也是其 Activity

$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.TaskManagerActivity"
Component {com.android.fileexplorer/cn.kuaipan.android.activity.TaskManagerActivity} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.SettingActivity"
Component {com.android.fileexplorer/cn.kuaipan.android.activity.SettingActivity} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.BindToKuaipanAccountActivity"
Component {com.android.fileexplorer/cn.kuaipan.android.activity.BindToKuaipanAccountActivity} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.TrashBoxActivity"
Component {com.android.fileexplorer/cn.kuaipan.android.activity.TrashBoxActivity} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.SignInSuccessActivity" 
Component {com.android.fileexplorer/cn.kuaipan.android.activity.SignInSuccessActivity} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.common.TaskReceiver"
Component {com.android.fileexplorer/cn.kuaipan.android.common.TaskReceiver} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.common.TaskIntentService"
Component {com.android.fileexplorer/cn.kuaipan.android.common.TaskIntentService} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.service.MediaMountedReceiver"
Component {com.android.fileexplorer/cn.kuaipan.android.service.MediaMountedReceiver} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.service.NetChangeReceiver"
Component {com.android.fileexplorer/cn.kuaipan.android.service.NetChangeReceiver} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.provider.KssProvider"
Component {com.android.fileexplorer/cn.kuaipan.android.provider.KssProvider} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/.push.PushReceiver"
Component {com.android.fileexplorer/com.android.fileexplorer.push.PushReceiver} new state: disabled
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.service.KscService"
Component {com.android.fileexplorer/cn.kuaipan.android.service.KscService} new state: disabled



2.4.3 MIUI V5 for T959 内存优化

先用 procrank 看一下系统内存消耗的标兵:

$ adb shell procrank
  PID      Vss      Rss      Pss      Uss  cmdline
  569   67964K   67640K   42262K   37880K  com.miui.home
  380   51772K   51664K   33407K   30756K  system_server
  466   54340K   54112K   30944K   25204K  com.android.systemui
  609   46116K   46016K   27193K   25420K  android.process.acore
  539   42080K   42000K   23471K   21508K  com.android.phone
 6567   38012K   37948K   17785K   15404K  com.android.settings
 7456   40488K   40400K   16591K   13972K  com.android.deskclock
  184   28088K   25088K   16134K    8316K  /system/bin/surfaceflinger
  526   26720K   26644K   12945K   12036K  com.baidu.input
 9315   32776K   32676K   11651K    9468K  com.google.process.gapps
  617   22164K   22068K    7656K    6668K  com.lbe.security.miui:service
 9635   28288K   28176K    7221K    5132K  com.android.mms
 8928   26444K   26324K    7100K    4324K  com.android.systemui:screenshot
 6469   25136K   25020K    6600K    5080K  android.process.media
 9682   26584K   26464K    5776K    3708K  com.miui.weather2
 9653   25740K   25628K    5580K    3756K  com.miui.voiceassist:remote
  932   17872K   17752K    5126K    4380K  com.miui.providers.weather
 9723   20892K   20776K    4514K    3308K  com.android.thememanager
 9704   24316K   24196K    4352K    2636K  com.miui.providers.datahub
  547   16220K   16100K    3790K    3040K  com.lbe.security.miui
  187    3756K    3756K    2889K    2756K  /system/bin/mediaserver
  185   15468K   15316K    2580K    1716K  zygote
 9750    1464K    1464K    1242K    1228K  procrank
  224    1548K    1548K    1064K    1048K  /system/xbin/shelld
  179    1532K    1532K    1057K    1036K  /system/bin/servicemanager
  193    1516K    1516K    1048K    1032K  /system/bin/tvoutserver
  362    1412K    1412K     966K     944K  /system/bin/rild
  186    1136K    1136K     787K     776K  /system/bin/drmserver
  182    1004K    1004K     732K     712K  /system/bin/netd
  189     712K     712K     390K     364K  /system/bin/installd
  190     652K     624K     388K     376K  /system/bin/keystore
  464     560K     560K     357K     352K  /system/bin/bluetoothd
  180     576K     576K     346K     336K  /system/bin/vold
 9748     428K     424K     214K     200K  /system/bin/sh
  196     212K     212K     192K     192K  /sbin/adbd
  188     368K     364K     177K     172K  /system/bin/dbus-daemon
    1     244K     244K     172K     128K  /init
  147     184K     184K     136K      92K  /sbin/ueventd
  183     308K     304K     124K     120K  /system/bin/debuggerd
  438     296K     296K     116K     112K  /system/bin/brcm_patchram_plus
  192     288K     288K     112K     108K  /system/vendor/bin/geomagneticd
 1224     244K     240K      91K      88K  wdaemon
                          ------   ------  ------
                         305300K  255884K  TOTAL

RAM: 401084K total, 22256K free, 1256K buffers, 77896K cached, 3464K shmem, 12748K slab


主要参数解析如下:

  • Vss = virtual set size
  • Rss = resident set size
  • Pss = proportional set size -----> 此进程与其他进程的共享内存
  • Uss = unique set size -----> 这是进程独占内存,进程终止这个内存会被系统释放


Vss 和 Rss 的实际用途不大


可以将一些不用的进程,直接 kill 掉即可



2.5 构筑防火墙

严防非授权访问网络,上传敏感数据。防火墙这东西属于最后一道防线,不能信任任何APP市场上架的应用。最好自己编译,自己review 代码,防止后门。

主要的技术手段在内核层面,使用 iptables 进行控制

有自由版本的 Android 实现,代码在 github 上:

 $ git clone git://github.com/ukanth/afwall

或者

 $ git clone git://github.com/skullone/android_firewall



3 Android 手机系统结构

Android 手机是:手机硬件 + Linux 内核 + Android扩展库(/system/lib/*.so) + 类Java虚拟机(google自己实现的虚拟机Dalvik)+ Java应用(图形环境,手机桌面,应用程序等等)的混合体


AndroidArch.PNG



手机硬件之上跑的是 Linux 内核(http://www.kernel.org/ ),掌控所有软硬件资源,类似触摸屏、GPS、摄像头、传感器等硬件外设的驱动都实现为 Linux Kernel 的一个模块

上层应用如要访问硬件外设,已不是传统的 GNU/Linux 访问设备方式(比如通过打开 /dev/radio 设备文件,调用 read/write/ioctl 函数与设备交互),Android 把对设备的访问都封装成了一个个的共享库(位于 /system/lib/hw/ 下),比如 camera.aries.so 封装有手机相机的操作,sensors.aries.so 封装有所有传感器访问的操作等,上层应用通过 libhardware.so 这个统一的入口(提供 id 参数,区分具体设备),调用具体设备的封装共享库


Android 是建立在 GNU/Linux 基础上的嵌入式 Linux 系统(裁减不必要的组件),因此其也吸纳了社区的优秀核心C/C++应用库,比如基础的libc(/system/lib/libc.so,使用的是Bionic C库,专用于嵌入式的C库),嵌入式关系数据库sqlite引擎库(/system/lib/libsqlite.so),web浏览器核心库webkit(/system/lib/libwebcore.so) 等。


在往上就是 Dalvik 虚拟机,google实现了这个类Java的虚拟机,为能运行 Java 程序,其也实现了一个Java核心库,提供Java语言API中的大多数功能,这个核心库同时也包含了Android的一些核心API,比如android.os、android.net、android.media 等


上层的 Application Framework 和 Applications (APP) 都运行在 Dalvik 虚拟机环境中

Application Framework 和 Applications 在 GNU/Linux 环境中,都表现为一个独立的进程/线程:

$ ps
......
system    180   1     11240  1448  c0720c44 4014eb94 S /system/bin/servicemanager
radio     536   186   341380 43912 ffffffff 400f8a70 S com.android.phone
system    376   186   411692 52192 ffffffff 400f7b94 S system_server

$ pstree
    `-zygote-+-ceassist:remote-+-{Binder_1}
              |                 |- ......
              |                 |- ......
              |                 |-{SynthThread}
              |                 |-{Thread-2031}
              |                 `-{oPlaybackThrea}
              |
              |-system_server-+-{.ProcessManage}
              |               |-{AccountManager}
              |               |-{ActivityManage}
              |               |-{AlarmManager}
              |               |- ......
              |               |- ......
              |               |-{GpsLocationPro}
              |               |-{LocationManage}
              |               |- ......
              |               |-{PackageManager}
              |               |- ......
              |               |-{UsbDeviceManag}
              |               |- ......
              |               |-{WifiService}
              |               |-{WindowManager}
              |               |-{backup}
              |               |-{gps_s5pc110}
              |               |-{mDnsConnector}
              |               `- ...
              |- ...
              `- ...


http://www.tbray.org/ongoing/When/201x/2010/11/14/What-Android-Is



3.1 GPS interface of Android



4 T959 硬件结构

4.1 主板图

T959-motherboard.png



4.2 主要芯片

AP: SANSUNG Exynos S5PC111 (S5PC110) -- ARM Cortex A8 1GHz + PowerVR SGX540 显示核心 --- Android 的系统实际是跑在这个处理器上

CP: Intel/Infineon 8824 (PMB9801, X-GOLD 616) --- 处理 2G/3G射频前端送来的数字信号,主要是 2G/3G 的通信协议处理 --- 刷机包中的 modem.bin 是个基带固件(一个实时OS + 协议处理进程),其是跑在这个处理器上的,内部一般就是一个 ARM 核心加一个 DSP 核心。X-GOLD616 属于 Intel/Infineon XMM6160 平台。


Intel/Infineon 5703 --- 2G/3G射频前端 + 模拟基带处理 --- 把天线过来的射频信号降频(down-conversion),模拟信号处理,模数转换后,输出数字信号,同时接受基带处理器的数字信号,处理成射频信号后送给天线发射 (RF Chip)。其与基带处理器之间的数字通信协议为 3G DigRF V3.09,详细可参考:基带处理器和射频前端的体系结构http://www.mipi.org/specifications/digrfsm-specifications

Triquint TQM676021 --- Handset Tritium III PAD (power amplifier/duplexer) module for UMTS band I (IMT2100 band) --- 3G 射频功放,2100MHz 频段 (3G PAM)

Triquint TQM666022 --- Handset Tritium III PAD (power amplifier/duplexer) module for UMTS Band II --- 3G 射频功放,1900MHz 频段 (3G PAM)

Triquint TQM656024 --- Handset Tritium III PAD (power amplifier/duplexer) module for UMTS band IV --- 3G 射频功放,1800MHz 频段 (3G PAM)

2.5G 射频功放 (2.5G PAM)

射频频段切换芯片 (RF Switch chip)


Samsung KB100D00WM - KFG8GH6Q4M 8Gb OneNAND , K4X2G323PB, K4X1G323PB and another 1G package

Samsung KLM8G4DEDD - 8G of MoviNAND


Maxim MAX8998 – Power management IC

Broadcom BCM4751 - single-chip GPS Receiver Solution

Broadcom BCM4329 – 802.11n with Bluetooth 2.1 + EDR and FM receiver

NEC MC-10170 – Elpida Memory + Camera processor

Atmel MXT224 - a 224-node highly configurable touchscreen controller which is part of Atmel's maXTouch product platform


Hacking Boot Modes from Exynos 4210: http://www.techinsights.com/teardowns/samsung-galaxy-s-teardown/

Samsung I9000/T959 Teardown: http://forum.xda-developers.com/showthread.php?t=1372365



4.3 系统框图

S5pc110-block-diagram.png




5 Note II 硬件结构

SANSUNG Galaxy Note 2 (GT-N7102) 硬件结构,即国行联通双卡版。

移步: SANSUNG GT-N7102 Hardware Architecture




6 基带

6.1 基带体系结构

话题略大,为控制本页规模,保持良好的阅读体验,恭请移步:基带处理器和射频前端的体系结构



6.2 T959 基带固件

基带固件是刷机包中的 modem.bin 文件,是基带处理器 Intel/Infineon X-GOLD 616 (PMB9801) 所用文件系统的二进制镜像。X-GOLD616 属于 Intel/Infineon XMM6160 平台。

T959 原生系统的基带版本:T959UVKB1

更新到 MIUI V5 (3.9.27) 后,其自基带版本为 I9000XXJVT。我的是移动神州行 2G 卡,电话短信可用,但 GPRS 不能用


T959 有两片 NAND 存储芯片:集成于 AP 中的 4Gb OneNAND (512MB) 和外围 16GB 的 MoviNAND

在 Android 系统中,OneNAND 的设备文件为: /dev/mtdblock0-6,对应 7 个区:

root@android:/ # cat /proc/mtd                                                 
dev:    size   erasesize  name
mtd0: 00780000 00040000 "boot"                   # 7.5MB,bootloader
mtd1: 00780000 00040000 "recovery"               # 7.5MB,刷机工具 recovery 
mtd2: 1a600000 00040000 "datadata"               # 422MB, 挂载在 /datadata,用于存放系统APK的数据、配置等
mtd3: 01180000 00040000 "cache"                  # 17.5MB,挂载在 /cache
mtd4: 00c80000 00040000 "efs"                    # 12.5MB,挂载在 /efs,存在手机无线电相关的核心配置数据,注意备份
mtd5: 01000000 00040000 "radio"                  # 16MB,挂载在 /radio,基带处理器所用文件系统的二进制镜像 modem.bin 就放在这个区 
mtd6: 00b00000 00040000 "reservoir"              # 貌似是保留区


详细参考:

http://wiki.jackslab.org/MIUI_V5_%E5%9C%A8%E8%80%81%E6%9C%BA%E4%B8%89%E6%98%9F_T959_%E4%B8%8A%E7%9A%84%E7%AC%AC%E4%B8%80%E7%9C%BC#Storage


如果需要修改 modem.bin 的话,找到新版本直接替换 /radio/modem.bin,然后重启即可。

T959 比较稳定的基带版本是 T959UVKB5:http://vdisk.weibo.com/s/dn5OZrwhV3k0 解压后直接用 adb push 替换:

 $ adb push modem.bin /radio

重启手机即可

备份基带固件,可用如下命令:

 $ adb pull /radio/modem.bin .



6.3 常用基带芯片

根据 XDA 社区网友搜集的信息,整理了一个页面: 手机基带芯片信息搜集

国内的主流机型我汇总了在这个页面里: 基带处理器和射频前端的体系结构




6.4 Android基带接口

基带部分在 Android 手机上被封装成了一个设备,叫做 modem,早期GSM/GPRS的时候,表现出来就是一个串口设备,只需向串口发送标准的AT命令字符串(形如 AT+CMGW="10086")就能控制 modem 进行发短息打电话等等操作,比如通过如下的AT命令序列就能向 1560_122_3272 发送一条短消息(Linux下可通过minicom直接读写串口,WINDOWS下可通过超级终端读写串口):

AT                                  # 测试串口modem是否连接,正常的话modem会返回 OK
AT+CMGF=1                           # 进入 SMS Text 模式
AT+CMGW="+8615601223272"            # SMS消息体,等号后面是接受方手机号,回车后,在 '>' 写上要发送的消息,Ctrl + z 结束输入
> A simple SMS text messaging.
+CMGW: 1                            # modem 返回短消息的计数,此处为1

AT+CMSS=1                           # SMS发送
+CMSS: 20                           # 成功,modem返回 '+CMSS: 20'


串口一般能用的最高速率也就115.2kbps,3G 时代串口速率远远跟不上数据网络需要的速度,因此如3G上网卡都是采用USB接口的方式在modem和主机之间交换数据。

回到手机上,modem 和 Android 系统间一般通过共享内存的方式交换大量数据。

在 Android 上,modem厂商一般都会把 modem 的访问封装成共享库,方便 Android 的应用使用。库的名字一般以 RIL (Radio Interface Layer) 为后缀,如:

Android 通用层面也实现有自己的 RIL 库:libreference-ril.so 是封装的 AT 命令访问方式。libril.so 实现有 RIL 抽象层。详细可参考这个非常不错的文档:http://www.slideshare.net/ssusere3af56/android-radio-layer-interface

modem厂商的RIL库一般是闭源的,这也激起了社区的极大兴趣,三星的相关探索参考:




6.5 Hack



7 刷机

7.1 概述

Android 手机出厂后都有刷机模式和 Recovery 模式。

官方 Recovery 模式下只能刷入厂家认可的包,社区的包会校验失败,也就是不能刷入。因此要进入 Recovery 模式刷机,得先用三星官方的刷机工具 odin 或者社区的 heidall 直接写手机内部的 flash,用XDA社区开发的 CWM Recovery 替换原厂的、有限制的 Recovery 模式


  • T959 进入 Recovery 模式

关机状态下,长按音量上 + 音量下 + 电源键,看到开机画面后松开电源键并继续长按双音量键,直到成功进入恢复模式

如果不行,就试试:长按音量键下 + 电源键,看到开机第一画面时,松开电源键并继续保持长按音量键下,直到成功进入恢复模式


  • T959 进入 刷机模式(挖煤模式)

先将 USB 线一头连接电脑,关机状态下长按双音量键 + 将USB另一头连接手机,看到黄色机器人在挖煤,即进入挖煤模式

如果不行,可试试:长按音量上 + 电源键,或可进入挖煤模式


  • I9300 进入 Recovery 模式

关机状态下,长按音量上 + HOME 键 + 电源键


  • I9300 进入 刷机模式

关机状态下,长按音量下 + HOME 键 + 电源键,出现提示界面后,按音量上确认


http://wiki.cyanogenmod.org/w/Install_CM_for_vibrantmtd?setlang=zh-cn

https://github.com/search?p=1&q=%40CyanogenMod+++kernel&type=Repositories



7.2 Flash刷写工具

7.2.1 Odin

Odin 是 Samsung 官方提供给维修中心的刷机工具

Importantly, it also has the ability to repartition the device storage based on a .pit file, which can save you from softbricking (when flashing goes wrong and recovery/the bootloader fail). It is not open source and to my knowledge they have not intentionally released it — a few versions have been leaked. For what it's worth, I have used the version posted here without issue.



7.2.2 heimdall

开源的 heimdall: http://glassechidna.com.au/heimdall/

声称较 odin 稳定,跨平台(WINDOWS/LINUX/MAC都可用)

Then turn off your phone, enter Download mode, connect the USB to phone. Next I used command like this to do the flashing itself

 sudo heimdall flash --MDM modem.bin --verbose --no-reboot

Also to you can use to diagnose more with these, in case of issues

heimdall --version
sudo heimdall detect
sudo heimdall download-pit --output I9505.pit --verbose --no-reboot



7.3 XDA基础工具

  • Semaphore CWM Recovery ----- 原厂的 Recovery 工具有校验,无法刷入社区的 ROM 包、更新包等。要刷机得先用 odin/heimdall 刷入 CWM Recovery
  • AROMA Filemanager ----- Recovery 模式下的文件管理工具,方便不少



8 Dalvik虚拟机

Android 上的APP都是 Java 写的,使用 Java 编译器编译为 *.class 后再使用Android SDK提供的工具 DX 将其转化为 Dalvik 虚拟机可以执行的字节码文件 (*.dex)

Dalvik虚拟机是Android中APP的运行基础。其指令集基于寄存器架构,执行其特有的文件格式 ———— DEX字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。

Dalvik VM 与 Java VM 的不同之处在于: Dalvik基于寄存器结构,而JVM基于栈结构;Dalvik执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式

Jvm.and.dalvik.jpg


Dalvik 的优点在于:

  • 在编译时提前优化代码而不是等到运行时,这会大大提升运行效率
  • 虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例
  • 常量池已被修改为只使用32位的索引,以简化解释器


启动一个APP,就会有一个 Dalvik 虚拟机实例,每个APP都运行在自己的 Dalvik 虚拟机中,在系统中看,就是一个Linux进程,比如Android的系统设置:

$ adb shell ps | grep settings
system    1382  185   310728 41252 ffffffff 40064a70 S com.android.settings

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。不同的应用在不同的进程空间里运行,当一个虚拟机关闭或意外中止时不会对其它虚拟机造成影响,可以最大程度的保护应用的安全和独立运行。

守护进程Zygote是Dalvik虚拟机实例的孵化器,其是所有APP的父进程。system_server是其孵化分裂出来的地一个虚拟机实例,他是和硬件沟通的桥梁,当其它APP启动时会向system_server申请服务。

Zygote是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。

其与各APP进程的父子关系参考:http://wiki.jackslab.org/MIUI_V5_%E5%9C%A8%E8%80%81%E6%9C%BA%E4%B8%89%E6%98%9F_T959_%E4%B8%8A%E7%9A%84%E7%AC%AC%E4%B8%80%E7%9C%BC#Processes_Tree


Android 虚拟机启动流程,在启动脚本 /init.rc 里,与 zygote 相关的有:

......
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd
......
service surfaceflinger /system/bin/surfaceflinger
    class main
    user system
    group graphics
    onrestart restart zygote
......
service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical
    onrestart restart zygote
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart drm

其中:

service media /system/bin/mediaserver
    class main
    user media
    group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc
    ioprio rt 4
......
service netd /system/bin/netd
    class main
    socket netd stream 0660 root system
    socket dnsproxyd stream 0660 root inet
    socket mdns stream 0660 root system
......
service drm /system/bin/drmserver
    class main
    user drm
    group drm system inet drmrpc sdcard_r
......


参考: http://carvencao.blog.sohu.com/154325146.html



9 APP

9.1 APP包发烧

即:APP 的解包、修改、重新打包

使用社区工具 android-apktool: http://code.google.com/p/android-apktool/ ,LINUX/WINDOWS/MacOS 用户选择对应的包下载

XDA 社区还提供了一个不错的图形前端面,大大方便的使用:http://forum.xda-developers.com/showthread.php?t=2326604 该工具依赖 Powerpacks,如解压后执行 Android Multitool.exe 出现错误,得先下载安装Powerpacks:http://go.microsoft.com/fwlink/?LinkID=145727&clcid=0x804


为方便使用,把 apktool 的 WINDOWS 和 Linux 包都放微盘上了,WINDOWS: http://vdisk.weibo.com/s/dn5OZrwhNuPk LINUX: http://vdisk.weibo.com/s/dn5OZrwhNuOR


9.1.1 解包

以移除MIUI V5 系统设置(/system/app/Settings.apk) 中的病毒扫描为例,WINDOWS GUI解包示例如下:

先从刷机包/手机文件系统的 /system/app/ 目录下提取 Settings.apk 这个系统设置APP,放在 AndroidMultitool\Files 中

再从刷机包/手机文件系统的 /system/framwork/ 目录下提取 framework-res.apk 和 framework-miui-res.apk 这两个资源文件,放在 AndroidMultitool\Files 中

运行 Android Multitool.exe

Installing Framework 选择 framework-res.apk 之所在,点“Install”;完成后再选择 framework-miui-res.apk 之所在,点“Install”

Decompile 选择 Settings.apk 之所在,点“decompile",顺利的话就会在 Decompiled_apk 目录下出现一个 Settings 的文件夹,
反编译后的 Settings.apk 都在里面


GNU/Linux 下的过程如下:

apt-tool 是 java 写的,因此需要你的系统有 java 运行环境。工具集就是 aapt, apktool(bash脚本,实际使用 apktool.jar), apktool.jar, baksmali.jar, signapk.jar, smali.jar 这几个文件,拷贝到 /usr/local/bin 下即完成安装

$ ls /usr/local/bin/a*
/usr/local/bin/aapt  /usr/local/bin/apktool  /usr/local/bin/apktool.jar
$ ls /usr/local/bin/*.jar
/usr/local/bin/apktool.jar  /usr/local/bin/baksmali.jar  /usr/local/bin/signapk.jar  /usr/local/bin/smali.jar

从刷机包/手机文件系统的 /system/app/ 目录下提取 Settings.apk 这个系统设置APP
再从刷机包/手机文件系统的 /system/framwork/ 目录下提取 framework-res.apk 和 framework-miui-res.apk 这两个资源文件

$ apktool if /path/to/framework-res.apk         # 先安装资源文件
$ apktool if /path/to/framework-miui-res.apk    # 再安装资源文件
$ apktool d /path/to/Settings.apk
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /home/comcat/apktool/framework/1.apk
I: Loaded.
I: Loading resource table from file: /home/comcat/apktool/framework/6.apk
I: Loaded.
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs...

至此当前目录下就会产生一个 Settings 的文件夹,反编译解包后数据都在里面:

$ ls Settings
AndroidManifest.xml  apktool.yml  res  smali


AndroidManifest.xml 为APP主框架文件,res/ 下是一些资源文件(如字符串,PNG图片等),smali/ 下才是主角,里面都是 Dalvik 虚拟机的“汇编语言“文件


当Android启动一个APP时,它必须要知道这个APP有那些组件。所以,所有APP解包后都有一个 AndroidManifest.xml的文件,其中写有这个APP的所有组件,当然还有一些其他信息,比如指明该APP所需要的各种权限(访问通话记录、访问网络...),以及声明该APP所需链接到的库名称



9.1.2 重打包

即把APK解包、修改后,再重新做成 APK 包,安装于系统中

使用 platform_tools 包中的 aapt 工具,aapt 实际是 android SDK 官方带的打包工具,也是自由的,可自由修改

MIUI 为改善APP在各种不同分辨率下的显示效果,都在 res/ 资源目录下加入了 values-largeui/ values-mediumui/ 目录,官方 aapt 处理时会出现错误:

$ apktool b Settings stk.apk
I: Checking whether sources has changed...
I: Smaling...
I: Checking whether resources has changed...
I: Building resources...
invalid resource directory name: /work/android/apktool/miui-v5/Settings/res/values-largeui
invalid resource directory name: /work/android/apktool/miui-v5/Settings/res/values-mediumui
Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec command:
[aapt, p, --min-sdk-version, 16, --target-sdk-version, 16, -F, /tmp/APKTOOL4702058949499100030.tmp, -0, arsc, -I, /home/comcat/apktool/framework/1.apk, 
-I, /home/comcat/apktool/framework/6.apk, -S, /work/android/apktool/miui-v5/Settings/res, -M, /work/android/apktool/miui-v5/Settings/AndroidManifest.xml]
......
......


MIUI 开放了ROM制作的工具,位于:http://github.com/MiCode/patchrom_tools

因此需要使用一个修改后的 aapt 替换原来的:

$ wget http://github.com/MiCode/patchrom_tools/raw/ics/aapt
$ sudo cp aapt /usr/local/bin/

WINDOWS 下取: http://github.com/MiCode/patchrom_tools/raw/ics/aapt.exe 替换原来的即可

再次执行,stk.apk 已经生成了,虽有一些警告,但没关系:

$ apktool b Settings stk.apk
I: Checking whether sources has changed...
I: Checking whether resources has changed...
I: Building resources...
aapt: warning: string 'bluetooth_dun_connection_permission_request' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_CN zh_TW
......
aapt: warning: string 'perm_privacy_app_count_trust_summary' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_TW
aapt: warning: string 'safe_relative' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_TW
aapt: warning: string 'sim_pin_enabled' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_CN zh_TW
I: Building apk file...

$ ls 
Settings  Settings.apk  stk.apk




9.1.3 修改包

需要在 Dalvik 甚至 ARM 指令集的层面上去修改APP的,一般出于以下情形:

  • 优化,移除不需要的组件
  • 反流氓,探寻流氓APP搜集用户隐私数据并上传服务器的代码,取证后移除
  • 反广告,移除广告代码
  • 汉化


先来看看 MIUI V5 下,隐藏在 com.andorid.settings(系统设置)中的查毒模块,是啥样的

先打开上个步骤中解包后目录下的 AndroidManifest.xml 文件,找到:

        <activity android:theme="@miui:style/V5.Theme.Light.NoTitle" android:label="@string/virus_scanner_title" android:icon="@drawable/virus_scan_icon" android:name=".VirusScanActivity"
                  android:taskAffinity="com.android.settings.VirusScanActivity" android:launchMode="singleTop" android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:theme="@miui:style/V5.Theme.Light.NoTitle" android:name=".VirusScanAppActivity" android:taskAffinity="com.android.settings.VirusScanActivity" 
             android:screenOrientation="portrait" />

        <service android:name=".VirusScanService">
            <intent-filter>
                <action android:name="com.android.service.VIRUS_SCAN_SERVICE" />
                <action android:name="miui.intent.action.UPDATE_VIRUS_LIB" />
            </intent-filter>
        </service>

Android 的APP没有统一的函数入口(比如C中的 main() 函数),其是由 Activity, Service 等等这些组件组成,Activity相当与APP的与用户互动的一个功能,Service则是跑在后台的服务,没有图形界面,用户一般看不到

这两个 Activity (VirusScanActivity和VirusScanAppActivity) 和一个 Service (VirusScanService)就是与查毒模块相关的组件定义,其实际代码在:

$ ls smali/com/android/settings/VirusScan*
......
smali/com/android/settings/VirusScanActivity$2.smali                    smali/com/android/settings/VirusScanAppActivity$FinishRiskScan.smali
smali/com/android/settings/VirusScanActivity$3.smali                    smali/com/android/settings/VirusScanAppActivity$NormalScan.smali
smali/com/android/settings/VirusScanAppActivity$7.smali                 smali/com/android/settings/VirusScanService$ScanBinder.smali
smali/com/android/settings/VirusScanAppActivity$FinishNoRiskScan.smali  smali/com/android/settings/VirusScanService$UpdateVirusLibTask.smali
smali/com/android/settings/VirusScanAppActivity$FinishRiskScan$1.smali
......


重度发烧想彻底移除的朋友可以尝试一下。


Dalvik的汇编语言参考:



9.1.4 案例分析

以流氓软件微信电话本为例,iKe 在其blog上给了一个非常好的案例,移步:http://imid.me/blog/2013/08/16/weixin-phonebook-case-study/



9.2 编译

命令行编译,原理与 google glass 相同,参考:http://wiki.jackslab.org/Google_Glass_%E7%AC%94%E8%AE%B0#.E7.BC.96.E8.AF.91.E6.B5.8B.E8.AF.95.E7.8E.AF.E5.A2.83



9.3 安装Google Apps

现在谷歌要求下游使用 Android 系统的厂商,移除 Google 提供的服务框架,这导致谷歌的优质应用(比如 Gmail, GoogleMap, GoogleEarth)没法在这些厂家的系统里使用。

因此要用这些App,得先刷上社区的 CWM recovery,开机进如 Recovery 模式后,刷入 XDA 社区提供的 google apps 包,这个Android系统版本不一样,包内的文件版本也不一样,从这个页面找:

 http://wiki.rootzwiki.com/Google_Apps



10 去除讨厌的微博尾巴

ROOT 系统,打开 /system/build.prop,修改:

ro.product.model=**
ro.product.brand=**
ro.product.manufacturer=**







个人工具
名字空间

变换
操作
导航
工具箱