一、App檢測設備
為了保障軟件的安全性,開發者需要對使用環境進行檢測,其中設備型號、操作系統版本、是否越獄等都是非常重要的因素。
在iOS設備上,可以使用UIDevice類獲取各種硬件和軟件信息,如設備類型、iOS版本、是否越獄等。在Android平台上,常用的設備檢測方法是檢測是否具有root權限,若有則認為該設備不安全。
// iOS設備檢測示例代碼- (BOOL)isJailBroken { BOOL jailBroken = NO; NSString *cydiaPath = @"/Applications/Cydia.app"; NSString *aptPath = @"/private/var/lib/apt/"; if ([[NSFileManager defaultManager] fileExistsAtPath:cydiaPath]) { jailBroken = YES; } if ([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) { jailBroken = YES; } return jailBroken;}
// Android設備檢測示例代碼private boolean isRoot() { Process process = null; try { process = Runtime.getRuntime().exec("/system/xbin/which su"); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String suPath = in.readLine(); if (suPath != null) { return true; } return false; } catch (Throwable e) { return false; } finally { if (process != null) { process.destroy(); } }}
二、App檢測Root不讓使用
檢測到設備已經root後,有一些應用會強制退出,或者拒絕繼續運行。
這裡介紹兩種比較常見的檢測方式:一種是檢測root文件系統的一些文件,如 /system/bin/su、/su/bin/su、/magisk,如果文件存在則認為設備已經被root。另一種方式是使用Xposed框架,Hook掉進程和文件,從而可以繞過檢測。
// 檢測文件是否存在,判斷設備是否已rootprivate boolean isRoot() { String[] paths = {"/system/bin/su", "/system/usr/su", "/system/xbin/su", "/system/su", "/sbin/su", "/vendor/bin/su", "/su/bin/su", "/magisk"}; for (String path : paths) { if (new File(path).exists()) { return true; } } return false;}
// 使用Xposed框架,繞過Root檢測示例代碼public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable{ if (lpparam.packageName.equals("com.app")) { findAndHookMethod("android.os.SystemProperties", lpparam.classLoader, "get", String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if ("ro.build.selinux".equals(param.args[0])) { param.setResult("Permissive"); } super.beforeHookedMethod(param); } }); }}
三、App檢測代理
在網絡安全中,代理被廣泛使用,以保護用戶的隱私和安全。但是有些應用會禁止使用代理,此時我們需要進行代理檢測,確保代理不被應用檢測到。
常用的檢測方式是檢測當前應用的網絡請求是否經過了代理,以及檢測當前設備是否開啟了系統級代理。如果經過代理,則直接攔截請求,否則直接發送請求。
// 檢測代理是否開啟示例代碼private boolean isProxyEnabled() { String proxyHost = System.getProperty("http.proxyHost"); String proxyPort = System.getProperty("http.proxyPort"); return !TextUtils.isEmpty(proxyHost) && !TextUtils.isEmpty(proxyPort);}
// 設置系統級代理示例代碼public void setProxy() { System.setProperty("http.proxyHost", "192.168.1.1"); System.setProperty("http.proxyPort", "8888");}
四、App檢測平台
有些應用只開放了特定平台的下載和使用,例如iOS應用只能在iOS設備上下載。為了安裝和使用這些應用程序,我們可以通過模擬平台信息的方式來繞過平台檢測,讓應用檢測到我們的設備為目標平台設備。
// Java代碼模擬iOS設備System.setProperty("http.agent", "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us)\n" + " AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10");
// Android代碼模擬iOS設備WebView webView = new WebView(context);WebSettings settings = webView.getSettings();settings.setUserAgentString("Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us)\n" + " AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10");
五、App檢測不到NFC
NFC作為近場通訊技術,現在已經被廣泛應用於移動設備支付、門禁卡等領域,但是有些應用會進行NFC檢測,如果檢測到設備不支持NFC,則會禁止應用使用。
針對這種情況,我們可以通過hook掉檢測函數,繞過NFC檢測。
// Hook掉NFC檢測函數示例代碼public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable{ if (lpparam.packageName.equals("com.app")) { findAndHookMethod("com.app.NFCManager", lpparam.classLoader, "checkNFC", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return true; } }); }}
六、App檢測WiFi連接
在有些應用中,需要在特定的WiFi環境下使用,例如內部WiFi。此時如果WiFi連接不上,則應用會直接崩潰或強制退出。
解決這個問題的方法比較簡單,只需要將設備的WiFi模塊關閉,或者截獲應用檢測WiFi的函數,使其直接返回有連接的狀態。
// 關閉WiFi模塊示例代碼WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);wifiManager.setWifiEnabled(false);
// Hook掉WiFi檢測函數示例代碼public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { if (lpparam.packageName.equals("com.app")) { XposedHelpers.findAndHookMethod("com.app.WifiUtils", lpparam.classLoader, "isWifiConnected", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return true; } }); }}
七、App檢測投屏怎麼辦
有些應用會檢測設備是否進行了投屏操作,如果發現投屏則會強制退出或者提示不允許投屏。
針對這種情況,我們可以使用Xposed插件來hook掉投屏檢測函數,或者使用投屏模塊來偽裝不進行投屏操作。
// Hook掉投屏檢測函數示例代碼public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable{ if (lpparam.packageName.equals("com.app")) { findAndHookMethod("com.app.CastManager", lpparam.classLoader, "isCasting", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return false; } }); }}
八、App檢測代理不能抓包
在進行移動應用安全測試時,我們需要使用抓包工具來分析應用的數據流程,但是有些應用會禁止使用代理抓包工具,因此我們需要使用代理繞過工具來繞過該檢測。
// 使用Frida抓包繞過代理檢測示例代碼var MyClass = Java.use('com.app.MyClass');MyClass.getHttp = function (str) { Java.use("java.net.Proxy").$init(Java.use("java.net.Proxy$Type").DIRECT, Java.use("java.net.InetSocketAddress").$new("127.0.0.1", 8888)); return this.getHttpNoProxy(str);}
九、App檢測Frida原理
Frida是一款非常強大的動態分析工具,可以幫助我們分析應用的數據流程、函數調用、加密算法等。但是有些應用會對Frida進行檢測,如果檢測到Frida則會強制退出。
為了繞過這個檢測,我們可以通過hook掉檢測函數、反射修改值、修改寄存器等方法來繞過Frida檢測。
// 使用Frida hook掉Frida檢測函數var MyClass = Java.use('com.app.MyClass');MyClass.checkFrida = function () { return false;}
// 使用Frida反射修改Frida檢測值示例代碼Java.use("com.app.MyClass").__staticInitializer__.overload().implementation = function() { var MyClass = Java.use("com.app.MyClass"); var fild = MyClass.class.getDeclaredField("isFrida"); fild.setAccessible(true); fild.set(null, false);}
十、App檢測抓包閃退
在進行應用抓包時,有時會遇到抓包軟件崩潰或者強制退出的情況,這種情況往往是由抓包軟件的檢測或者應用的檢測導致的。
解決這種問題的方法比較簡單,我們可以使用一些抓包模塊,或者通過hook掉檢測函數和調用函數等方法來繞過檢測。
// 使用Xposed hook掉crash檢測函數示例代碼public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { if (lpparam.packageName.equals("com.app")) { XposedHelpers.findAndHookMethod("com.app.CrashManager", lpparam.classLoader, "checkCrash", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return false; } }); }}
// 使用Frida防止應用檢測抓包模塊Java.perform(function() { var System = Java.use('java.lang.System'); System.loadLibrary.implementation = function(library) { try { if (library.includes('charles')) { return false; } } catch(e) {} return this.loadLibrary.call(this, library); };});
原創文章,作者:UMWR,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/148725.html