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.參考文獻

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

本文由安全後廚團隊分享,轉載請註明來源,違者必究!