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

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