国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【iOS逆向與安全】編寫一個(gè)使應(yīng)用保持前臺運(yùn)行的系統(tǒng)插件

這篇具有很好參考價(jià)值的文章主要介紹了【iOS逆向與安全】編寫一個(gè)使應(yīng)用保持前臺運(yùn)行的系統(tǒng)插件。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

iOS越獄為用戶打開了無限的可能性,其中之一是便是開發(fā)系統(tǒng)級插件,為了確保應(yīng)用程序一直保持在前臺,即使在意外情況下也是如此。

本文將向您展示如何輕松編寫這樣的插件,讓我們開始探索iOS系統(tǒng)插件的世界吧!


一、目標(biāo)

學(xué)會創(chuàng)建功能強(qiáng)大的iOS系統(tǒng)插件。

二、開發(fā)環(huán)境和工具清單

  • mac系統(tǒng)
  • frida:動態(tài)調(diào)試
  • 已越獄iOS設(shè)備(iOS12.5.5):動態(tài)調(diào)試及插件測試

三、步驟

1、定位關(guān)鍵函數(shù)

SpringBoard是iOS系統(tǒng)非常重要的一個(gè)系統(tǒng)應(yīng)用程序,它為用戶提供了訪問和管理應(yīng)用程序的主要方式,同時(shí)也是用戶與設(shè)備交互的一個(gè)重要界面。咱們今天的調(diào)試目標(biāo)就是它。

使用frida-trace動態(tài)調(diào)試地,如何給定關(guān)鍵詞來縮小函數(shù)范圍,我在這有幾點(diǎn)經(jīng)驗(yàn):

  1. 根據(jù)類的前綴來減少不相關(guān)的類:

    如果你要跟蹤的庫為CoreFoundation.framework。那對應(yīng)的trace為frida-trace -UF -m "*[CF* *]"

    同樣,如果你要跟蹤的庫為AVFoundation.framework。那對應(yīng)的trace為frida-trace -UF -m "*[AV* *]"

    這種命名約定的背后是,iOS系統(tǒng)庫中的類名通常采用庫名的首字母縮寫加上具體類名的形式,以確保類名的唯一性和可讀性。例如,MapKit.framework中的類MKMapView.h、CoreLocation.framework中的類CLLocationManager.h、以及AVFoundation.framework中的類AVCaptureSession.h都遵循了這一約定。

    為什么UIKit.framework里的是UILabel.h,而不是UIKLabel.h呢?因?yàn)檫@貨出現(xiàn)得太早了,當(dāng)時(shí)的命名規(guī)范還未形成。

    為什么Foundation.framework里的是NSString.h,而不是FString.h呢?這貨也一樣,太早了,命名不規(guī)范。NS的全稱是NeXTStep框架,也就是Objective-c語言早期的實(shí)現(xiàn)之一,更多信息請google。

  2. 根據(jù)你的目標(biāo)來限定關(guān)鍵詞,如你想要跟蹤的功能和定位有關(guān)系。那你可以嘗試trace"*[*Location* *]""*[* *Location*]"?;蛘吣阋櫟暮桶l(fā)送消息有關(guān)系。那你可以嘗試trace"*[* *sendMsg*]""*[* *sendMsg]"。注:在這需要注意字母的大小寫。比如Location,這個(gè)L有可能是寫,這種情況你可以這樣trace"*[* ocation*]",不寫這個(gè)L就好了嘛。

那試想一下。我們今天的插件是不是和應(yīng)用有關(guān)系,那它的關(guān)鍵詞是不是就應(yīng)該是Application或App。還有狀態(tài)有關(guān)系。應(yīng)用的切換,就在在各種狀態(tài)之前變化,那這關(guān)鍵詞是不是就是State或state。根據(jù)經(jīng)驗(yàn)的第一條。咱們目標(biāo)應(yīng)用SpringBoard,那類名的前綴是不是應(yīng)該是SB。

連上你的手機(jī),并啟動任意程序。在終端執(zhí)行frida-trace -U -m "*[SB* *]" -o a.log SpringBoard,然而,以SB開頭的類太多了,這命令trace了3萬多個(gè)函數(shù),范圍太廣,手機(jī)直接卡死了…

ios應(yīng)用逆向與安全,ios,安全,cocoa

重新越獄調(diào)整命令為frida-trace -U -m "*[SB*pp* *]" -o a.log SpringBoard,將應(yīng)用切換到后臺,獲取到關(guān)鍵日志如下:

  ......
  ......
  ......
  ......
  ......
  ......
  仍然太多了,你也可以一點(diǎn)點(diǎn)分析,看看哪些函數(shù)可疑,然后再跟蹤。

再調(diào)試trace命令,加上statefrida-trace -U -m "*[SB*pp* *tate*]" -o a.log SpringBoard,將應(yīng)用切換到后臺,獲取到的部分關(guān)鍵日志如下:

-[SBMainDisplayWorkspaceAppInteractionEventSource layoutStateTransitionCoordinator:0x283547690 transitionDidEndWithTransitionContext:0x28275c900]
-[SBAppToAppWorkspaceTransaction shouldPerformToAppStateCleanupOnCompletion]
-[SBToAppsWorkspaceTransaction performToAppStateCleanup]
-[SBWorkspaceApplicationSceneTransitionContext layoutState]
-[SBWorkspaceApplicationSceneTransitionContext previousLayoutState]
-[SBApplication _noteProcess:0x109b51300 didChangeToState:0x283be0880]
-[SBApplication _updateProcess:<FBApplicationProcess: 0x109b51300; Cydia (com.saurik.Cydia); pid: 20212> withState:<FBProcessState: 0x283be0880; pid: 20212; taskState: Running; visibility: Background>]
-[SBApplication _internalProcessState]
-[SBApplicationProcessState taskState]
-[SBApplication _internalProcessState]
-[SBApplicationProcessState _initWithProcess:0x109b51300 stateSnapshot:0x283be0880]
-[SBApplication _setInternalProcessState:0x283bf8f40]
-[SBApplicationProcessState taskState]
-[SBApplicationProcessState taskState]
-[SBApplicationAutoLaunchService _applicationProcessStateDidChange:0x2835676f0]
-[SBApplication processState]
-[SBApplicationProcessState taskState]
-[SBApplication _noteProcess:0x109b51300 didChangeToState:0x283b07b20]
-[SBApplication _updateProcess:<FBApplicationProcess: 0x109b51300; Cydia (com.saurik.Cydia); pid: 20212> withState:<FBProcessState: 0x283b07b20; pid: 20212; taskState: Suspended; visibility: Background>]
-[SBApplication _internalProcessState]
-[SBApplicationProcessState taskState]
-[SBApplication _internalProcessState]
-[SBApplicationProcessState _initWithProcess:0x109b51300 stateSnapshot:0x283b07b20]
-[SBApplication _setInternalProcessState:0x283b98ea0]
-[SBApplicationProcessState taskState]
-[SBApplicationProcessState taskState]
-[SBApplicationAutoLaunchService _applicationProcessStateDidChange:0x283544690]
-[SBApplication processState]
-[SBApplication _internalProcessState]

從以上信息我們提取出關(guān)鍵類為SBApplication,可疑函數(shù)-[SBApplication _noteProcess:0x109b51300 didChangeToState:0x283b07b20],跟蹤該類frida-trace -U -m "-[SBApplication _noteProcess:didChangeToState:]" -o a.log SpringBoard,js代碼如下:

{
  onEnter(log, args, state) {
    log(`-[SBApplication _noteProcess:${ObjC.Object(args[2])} didChangeToState:${ObjC.Object(args[3])}]`);
  },
  onLeave(log, retval, state) {
  }
}

應(yīng)用切到后臺,獲取到日志如下:

-[SBApplication _noteProcess:<FBApplicationProcess: 0x113b1e540; Cydia (com.saurik.Cydia); pid: 20869> didChangeToState:<FBProcessState: 0x283bd71e0; pid: 20869; taskState: Running; visibility: Background>]
-[SBApplication _noteProcess:<FBApplicationProcess: 0x113b1e540; Cydia (com.saurik.Cydia); pid: 20869> didChangeToState:<FBProcessState: 0x283b82660; pid: 20869; taskState: Suspended; visibility: Background>]

根據(jù)日志信息,可以看出。第一個(gè)參數(shù)里包含了我們當(dāng)前的應(yīng)用信息。第二個(gè)參數(shù)則是應(yīng)用的狀態(tài)。Running、Suspended、Not Running。

至此,目標(biāo)函數(shù)已找到。

注:目標(biāo)函數(shù)不止這一個(gè),只要你通過你自己的關(guān)鍵詞定位,嘗試,也許是找到的其他函數(shù)。只要應(yīng)用的狀態(tài)正確且唯一,都可以使用。比如我之前調(diào)試過程中找到的函數(shù)是[SBMainWorkspace process:stateDidChangeFromState:toState:],也是可以用的。

2、編寫插件代碼

使用Xcode的MonkeyDev插件的Logos Tweak來創(chuàng)建插件工程:

ios應(yīng)用逆向與安全,ios,安全,cocoa

應(yīng)用狀態(tài)hook代碼如下:

%hook SBMainWorkspace

-(void)process:(id)arg1 stateDidChangeFromState:(id)arg2 toState:(id)arg3{
    %orig;

    // arg1的類型為:FBApplicationProcess,獲取包名的方法名為bundleIdentifier
    // arg3的類型為:FBProcessState,獲取到狀態(tài)的方法名為taskState
    // 在這查找類對應(yīng)的頭文件:https://developer.limneos.net/index.php
    
    NSString *bundleID = [arg1 valueForKey:@"bundleIdentifier"];
    BOOL isValid =  [AppAngel validBundleID:bundleID];

    int toState = [[arg3 valueForKey:@"taskState"] intValue]; // 調(diào)試可得:2運(yùn)行,3后臺,1殺死

    NSLog(@"witwit =%@=%@=", bundleID, arg3);
    NSLog(@"witwit hook=%d=%d=", isValid, toState);
    if (isValid {
        if (toState == 3) {
            [AppAngel launchApp:bundleID];
        } else if (toState == 1) {
            [AppAngel performSelector:@selector(launchApp:) withObject:bundleID afterDelay:1];
        }
    }
}

%end

由于插件開啟后,目標(biāo)應(yīng)用無法切換到后臺,這時(shí)你想關(guān)閉插件咋辦?于是有了關(guān)閉快捷鍵音量-或電源鍵,相關(guān)hook代碼如下:

%hook VolumeControl
-(void)increaseVolume {
    NSTimeInterval nowtime = [[NSDate date] timeIntervalSince1970];
    NSLog(@"witwit iosother increaseVolume");

    if (nowtime - g_volume_up_time < 1) {
       g_volume_up_count += 1;
       if (g_volume_up_count >= 2) {
            g_volume_up_count = 0;
            [AppAngel enablePlugins:YES];
        }
    } else {
        g_volume_up_count = 0;
    }
    %orig;
    g_volume_up_time = nowtime;
}

-(void)decreaseVolume {
    NSTimeInterval nowtime = [[NSDate date] timeIntervalSince1970];
    NSLog(@"witwit iosother decreaseVolume");

    if (nowtime - g_volume_down_time < 1) {
       g_volume_down_count += 1;
       if (g_volume_down_count >= 2) {
            g_volume_down_count = 0;
            [AppAngel enablePlugins:NO];
        }
    } else {
        g_volume_down_count = 0;
    }
    %orig;
    g_volume_down_time = nowtime;
}

// 在使用音量鍵開啟或關(guān)閉插件的toast在iOS12系統(tǒng)中會和音量彈窗重疊,hook音量彈窗
- (BOOL)_HUDIsDisplayableForCategory:(NSString *)category {
    if ([category isEqualToString:@"Audio/Video"]) {
        return NO;
    }
    return %orig;
}

%end

電源鍵監(jiān)聽相關(guān)代碼如下:

 // 注冊鎖屏通知
    notify_register_dispatch("com.apple.springboard.lockstate", &notifyToken, dispatch_get_main_queue(), ^(int token) {
        uint64_t state = 0;
        notify_get_state(token, &state);
        BOOL isScreenLocked = state == 1;
        
        if (isScreenLocked) {
            NSLog(@"witwit 鎖屏了");
            if ( [AppAngel getPreferencesWithKey:@"HookEnable"]) {
                [AppAngel enablePlugins:NO];
            }
        }
    });

由于我們可以會對特定的App進(jìn)行配置。于是使用AppList插件來實(shí)現(xiàn)該界面:

相關(guān)源碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>entry</key>
	<dict>
		<key>bundle</key>
		<string>AppList</string>
		<key>cell</key>
		<string>PSLinkCell</string>
		<key>icon</key>
		<string>/Library/PreferenceLoader/Preferences/AppAngelIcon.png</string>
		<key>isController</key>
		<string>1</string>
		<key>label</key>
		<string>應(yīng)用天使</string>
		<key>ALSettingsPath</key>
		<string>/var/mobile/Library/Preferences/com.witchan.AppAngel.plist</string>
		<key>ALSettingsKeyPrefix</key>
		<string>witwit-</string>
		<key>ALChangeNotification</key>
		<string>com.rpetrich.applist.sample.notification</string>
		<key>ALAllowsSelection</key>
		<string>1</string>
		<key>ALSectionDescriptors</key>
		<array>
			<dict>
				<key>items</key>
				<array>
					<dict>
						<key>text</key>
						<string>關(guān)于我</string>
						<key>action</key>
						<string>launchURL</string>
						<key>url</key>
						<string>https://mp.weixin.qq.com/s/WERMNPzW6WV5YGFthVqCRg</string>
					</dict>
				</array>
			</dict>
			<dict>
				<key>footer-title</key>
				<string>連按音量+鍵開啟插件,連按音量-或電源鍵停止插件                                                         </string>
				<key>items</key>
				<array>
					<dict>
						<key>cell-class-name</key>
						<string>ALSwitchCell</string>
						<key>default</key>
						<string>NO</string>
						<key>ALSettingsKey</key>
						<string>witwit-HookEnable</string>
						<key>text</key>
						<string>插件開關(guān)</string>
					</dict>
				</array>
			</dict>
			<dict>
				<key>title</key>
				<string>用戶應(yīng)用</string>
				<key>predicate</key>
				<string>isSystemApplication = FALSE</string>
				<key>cell-class-name</key>
				<string>ALSwitchCell</string>
				<key>icon-size</key>
				<string>29</string>
				<key>suppress-hidden-apps</key>
				<string>1</string>
			</dict>
			<dict>
				<key>title</key>
				<string>系統(tǒng)應(yīng)用</string>
				<key>predicate</key>
				<string>isSystemApplication = TRUE</string>
				<key>cell-class-name</key>
				<string>ALSwitchCell</string>
				<key>icon-size</key>
				<string>29</string>
				<key>suppress-hidden-apps</key>
				<string>1</string>
			</dict>
		</array>
	</dict>
</dict>
</plist>


總結(jié)

本文主要系統(tǒng)插件的實(shí)現(xiàn)過程進(jìn)行了分析及試驗(yàn),插件名叫【應(yīng)用天使】已在iOS12和15系統(tǒng)上測試并通過,已上傳到bigboss源。需要的同學(xué)請可下載使用,當(dāng)你在使用中遇到任何問題也可向我反饋。如需要插件完整源碼,請公眾號回復(fù)【應(yīng)用天使】即可獲取完整代碼。

注:在iOS15系統(tǒng)中,bigboss源的AppList插件不支持,請從https://repo.palera.in/源里下載并安裝AppList,或者自行下載支持iOS15的AppList。

提示:閱讀此文檔的過程中遇到任何問題,請關(guān)住工眾好【移動端Android和iOS開發(fā)技術(shù)分享】或+99 君羊【812546729
ios應(yīng)用逆向與安全,ios,安全,cocoa文章來源地址http://www.zghlxwxcb.cn/news/detail-770310.html

到了這里,關(guān)于【iOS逆向與安全】編寫一個(gè)使應(yīng)用保持前臺運(yùn)行的系統(tǒng)插件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【iOS逆向與安全】sms短信轉(zhuǎn)發(fā)插件開發(fā)

    【iOS逆向與安全】sms短信轉(zhuǎn)發(fā)插件開發(fā)

    經(jīng)過之前的分享,相信大家已經(jīng)掌握了用戶級的插件開發(fā)。勤奮好學(xué)的你是否對系統(tǒng)級的插件也有著濃厚的性趣,本篇文章將和大家一起學(xué)習(xí)如何分析并編寫一款系統(tǒng)級的插件。 一步步分析并編寫一個(gè)短信自動轉(zhuǎn)發(fā)的deb插件 mac系統(tǒng) 已越獄iOS設(shè)備:脫殼及frida調(diào)試 IDA Pro:靜態(tài)

    2024年02月10日
    瀏覽(14)
  • 【iOS逆向與安全】好用的一套 TCP 類

    ?初始化 ?發(fā)送數(shù)據(jù) 源碼類 配置端口

    2024年02月07日
    瀏覽(25)
  • 【iOS逆向與安全】使用ollvm混淆你的源碼

    【iOS逆向與安全】使用ollvm混淆你的源碼

    當(dāng)你在研究別人源碼的時(shí)候,是不是期望著別人代碼沒有進(jìn)行任何的防護(hù)和混淆。這時(shí)的你,是不是應(yīng)該考慮一下自己代碼的安全.本篇文章將告訴你,如何使用ollvm來混淆iOS端的代碼【此文為入門貼,大佬請繞道】。 編譯ollvm工具,并在Xcode中來混淆你的ipa或動態(tài)庫,增加別

    2023年04月19日
    瀏覽(21)
  • 【iOS逆向與安全】越獄檢測與過檢測附ida偽代碼

    首先在網(wǎng)上查找一些檢測代碼 放入項(xiàng)目運(yùn)行,用 ida 打開后 F5 得到下面的 用 frida hook hook?stat hook md5 frida-trace -UF -i \\\"CC_MD5\\\" -f xxxxxxx.xxx.xxxx fishhook 下面是網(wǎng)上找的源碼

    2024年02月03日
    瀏覽(20)
  • C#入門:編寫運(yùn)行第一個(gè)C#程序Helloworld

    C#入門:編寫運(yùn)行第一個(gè)C#程序Helloworld

    參考鏈接: C#入門學(xué)習(xí)-希里安 在官網(wǎng)下載安裝Professional 2022即可. https://visualstudio.microsoft.com/zh-hans/ 下載時(shí)選擇C#、.Net框架等支持,安裝后運(yùn)行,新建模板選擇 Visual C#、Window環(huán)境、新建Console控制臺應(yīng)用,為項(xiàng)目命名Helloworld。 下文代碼基于菜鳥教程改編。其中,Console.WriteLi

    2024年02月06日
    瀏覽(31)
  • 在Ubuntu里編寫并運(yùn)行一個(gè)程序的完整流程

    在Ubuntu里編寫并運(yùn)行一個(gè)程序的完整流程

    新建一個(gè)文件(以 hello.cpp 文件為例)的方法。 ①用vim編輯器的方法。 (前提是需要先裝vim編輯器, 安裝方法是在終端輸入 sudo apt-get install vim ,再輸入Y) ? ? ?首先輸入?vim? hello.cpp,進(jìn)入下圖命令模式狀態(tài) ?然后在鍵盤上輸入字母 i ,得到如下圖。注意左下角有( --INSE

    2024年02月07日
    瀏覽(21)
  • 使用Visual C++ 2010編寫運(yùn)行第一個(gè)C++程序

    使用Visual C++ 2010編寫運(yùn)行第一個(gè)C++程序

    本文主要介紹Visualc++ 2010學(xué)習(xí)版的操作界面,創(chuàng)建一個(gè)Win32控制臺項(xiàng)目,編寫并運(yùn)行自己的第一個(gè)C++程序。主要包括以下幾個(gè)方面: Visual C++ 2010概述 Visual C++ 2010下載安裝 Visual C++ 2010操作界面 創(chuàng)建Win32控制臺項(xiàng)目 編寫C++程序 運(yùn)行程序 本文使用的軟件版本: Windows 10 Visual C++

    2024年02月05日
    瀏覽(19)
  • JS加密在網(wǎng)頁安全中的應(yīng)用及逆向分析方法

    JS加密在網(wǎng)頁安全中的應(yīng)用及逆向分析方法

    在當(dāng)今互聯(lián)網(wǎng)時(shí)代,網(wǎng)頁加密技術(shù)的應(yīng)用越來越廣泛。在網(wǎng)頁中,常見的加密方式包括三種:flash加密、密碼控件加密和JS加密。雖然這三種方式各有優(yōu)劣,但JS加密是目前最為普遍和靈活的加密方式。 JS加密的廣泛應(yīng)用主要源于它的靈活性和易用性。與flash加密相比,JS加密的

    2024年02月06日
    瀏覽(23)
  • 【ChatGPT輔助學(xué)Rust | 基礎(chǔ)系列 | Hello, Rust】編寫并運(yùn)行第一個(gè)Rust程序

    【ChatGPT輔助學(xué)Rust | 基礎(chǔ)系列 | Hello, Rust】編寫并運(yùn)行第一個(gè)Rust程序

    在開始學(xué)習(xí)任何一門新的編程語言時(shí),都會從編寫一個(gè)簡單的 “Hello, World!” 程序開始。在這一章節(jié)中,將會介紹如何在Rust中編寫并運(yùn)行第一個(gè)程序。 在終端中,使用Cargo(Rust的構(gòu)建系統(tǒng)和包管理器)創(chuàng)建一個(gè)新的二進(jìn)制項(xiàng)目。輸入以下命令: 這將會在當(dāng)前目錄下創(chuàng)建一個(gè)

    2024年02月14日
    瀏覽(38)
  • Linux shell編程學(xué)習(xí)筆記14:編寫和運(yùn)行第一個(gè)shell腳本hello world!

    Linux shell編程學(xué)習(xí)筆記14:編寫和運(yùn)行第一個(gè)shell腳本hello world!

    ?* 20231020?寫這篇博文斷斷續(xù)續(xù)花了好幾天,為了說明不同shell在執(zhí)行同一腳本文件時(shí)的差別,我分別在csdn提供線上Linux環(huán)境 (使用的shell是zsh)和自己的電腦上(使用的shell是bash)做測試。功夫不負(fù)有心人,在其中一些實(shí)例中可以體現(xiàn)出zsh和bash的對腳本文件支持的差別,收

    2024年02月07日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包