Android源码定制(5)——root指纹定制与抹除

语言: CN / TW / HK

1.前言

本文为源码定制学习的root指纹抹除篇,通过本文的学习,读者可以掌握Android指纹的基本定制能力和root定制能力,本文参考了看雪大佬应用root检测通杀篇,为实验记录笔记。有问题,可以一一指出:

本文第二节主要讲述基本原理

本文第三节主要讲述实验

本文第四节主要为总结

2.基础知识

2.1 指纹解析

需要对Android指纹进行修改,最重要是明白build.prop的参数含义,这里截取网上文章中的一部分,方便大家理解:

```java

begin build properties (开始设置系统性能)

autogenerated (通过设置形成系统信息)

ro.=GRI40 (版本ID) ro.build.=GRJ22 (版本号) ro.build.version.incremental=eng.buildbot.20110619.060228 (版本增量) ro.build.version.sdk=10 (sdk版本) ro.build.version.codename=REL (版本代号) ro.build.version.release=2.3.4 (Android 2.3.4系统) ro.build.date=Sun Jun 19 06:02:58 UTC 2011 (制作者及制作时间) ro.build.date.utc=0 ro.build.type=user (编译模式,如user,userdebug,eng,test模式) ro.build.user=buildbot (编译账户) ro.build.host=bb1 (编译主机系统) ro.build.tags=test-keys (编译标签) ro.product.model=HTC Wildfire (HTC内部手机代号) ro.product.brand=htc_wwe (手机品牌) ro.product.name=htc_buzz (手机正式名称) ro.product.device=buzz (采用的设备) ro.product.board=buzz (采用的处理器) ro.product.cpu.abi=armeabi-v6j (cpu的版本) ro.product.cpu.abi2=armeabi (cpu的品牌) ro.product.manufacturer=HTC (手机制造商) ro.product.locale.language=zh (手机默认语言) ro.product.locale.region=CN (地区语言) ro.wifi.channels= (WIFI连接的渠道) ro.board.platform=msm7k (主板平台)

ro.build.product is obsolete; use ro.product.device (旧代码ro.build.product,使用代码ro.product.device)

ro.build.product=buzz (建立产品)

Do not try to parse ro.build.description or .fingerprint (不要试图修改description和fingerprint)

ro.build.description=passion-user 2.3.3 GRI40 102588 release-keys (用户的KEY) ro.build.fingerprint=google/passion/passion:2.3.3/GRI40/102588:user/release-keys (系统指纹)

end build properties (性能代码完毕)

system.prop for buzz (系统技术支持由BUZZ提供)

Density in DPI of the LCD of this board. This is used to scale the UI (高密度的液晶的DPI板。这是用来大规模UI的)

appropriately. If this property is not defined, the default value is 160 dpi. (appropriately.如果这个属性没有定义,缺省值是160 dpi的分辨率)

ro.sf.lcd_density=240 (显示屏分辨率,数值越大分辨率越底,240就是800*480的)

View configuration for QVGA. (屏幕的设置)

view.fading_edge_length=8 view.touch_slop=15 (触摸屏灵敏度,数值越大越灵敏) view.minimum_fling_velocity=25 (滑动速度) view.scroll_friction=0.008 (滑动误差)

RIL specific configuration. (特定设置)

rild.libpath=/system/lib/libhtc_ ro.ril.ecc.HTC-WWE=999 ro.ril.ecc.HTC-ELL=92,93,94 ro.ril.enable.a52.HTC-ITA=1 ro.ril.enable.a53.HTC-ITA=1 ro.ril.enable.a52=0 ro.ril.enable.a53=1 ro.ril.vmail.23415=1571,BT ro.ril.hsdpa.category=8 (hsdpa全称High Speed Downlink Packet Access中文意思:高速下行分组接入,设置的数越大传输越快) ro.ril.htcmaskw1.bitmask=429496 ro.ril.htcmaskw1=14449 ro.ril.def.agps.mode=2 (打开AGPS服务支持,可改为ro.ril.def.agps.mode=0 改后能省电但GPS定位速度会变慢) ro.ril.gprsclass=12 (GPRS设置)

For HSDPA low throughput (HSDPA低输量)

ro.ril.disable.power.collapse=1 (关闭电源)

Modify MMS APN retry timer from 5s to 2s. (修改短信的APN设置5秒为2秒)

ro.gsm.2nd_data_retry_config=max_retries=3, 2000, 2000, 2000

Time between scans in seconds. Keep it high to minimize battery drain.(扫描在几秒之内,可降低用电量)

This only affects the case in which there are remembered access points, (这个修改仅能影响此文件)

but none are in range.(但是没有一项是在范围内的)

wifi.interface=eth0 (WIFI界面) wifi.supplicant_scan_interval=45 (WIFI扫描间隔时间,这里设置是45秒。把这个时间设置长点能省电)

Mobile data interfaces (移动数据的接口)

mobiledata.interfaces=rmnet0,rmnet1,rmnet2

Allow or deny tethering. (允许和拒绝绑定)

ro.tether.denied=false

Default network type. (默认的网络类型)

0 => WCDMA Preferred. (0=WCDMA优先)

ro.telephony.default_network=0

Enable Google-specific location features, (谷歌特定地点的设置)

like NetworkLocationProvider and LocationCollector.(如网络服务器提供商和服务器位置)

ro.c o m.google.locationfeatures=1

The OpenGL ES API level that is natively supported by this device. (开放式绘图介面)

This is a 16.16 fixed point number. (界面有16个点,16个不动点数量)

ro.opengles.version=65536 (开放式绘图介面参数)

Disable fs check on boot by default. (开机时默认禁用FS检查)

sys.checkfs.fat=false

Performance settings. (性能设置)

dalvik.vm.execution-mode=int:jit dalvik.vm.heapsize=24m (虚拟内存大小,可设置为16m或24m或32m或48m) persist.sys.use_dithering=1 persist.sys.purgeable_assets=1

Increase SKIA decode memory capability for progressive jpg file.

ro.media.dec.jpeg.memcap=20000000

ADDITIONAL_BUILD_PROPERTIES (其他性能设置)

no_require_sim=true (手机卡保护设置) ro.rommanager.developerid=cyanogenmodnightly (固件管理器开发者是CM大神) ro.url.legal=http://www./intl/%s/mobile/android/basic/phone-legal.html ro.url.legal.android_privacy=http://www]/intl/%s/mobile/android/basic/privacy.html ro. com.google.clientidbase=android-google (谷歌客户身份) ro. com.android.wifi-watchlist=GoogleGuest (WIFI用户名单) ro.setupwizard.enterprise_mode=1 (默认情景模式) ro. com.android.dateformat=MM-dd-yyyy (默认时间格式,改为yyyy-MM-dd,显示效果就是XXXX年XX月XX日) ro. com.android.dataroaming=false (漫游设置) ro.config.ringtone=Playa.ogg (默认铃声设置,文件在/system/media/audio/ringtones 把喜欢的铃声放这里,比如123. MP3放入ringtones文件夹中,这里代码改为ro.config.ringtone=123. mp3) ro.config.notification_sound=regulus.ogg (默认提示音,文件在/system/media/audio/notifications 修改方法同上) ro.config.alarm_alert=Alarm_Beep_03.ogg (默认闹铃,文件在/system/media/audio/alarms 修改方法同上) ro.modversion=CyanogenMod-7-06192011-NIGHTLY-buzz (版本信息,改这个能让你大名出现系统关于中,改为ro.modversion=xxxxx) ro.setupwizard.mode=OPTIONAL (安装向导模式) net. bt. name=Android (系统名称) dalvik.vm.stack-trace-file=/data/anr/traces.txt ```

参考文章:Android系统build.prop文件生成过程

后面我们要修改设备的指纹,主要关注两个文件:buildinfo.shMakefile

2.2 root检测方式

一般Android 上root检测的基本方式包含:

(1)检查su命令是否存在 (2)检查常用目录是否存在su(或检测是否存在s权限的文件) (3)使用which命令查看是否存在su (4)主动申请root权限 (5)执行busybox (6)检查Android属性(读取build.prop中关键属性,如ro.build.tags和ro.build.type) (7)检查特定路径是否有写权限(在Android系统中,有些目录是普通用户不能访问的,例如/data、/system、/etc等) (8)检查市面主流的模拟器 (9)检测frida、xposed等Hook框架的特征

具体可以分为:Android root的系统指纹、root的路径指纹、root的执行操作、第三方工具等

参考文章:修改ROM实现自定义su命令-root检测通杀,这里给出了一些基本的root检测指纹:

``` 1.detectRootManagementApps—检测常见su包名,如{“com.noshufou.android.su”, “com.noshufou.android.su.elite”, “eu.chainfire.supersu”, “com.koushikdutta.superuser”, “com.thirdparty.superuser”, “com.yellowes.su”, “com.topjohnwu.magisk”, “com.kingroot.kinguser”, “com.kingo.root”, “com.smedialink.oneclickroot”, “com.zhiqupk.root.global”, “com.alephzain.framaroot”}

2.detectPotentiallyDangerousApps—{“com.koushikdutta.rommanager”, “com.koushikdutta.rommanager.license”, “com.dimonvideo.luckypatcher”, “com.chelpus.lackypatch”, “com.ramdroid.appquarantine”, “com.ramdroid.appquarantinepro”, “com.android.vending.billing.InAppBillingService.COIN”, “com.android.vending.billing.InAppBillingService.LUCK”, “com.chelpus.luckypatcher”, “com.blackmartalpha”, “org.blackmart.market”, “com.allinone.free”, “com.repodroid.app”, “org.creeplays.hack”, “com.baseappfull.fwd”, “com.zmapp”, “com.dv.marketmod.installer”, “org.mobilism.android”, “com.android.wp.net.log”, “com.android.camera.update”, “cc.madkite.freedom”, “com.solohsu.android.edxp.manager”, “org.meowcat.edxposed.manager”, “com.xmodgame”, “com.cih.game_cih”, “com.charles.lpoqasert”, “catch_.me_.if_.you_.can_”}

3.detectRootCloakingApps—{“com.devadvance.rootcloak”, “com.devadvance.rootcloakplus”, “de.robv.android.xposed.installer”, “com.saurik.substrate”, “com.zachspong.temprootremovejb”, “com.amphoras.hidemyroot”, “com.amphoras.hidemyrootadfree”, “com.formyhm.hiderootPremium”, “com.formyhm.hideroot”}

4.suPath—遍历执行可能存在的su文件夹,如{“/data/local/”, “/data/local/bin/”, “/data/local/xbin/”, “/sbin/”, “/su/bin/”, “/system/bin/”, “/system/bin/.ext/”, “/system/bin/failsafe/”, “/system/sd/xbin/”, “/system/usr/we-need-root/”, “/system/xbin/”, “/cache/”, “/data/”, “/dev/”}

5.checkForDangerousProps—检查一些属性的值.{ro.debuggable”, “1”},{“ro.secure”, “0”}

6.checkForRWPaths—先执行(需要root)mount如果返回true然后再查看是否有读写权限{“/system”, “/system/bin”, “/system/sbin”, “/system/xbin”, “/vendor/bin”, “/sbin”, “/etc”}

7.detectTestKeys—查看编译类型是否为 {“test-keys”}

8.checkBuildProp—检查Buildprop的值,{“ro.build.display.id”,”ro.build.version.incremental”,”ro.build.date”,”ro.build.date.utc”,”ro.build.type”,”ro.build.user”,”ro.build.flavor”,”ro.build.tags”,”ro.build.description”,”ro.build.fingerprint”,”ro.product.model”,”ro.product.brand”,”ro.product.name”}

9.checkSuExists—执行su,看看能否执行成功

10.checkForRootNative—Native层root检查

11.checkForMagiskBinary—检测是否存在Magisk-{“/data/local/”, “/data/local/bin/”, “/data/local/xbin/”, “/sbin/”, “/su/bin/”, “/system/bin/”, “/system/bin/.ext/”, “/system/bin/failsafe/”, “/system/sd/xbin/”, “/system/usr/we-need-root/”, “/system/xbin/”, “/cache/”, “/data/”, “/dev/”} ```

具体的大家可以参考原文

我在前面的文章:Android漏洞之战调试与反调试也用真实的代码进行了展演示,这里大家可以进行参考

3.实验

实验环境:

pixel Android8.0.1 Ubuntu 18

3.1 user版本的编译

首先,我们编译user版本的镜像,里我需要编译的目标版本是aosp_sailfish-user,那么在编译的选项中是没有这一项的,根据lunch命令列出的文件,随意找一个文件进行修改,我们以device/google/marlin/vendorsetup.sh文件为例,进行修改

source build/envsetup.sh

image-20221109204852615

我们随便打开一个配置文件进行添加,例如这里我们打开配置文件device/google/marlin/vendorsetup.sh

vim device/google/marlin/vendorsetup.sh

image-20221109205524780

我们也可以发现之前的userdebug版本声明也在这里面

然后我们再次初始化并选择设备:

source build/envsetup.sh lunch

image-20221109205802480

可以发现此时我们就多了user版本,然后我们选择该版本

编译:make -j4

image-20221109214415835

编译完成

image-20221109214957961

我们可以发现现在就是user的版本,也没有root权限,和我们平时使用的手机一样

image-20221110152811681

这里我们在网上找一个root检测工具,我们可以发现此时的手机是未经过root的

image-20221110152717522

尽管我们现在编译的是user版本,但是我们试验了一些测试的APP,发现其中有一些APP还是检测系统含有root,经过分析我们发现,无论是user编译还是user-debug编译,我们的系统签名都使用的是test-key,而我们真正的手机一般是release-key签名后发布的,所以很多APP将这里作为检测点

这里有两种方案:

(1)编译release-key版本的系统

由于后面我们还要开展指纹抹除实验,所以这里给大家推荐一个文章,想要实现可以去试下:Android——编译release版签名系统

(2)修改指纹

我们这里为了简单的实验,后面在实验中将这里的进行抹除

test-keys--->release-keys

然后为了开展后面的实现,我们尝试拿到user版本的指纹,由于此时无法root,所以无法查看 /system/build.prop的信息,所以我们直接对设备进行root

8.0刷入root步骤: (1)刷入twrp (2)使用twrp刷入Magisk 既可以获得root

针对Android8.0的设备获得root,最方便的便是刷入Magisk

image-20221110154909267

此时我们再次查看设备的指纹:

image-20221110155025196

可以发现此时我们可以找到指纹,这里我们保存该指纹信息

3.2 userdebug版本编译

我们按上面的编译步骤选择userdebug版本

image-20221110160816195

我们可以发现userdebug的指纹明显不一样,此时我们再查看一下

image-20221110161516506

3.3 root指纹抹除

前面我们分别对user版和debug版的系统进行了分析,相应不少朋友应对一些常见的root检测的应用进行处理,那能不能即获得root的操作,又拥有user一样的镜像呢,这里我们就需要对root进行定制和指纹抹除

首先我们用文件对比工具来进行比较:

image-20221110162806579

我们只需要将这些差异的地方一一进行修改即可

(1)test-keys

前面我们提到了这个问题,所以这里我们需要将其进行修改,这里直接将test-keys修改为release-keys

我们先查找一下位置:

image-20221110170717829

然后我们搜索ro.build.tags,可以在buildinfo.sh中找到

image-20221110170923762

然后我们继续定位后面的值,在build/make/core/Makefile

image-20221110171154404

这里我们直接修改为release-keys

image-20221110171500893

(2)ro.build.display.id

image-20221110171620174

按照前面的思路进行定位:

image-20221110171748450

build/make/core/Makefile

image-20221110173324063

这里我们将其值修改为和user保持一致

image-20221110173507737

注意这里我们使用release-key

(3)ro.build.version.incremental

这里我们可以将buildinfo.shMakefile文件都修改

image-20221110183726699

image-20221110183907866

image-20221110183949373

image-20221110184826773

即我们修改BF_BUILD_BUMBER的值就可以了

image-20221110185028392

(4)ro.build.date和ro.build.date.utc

这两个是编译是时间,为了与后面保持一致,我们还是进行修改

image-20221110192341103

image-20221110192320386

然后我们进行修改:

image-20221110192458248

(5)ro.build.type

image-20221110185453548

buildinfo.sh

image-20221110185619811

Makefile

image-20221110185703907

直接在此处修改即可

image-20221110185821794

(6)ro.build.user和ro.build.host

image-20221110190003376

buildinfo.sh

image-20221110190030377

这里我们直接修改为用户名和主机

image-20221110190336611

(6)ro.build.flavor

image-20221110190538846

image-20221110190502332

image-20221110190643010

然后我们直接进行修改

image-20221110190749792

(7)ro.build.description

image-20221110191315720

image-20221110191035722

image-20221110191132102

image-20221110191528854

应修改为:

aosp_sailfish-user 8.1.0 OPM1.171019.011 eng.Windaa.20221109.050000 release-keys

image-20221110191702936image-20221110191739877

(8)ro.build.fingerprint

image-20221110191832725

一样,我们进行定位

image-20221110191909861

image-20221110213839174

然后我们进行修改

Android/aosp_sailfish/sailfish:8.1.0/OPM1.171019.011/Windaa11090500:user/release-keys

image-20221110213959934

(9)ro.product.model、ro.product.brand、ro.product.name

一些朋友想要设备向google的原设备一样,可以修改手机的代号和产品名称,这里就不修改了,感兴趣朋友可以修改

3.4 root定制

root定制这里参考通用的方法:xu为自定义的名称

AOSP/system/extras/su下修改Android.mk中su修改为xu AOSP/system/core/libcutils/fs_config.cpp中/system/xbin/su修改为/system/xbin/xu AOSP/system/sepolicy/private/file_contexts中/system/xbin/su修改为/system/xbin/xu

第一处

image-20221110193527770

第二处

第三处

image-20221110193712743

3.5编译

然后再次编译,选择user-debug版

lunch:24 make -j4

image-20221109214415835

3.6效果演示

我们重新刷机,刷机完成后,就可以发现定制的镜像和原理看起来一致

定制后:

image-20221115142107682

定制前(user版):

image-20221110152811681

我们可以试下,看能不能正常root

image-20221115142222210

可以发现是没有问题的

4.总结

本文编译了user版和user-debug版,并通过指纹定制将user-debug魔改为user版,为后续试验提供了更多的方便,相关文件后续上传github

5.参考文献

http://bbs.pediy.com/thread-273485.htm#msg_header_h2_0 http://lzonel.cn/3136.html http://blog.csdn.net/u010142437/article/details/78030485 http://www.jianshu.com/p/dd6cca4ec27d

本文由安全后厨团队分享,转载请注明来源,违者必究!