五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

面試題丨android面試問題合集

2023-06-08 13:20 作者:rkvir逆向工程學(xué)院  | 我要投稿

1、項目里靜態(tài)分析和基于xposed動態(tài)工具介紹一下,如果不使用xposed,怎么實現(xiàn)動態(tài)分析工具?

靜態(tài)分析工具是指在不運行程序的情況下,通過對程序文件進行源代碼分析,從而對程序的安全性、可靠性、性能等進行分析的工具。它可以識別出程序文件中的漏洞,但只能識別出程序文件中的靜態(tài)漏洞,不能識別出程序在運行中可能出現(xiàn)的動態(tài)漏洞。比如apktool、androidkiller、jeb,GDA、smali、jadx等

xposed是一款可以為Android系統(tǒng)添加動態(tài)模塊的框架,它可以在不改變應(yīng)用程序的實際代碼的情況下,在運行時為應(yīng)用程序加載新的動態(tài)模塊。Xposed可以用來實現(xiàn)動態(tài)分析工具,因為它可以掛載到程序的運行過程中,給程序添加動態(tài)模塊,從而實現(xiàn)對程序運行情況的動態(tài)分析。

如果不使用xposed,怎么實現(xiàn)動態(tài)分析工具?

可以使用熱更新技術(shù)(熱更新就是動態(tài)下發(fā)代碼,當(dāng)用戶打開app時,通過網(wǎng)絡(luò)下載升級包來直接更新,不需要發(fā)布新版本到應(yīng)用市場。升級包的體積比較小,下載速度快。),它可以在不重新安裝應(yīng)用程序的情況下,將新功能添加到應(yīng)用程序中,從而實現(xiàn)動態(tài)分析。此外,還可以使用Java反射技術(shù),將特定的分析邏輯添加到程序運行過程中,從而實現(xiàn)動態(tài)分析。

2、安卓上的加固,脫殼技術(shù)介紹一下?

加固技術(shù):加固技術(shù)是指在應(yīng)用程序中采取一系列措施,以防止惡意仿冒、非法修改和拆分程序,從而保護應(yīng)用程序的安全性和完整性。

常見的加固技術(shù)有代碼混淆、簽名驗證、數(shù)據(jù)加密和、Root權(quán)限控制等。

脫殼技術(shù):脫殼技術(shù)是一種反編譯技術(shù),用于將已經(jīng)加固過的安卓應(yīng)用程序反編譯為可讀的源代碼,以便分析和研究應(yīng)用程序的內(nèi)部結(jié)構(gòu)和原理。通常,脫殼技術(shù)可以分為兩大類:靜態(tài)脫殼技術(shù)和動態(tài)脫殼技術(shù)。
靜態(tài)脫殼技術(shù)是指在不執(zhí)行應(yīng)用程序的情況下,通過反匯編和反編譯來分析應(yīng)用程序的原始代碼;
動態(tài)脫殼技術(shù)是指在應(yīng)用程序執(zhí)行過程中,通過跟蹤應(yīng)用程序的執(zhí)行流程并分析其內(nèi)部結(jié)構(gòu),來反匯編和反編譯其原始代碼。

3、如何從海量app找出一個二次打包的應(yīng)用呢,有幾種思路?(流量特征、代碼相似度檢測、UI節(jié)點遍歷等)

1、流量特征:分析應(yīng)用的流量特征,如流量源、目的地、數(shù)據(jù)大小等,是否存在異常的特征,可以判斷是否是一個二次打包的應(yīng)用。
2、代碼相似度檢測:檢測代碼的相似度,如果存在相同的代碼段或者極高的代碼相似度,則可以判斷是一個二次打包的應(yīng)用。
3、UI節(jié)點遍歷:針對UI界面,進行遍歷,查看UI界面中是否存在異常,如相同的界面或者極高的相似度,說明可能存在二次打包的應(yīng)用。

4、xposed框架原理?

Xposed框架是改變Android應(yīng)用的行為的一種方法,它使用一種叫做模塊的軟件,這些模塊可以在Android設(shè)備上運行,從而改變應(yīng)用程序的行為或外觀。

Xposed框架的原理是通過修改系統(tǒng)的內(nèi)存來實現(xiàn)的,它將在Android的每一次啟動時被加載,并且會捕獲正在運行的應(yīng)用程序的方法調(diào)用,然后根據(jù)Xposed模塊的設(shè)置來改變應(yīng)用程序的行為。Xposed框架可以被用來改變Android系統(tǒng)的外觀和行為,這種改變可以使用戶獲得更多的功能和更強大的體驗。替換/system/bin/app_process,該路徑的app_process被替換為Xposed的app_process,對需要hook的方法進行native注冊,達到優(yōu)先執(zhí)行

5、app的漏洞了解嗎?應(yīng)用克隆漏洞呢,activity暴露攻擊怎么利用,webview漏洞,其他漏洞等?

1、全局可讀寫漏洞、域控制不嚴格漏洞、密碼明文存儲漏洞、遠程代碼執(zhí)行漏洞、Webview漏洞、Android應(yīng)用本地拒絕服務(wù)漏洞等

2、應(yīng)用克隆漏洞:應(yīng)用克隆漏洞是指攻擊者可以通過某種技術(shù)手段復(fù)制一個應(yīng)用,并將其修改以獲取不正當(dāng)?shù)臋?quán)限、數(shù)據(jù)訪問等。
3、Activity暴露攻擊:Activity暴露攻擊是指攻擊者可以通過某種技術(shù)手段獲取到Android應(yīng)用中的隱藏Activity,從而獲取不正當(dāng)?shù)臋?quán)限、數(shù)據(jù)訪問等。
4、WebView漏洞:WebView漏洞是指攻擊者可以通過某種技術(shù)手段獲取到Android應(yīng)用中的WebView實例,從而獲取不正當(dāng)?shù)臋?quán)限、數(shù)據(jù)訪問等。
5、其他漏洞:Android應(yīng)用漏洞還包括資源泄露、無線網(wǎng)絡(luò)漏洞、應(yīng)用更新漏洞、數(shù)據(jù)存儲漏洞、系統(tǒng)服務(wù)漏洞等。

6、如何hook動態(tài)加載的dex?

動態(tài)加載dex的hook技術(shù)可以通過替換dex文件中的class文件來實現(xiàn)??梢酝ㄟ^替換classloader的openDexFile方法來替換dex文件的class文件,然后在openDexFile方法中將替換后的dex文件加載到虛擬機中,這樣就可以hook動態(tài)加載的dex文件了。

7、arm和x86匯編有什么區(qū)別?函數(shù)調(diào)用約定,函數(shù)傳參和返回值

1.函數(shù)調(diào)用約定不同:ARM采用的是“空參數(shù)?!狈绞?,而x86采用的是“壓棧”方式。

2.函數(shù)參數(shù)傳遞不同:ARM中函數(shù)參數(shù)通常是通過寄存器傳遞的,而x86中函數(shù)參數(shù)通常是通過堆棧傳遞的。

3.函數(shù)返回值的方式不同:ARM中函數(shù)返回值通常是通過寄存器傳遞的,而x86中函數(shù)返回值通常是通過堆棧傳遞的。

4.有的指令沒有:ARM匯編沒有x86匯編中的堆棧操作指令,但x86匯編沒有ARM匯編中的多數(shù)數(shù)據(jù)處理指令。

5.有的指令有些不同:ARM匯編和x86匯編中,有些指令的操作碼和功能有些不同。

8、棧溢出原理,格式化字符串漏洞,有哪幾種保護手段,怎么繞過棧上canary保護,ROP攻擊原理

1.棧溢出原理:棧溢出是指程序在運行過程中,向棧中壓入的數(shù)據(jù)比棧所能容納的要多,從而使原本存放在棧中的數(shù)據(jù)被溢出的數(shù)據(jù)覆蓋,從而導(dǎo)致程序出現(xiàn)異常。當(dāng)程序接收到一個惡意數(shù)據(jù),會在棧中壓入一定量的數(shù)據(jù),如果這個數(shù)據(jù)量超過了棧容量,就會導(dǎo)致棧溢出,程序就會異常終止,可能導(dǎo)致系統(tǒng)崩潰。

2.格式化字符串漏洞:格式化字符串漏洞是指程序未正確檢查用戶輸入的格式化字符串,從而被惡意的利用。當(dāng)惡意的用戶輸入一個特殊的格式化字符串時,程序就會運行一些不受控制的操作,甚至可以導(dǎo)致系統(tǒng)崩潰。

3.保護手段:

–格式化字符串應(yīng)該進行輸入驗證,可以使用正則表達式或者其他技術(shù)來驗證用戶輸入是否符合要求;

–使用訪問控制列表(ACL)來控制訪問,保證只有可信任的用戶才能訪問系統(tǒng);

–安裝最新的安全補丁,及時更新系統(tǒng),防止漏洞被利用。

4.繞過棧上canary保護:可以使用棧溢出技術(shù),將canary的值覆蓋為預(yù)期值。

5.ROP攻擊原理:ROP(Return-oriented Programming)攻擊是一種反向控制流技術(shù),它利用程序中的許多存在的返回指令,從而構(gòu)造出一個攻擊序列,來改變程序的執(zhí)行流程。ROP攻擊可以繞過現(xiàn)有的防御技術(shù),例如堆棧保護、代碼簽名等,來達到攻擊的目的。

9、現(xiàn)在安卓平臺上得幾種加固方式(動態(tài)加載,類抽取,混淆,vmp),怎么脫殼,及各種技術(shù)細節(jié)android常見的加固和脫殼技術(shù),vmp了解嗎,如何讓你設(shè)計虛擬機保護你怎么實現(xiàn)?vmp的優(yōu)劣勢?

1.動態(tài)加載:動態(tài)加載技術(shù)可以在運行時將可執(zhí)行文件下載至內(nèi)存,以防止可執(zhí)行文件被復(fù)制、植入病毒等。它可以降低應(yīng)用程序的運行速度,因為它需要下載可執(zhí)行文件,但同時可以提升應(yīng)用的安全性。

2.類抽取:這種技術(shù)可以將應(yīng)用的類抽取出來,并且將它們放置到獨立的存儲空間中,以便在運行時可以從這些獨立的存儲空間中加載這些類。這種技術(shù)可以有效阻止分析者從類中反編譯出應(yīng)用的源代碼。

3.混淆:混淆技術(shù)可以使反編譯者無法識別實際的代碼,因為代碼被混淆了,所以分析者無法得知實際的代碼意圖。這種技術(shù)也可以防止病毒感染,因為病毒程序也無法識別混淆的代碼。

4.VMP:VMP(Virtual Machine Protection)是一種特殊的加固技術(shù),它可以將應(yīng)用程序運行在虛擬機環(huán)境中,從而使得反編譯者無法直接訪問應(yīng)用的源代碼,以及降低反編譯的成功率。

脫殼:脫殼技術(shù)主要包括反匯編技術(shù)、檢測加固技術(shù)和破解加固技術(shù)。
反匯編技術(shù)可以用來分析加殼文件,檢測加固技術(shù)可以用來檢測是否加了殼;
破解加固技術(shù)則可以用來破解加殼文件,從而使文件可以被反編譯或破解。

談?wù)勌摂M機保護?

虛擬機保護使用虛擬化技術(shù)來保護某一臺物理機器上的操作系統(tǒng)和應(yīng)用程序,從而提高安全性和可靠性。它使用多個虛擬機(VM)來隔離物理機器上的資源,從而避免在執(zhí)行應(yīng)用程序時出現(xiàn)安全漏洞和其他系統(tǒng)問題。

虛擬機保護的優(yōu)勢:

?虛擬機保護可以提高系統(tǒng)的安全性,減少惡意軟件和攻擊的可能性,因為整個系統(tǒng)可以被隔離在虛擬機中。

?虛擬機保護可以減少系統(tǒng)的維護成本,因為它可以更容易地實施更新,不必重新安裝每個應(yīng)用程序。

?虛擬機保護可以提供更好的可用性和可恢復(fù)性,因為可以更容易地遷移虛擬機,從而更快地恢復(fù)系統(tǒng)。

虛擬機保護的缺點:

?虛擬機保護可能會增加系統(tǒng)的復(fù)雜性,因為需要在虛擬機和物理機器之間管理復(fù)雜的資源。

?虛擬機保護可能會增加系統(tǒng)的成本,因為需要購買其他的硬件設(shè)備和軟件。

?虛擬機保護可能會減緩系統(tǒng)的性能,因為需要在虛擬機和物理機器之間共享資源。

10、frida原理,xposed與frida有什么區(qū)別?

Frida是一款免費開源的跨平臺監(jiān)視、調(diào)試、改寫應(yīng)用程序的工具,它可以通過使用動態(tài)代碼注入技術(shù),在運行時向目標(biāo)程序中注入自定義代碼,從而實現(xiàn)對其行為的實時監(jiān)控和修改。

Xposed是一個使用root權(quán)限的安卓框架,它是以模塊的形式對系統(tǒng)或應(yīng)用程序的核心組件進行替換,從而達到修改系統(tǒng)行為的目的。

Frida與Xposed的區(qū)別:

?Xposed是基于root權(quán)限的安卓框架,模塊的形式對系統(tǒng)或應(yīng)用程序的核心組件進行替換;而Frida是一款免費開源的跨平臺監(jiān)視、調(diào)試、改寫應(yīng)用程序的工具,通過使用動態(tài)代碼注入技術(shù),在運行時向目標(biāo)程序中注入自定義代碼,從而實現(xiàn)對其行為的實時監(jiān)控和修改。

?Xposed需要root權(quán)限,而Frida可以在不需要root權(quán)限的情況下操作,所以Frida更加安全。

?Xposed只支持安卓系統(tǒng),而Frida支持多種操作系統(tǒng),包括安卓、iOS、Windows、macOS等。

11、Got表hook和inlinehook有什么區(qū)別?

Hook和Inline Hook是兩種不同的鉤子技術(shù),用于攔截程序的運行。Hook技術(shù)通過將一個函數(shù)指針指向用戶定義的函數(shù),在該函數(shù)被調(diào)用時,它會被用戶定義的函數(shù)取代。Inline Hook技術(shù)則是通過替換一段匯編指令來實現(xiàn)的,當(dāng)匯編代碼被執(zhí)行時,它會被用戶定義的匯編代碼替換。由于Hook技術(shù)只是替換一個函數(shù)指針,所以它的實現(xiàn)相對簡單,而Inline Hook技術(shù)則需要替換一段匯編代碼,所以它的實現(xiàn)相對復(fù)雜。

12、selinux安全相關(guān)

SElinux(Security-Enhanced Linux)是一種基于Linux的安全機制,它提供了一種有效的方式來限制系統(tǒng)資源的訪問,從而防止惡意攻擊者對系統(tǒng)的破壞。SElinux是基于強制訪問控制(MAC)的概念來實現(xiàn)安全性的,它允許系統(tǒng)管理員為每一個特定的程序、文件或用戶指定訪問資源的限制。在SElinux中,可以設(shè)置用戶的角色,以及每一個角色所允許的行為??梢栽O(shè)置文件的安全上下文,指定該文件的訪問權(quán)限.此外,SElinux還有一系列的安全策略,可以更好地保護系統(tǒng)免受網(wǎng)絡(luò)攻擊。

13、Android從按下開機鍵,啟動流程是怎樣的?

1.啟動Bootloader:Bootloader是一種特殊的引導(dǎo)程序,它負責(zé)從固件(firmware)中啟動操作系統(tǒng)。

2.加載內(nèi)核:內(nèi)核是Android操作系統(tǒng)的核心,它負責(zé)管理設(shè)備的資源,如處理器、內(nèi)存、存儲空間和其他硬件。

3.加載init進程:Init進程是Android系統(tǒng)的最初進程,用于啟動和管理其他進程。

4.加載Zygote進程:Zygote進程是Android系統(tǒng)的核心,它負責(zé)加載應(yīng)用程序的庫,以及創(chuàng)建新的應(yīng)用程序?qū)嵗?/p>

5.加載dalvik虛擬機:Dalvik虛擬機是Android系統(tǒng)中的虛擬機,它負責(zé)為應(yīng)用程序提供運行環(huán)境,并且負責(zé)執(zhí)行應(yīng)用程序代碼。

6.加載系統(tǒng)服務(wù)和應(yīng)用程序:Android系統(tǒng)會加載一些系統(tǒng)服務(wù)和應(yīng)用程序,這些服務(wù)和應(yīng)用程序負責(zé)完成設(shè)備上的基本任務(wù)和功能。

7.啟動桌面:當(dāng)系統(tǒng)服務(wù)和應(yīng)用程序加載完畢后,Android系統(tǒng)會啟動桌面,這樣用戶就可以開始使用設(shè)備了。

14、做過app自動化測試工具沒有,這些漏洞如果編寫自動化測試框架有什么思路?

1.首先,要確定當(dāng)前APP的漏洞,可以通過靜態(tài)代碼分析工具(如PMD,F(xiàn)indBugs,Checkstyle)來檢查源代碼,以及使用動態(tài)分析工具(如Flowdroid,MobSF,AppMon)來檢查應(yīng)用程序的邏輯行為。

2.然后,根據(jù)漏洞的類型和嚴重程度,分析APP的架構(gòu),搭建自動化測試框架,可以使用開源框架Appium,Robotium等來實現(xiàn)。

3.接下來,根據(jù)漏洞的類型,將相應(yīng)的測試用例編寫出來,構(gòu)建自動化測試用例,以便腳本自動執(zhí)行。

4.最后,使用測試框架和用例,實施自動化測試,并根據(jù)測試結(jié)果,確定漏洞的存在性及修復(fù)程度。

15、ida有個f5的功能,那么如何阻止破壞f5分析呢?(破壞堆棧,濫用noreturn函數(shù))ida不能f5反編譯的原因?

1.在程序中使用編譯器特定的指令,如堆棧布局,來防止F5分析。

2.使用編譯器特定的指令,如noreturn函數(shù),來防止F5分析。

3.使用靜態(tài)分析工具來檢查反匯編代碼,以確定它是否可能會被IDA反匯編。

4.為了防止IDA的反匯編,可以將可執(zhí)行文件中的一些字節(jié)替換為非可執(zhí)行字節(jié),使得IDA無法識別它們。

16、列舉幾個花指令的代碼片段?

1.讓電機以每秒60圈的速度旋轉(zhuǎn):

SET_MOTOR_SPEED motor_id, 60

1.讓電機以每秒100圈的速度旋轉(zhuǎn):

SET_MOTOR_SPEED motor_id, 100

1.讓電機以每秒50圈的速度反向旋轉(zhuǎn):

SET_MOTOR_DIRECTION motor_id, REVERSE
SET_MOTOR_SPEED motor_id, 50

1.讓電機停止運轉(zhuǎn):

SET_MOTOR_SPEED motor_id, 0

比如:

private static final char[] wJ = "0123456789abcdef".toCharArray();
??? public static String imsi = "204046330839890";
??? public static String p = "0";
??? public static String keyword = "電話";
??? public static String tranlateKeyword = "%E7%94%B5%E8%AF%9D";

17、android的init_array和jni_onload的時機問題,如何繞過init_array的反調(diào)試?

Android的init_arrayjni_onload是兩種不同的反調(diào)試機制。init_array是在鏈接時就會被調(diào)用,而jni_onload則是在Android系統(tǒng)中進行調(diào)用。

要繞過init_array的反調(diào)試,可以采用以下兩種方法:

1.使用不同的鏈接器:可以使用不同的鏈接器,以便替換init_array,從而避免被反調(diào)試。

2.修改程序代碼:可以手動修改程序代碼,將init_array改為jni_onload,從而避免被反調(diào)試。

18、xposed hook原理,xposed如何實現(xiàn)一個dalvik模式函數(shù)的hook的,frida如何實現(xiàn)native函數(shù)hook的?

1.Xposed Hook原理:
Xposed Hook原理是通過在Android系統(tǒng)中安裝一個叫Xposed框架的模塊,它會替換掉需要hook的應(yīng)用的某些函數(shù),從而實現(xiàn)對應(yīng)用程序的hook。Xposed框架會在dex文件中插入一些代碼,以實現(xiàn)hook的功能。

2.Xposed如何實現(xiàn)一個Dalvik模式函數(shù)的hook:
Xposed框架可以通過在被hook的函數(shù)的前部插入一些代碼來實現(xiàn)對函數(shù)的hook,從而在函數(shù)調(diào)用之前或之后做一些操作。Xposed框架可以通過替換被Hook函數(shù)的函數(shù)指針,實現(xiàn)對Dalvik模式函數(shù)的hook。

3.Frida如何實現(xiàn)Native函數(shù)hook:
Frida可以通過在程序運行時動態(tài)修改內(nèi)存中的代碼來實現(xiàn)native函數(shù)hook??梢酝ㄟ^修改函數(shù)的指令指針,從而將函數(shù)調(diào)用轉(zhuǎn)移到用戶定義的回調(diào)函數(shù)上,從而實現(xiàn)native函數(shù)hook。

19、android反調(diào)試的幾種手段?

1、檢測模擬器:通過檢測模擬器特征,如果檢測到模擬器,就可以認為是被反調(diào)試了。

2、檢測進程:檢測系統(tǒng)進程中是否含有debuggerd、tracerpid、ddms等進程,來判斷是否被調(diào)試。

3、檢測調(diào)試器:通過檢測調(diào)試器的標(biāo)志,來判斷是否被調(diào)試。

4、檢測斷點:通過檢測斷點,如果檢測到斷點,就可以認為是被反調(diào)試了。

5、檢測hooks:通過檢測hooks,如果檢測到hooks,就可以認為是被反調(diào)試了。

6、檢測內(nèi)存:檢測特定內(nèi)存中是否含有對應(yīng)的指令,來判斷是否被調(diào)試。

20、ollvm混淆的原理,手段,列舉指令替換的例子,如何實現(xiàn)的控制流平坦化?

ollvm混淆的原理,手段,列舉指令替換的例子,如何實現(xiàn)的控制流平坦化?

?llvm混淆的原理

???????????LLVM混淆是一種混淆技術(shù),它可以改變代碼中的指令流路徑,添加垃圾代碼,修改函數(shù)指針和變量名,從而使反匯編者難以理解代碼的結(jié)構(gòu)和功能。

?llvm混淆的手段

1.指令替換:對指令的替換,以使程序的執(zhí)行結(jié)果不變,但反匯編出來的代碼更加復(fù)雜;

2.代碼混淆:在代碼中添加垃圾代碼,讓反匯編者難以發(fā)現(xiàn)真正的邏輯;

3.函數(shù)指針混淆:改變函數(shù)指針的指向,從而使程序的執(zhí)行結(jié)果不變,但反匯編出來的函數(shù)指針就發(fā)生了變化;

4.變量名混淆:改變變量名,使反匯編分析者難以發(fā)現(xiàn)變量的真正含義。

?指令替換的例子

???????????例如:使用mov指令替換add指令,或者使用and指令替換or指令,使程序執(zhí)行結(jié)果不變,但反匯編出來的代碼更加復(fù)雜。

?如何實現(xiàn)控制流平坦化

???????????LLVM混淆可以通過添加垃圾代碼,增加函數(shù)的層次,改變函數(shù)調(diào)用次序,以及改變函數(shù)的控制流路徑來實現(xiàn)控制流平坦化。

21、ios砸殼工具原理?(dyld_insert_libraries注入dylib動態(tài)庫)

iOS砸殼工具的原理是通過dylib動態(tài)庫注入(dyld_insert_libraries)的方式,讓砸殼工具可以在App啟動的早期階段實現(xiàn)動態(tài)注入,從而在App的運行過程中實現(xiàn)破解。

dylib動態(tài)庫注入的原理是將一個特定的dylib動態(tài)庫注入到App的運行環(huán)境中,這個dylib動態(tài)庫會在App啟動時被加載運行,從而可以實現(xiàn)在App運行過程中對App的修改、破解等操作。

22、ios如何在不越獄的情況下去hook一個c函數(shù),了解fishhook嗎,Method Swizzing呢?

Fishhook就是一個iOS的鉤子框架,它允許你在運行時動態(tài)替換函數(shù)實現(xiàn),從而可以hook一個C函數(shù),而不需要越獄。

Method Swizzling是一種iOS開發(fā)技術(shù),它允許你替換Objective-C方法的實現(xiàn),從而可以hook一個C函數(shù),而不需要越獄。

23、static函數(shù)的區(qū)別,局部變量個全局變量放在哪個段,局部變量一定都放在棧上嗎?

1.靜態(tài)函數(shù)和普通函數(shù)的區(qū)別:

靜態(tài)函數(shù)是指在編譯期間就可以確定的函數(shù),它不受程序的運行過程影響,而普通函數(shù)是在運行時受到程序運行過程影響的函數(shù)。

1.局部變量和全局變量放在哪個段:

局部變量放在棧段,全局變量放在數(shù)據(jù)段。

1.局部變量一定都放在棧上嗎?

不一定,也可以放在寄存器中。

24、int a(int b){return a?100:10;}這個函數(shù)的作用《用你熟悉的一種匯編語言實現(xiàn),這個函數(shù)的匯編大體上分為哪幾個模塊?

;這個函數(shù)的匯編大體上分為三個模塊:

; 1、參數(shù)處理模塊:將參數(shù)b壓入棧中

MOV SP, R1 ;將SP指向棧頂
PUSH R0, b ;將b壓入棧中

; 2、邏輯處理模塊:判斷參數(shù)a是否為真

CMP R0, a ;比較a的值
JE LABEL1 ;若a等于0,則跳轉(zhuǎn)到LABEL1
JNE LABEL2 ;若a不等于0,則跳轉(zhuǎn)到LABEL2

; 3、返回值處理模塊:根據(jù)邏輯處理模塊的比較結(jié)果,設(shè)置返回值

LABEL1:
MOV R0, 100 ;將返回值設(shè)置為100
JMP LABEL3 ;跳轉(zhuǎn)到LABEL3

LABEL2:
MOV R0, 10 ;將返回值設(shè)置為10

LABEL3:
POP R0 ;從棧中彈出返回值
RET ;返回調(diào)用函數(shù)處

25、愛加密和邦邦殼是如何實現(xiàn)函數(shù)級加密的,脫殼思路是什么?

愛加密是一款功能強大的函數(shù)級加密軟件,能夠?qū)浖某绦虼a、數(shù)據(jù)等重要資源進行加密保護。它的工作原理是通過一種叫做“函數(shù)級加密”的技術(shù),把代碼和數(shù)據(jù)分別進行加密,并且在運行時將每一段代碼和數(shù)據(jù)解密,然后再進行處理,從而實現(xiàn)軟件的加密保護。

邦邦殼也是一款函數(shù)級加密軟件,它的工作原理是先把要加密的程序代碼分段加密,并在程序運行時,將每一段代碼解密,然后再進行處理,從而實現(xiàn)軟件的加密保護。

脫殼思路是先把要脫殼的程序文件分析出其中的殼程序,然后使用相應(yīng)的脫殼工具,將殼程序解密,最后再把程序內(nèi)部的被加密的部分還原成原來的樣子。

26、有沒有編譯過安卓源碼,怎么編譯內(nèi)核修改traceid字段實現(xiàn)的反調(diào)試bypass

是的,我曾經(jīng)編譯過安卓源碼。要實現(xiàn)反調(diào)試bypass,首先要修改內(nèi)核文件,具體的修改步驟是:
1、打開內(nèi)核文件(如arch/arm/kernel/entry-common.S),找到traceid字段;
2、在traceid字段處添加一行代碼,用來檢測是否處于調(diào)試狀態(tài);
3、如果處于調(diào)試狀態(tài),將traceid字段中的值設(shè)置為一個特殊的值,以便在程序中進行判斷;
4、在程序中添加代碼,用來檢測traceid字段的值,如果檢測到特殊值則執(zhí)行特定的操作,以實現(xiàn)反調(diào)試bypass的效果。

最后,在編譯完成后,將編譯出的內(nèi)核文件安裝到你的安卓手機上,即可實現(xiàn)反調(diào)試bypass的功能。

27、dalvik和art虛擬機上得函數(shù)hook區(qū)別是什么,art虛擬機為什么執(zhí)行速度加快?

1.Dalvik虛擬機使用基于指令的方法來執(zhí)行Java代碼,而ART虛擬機使用基于字節(jié)碼的方法來執(zhí)行Java代碼。因此,dalvik虛擬機上的函數(shù)hook只能替換dalvik虛擬機的指令,而art虛擬機上的函數(shù)hook可以替換字節(jié)碼,因此在art虛擬機上hook函數(shù)更加方便。

2.ART虛擬機的執(zhí)行速度比Dalvik虛擬機快的原因在于ART虛擬機采用AOT(Ahead Of Time)編譯,而Dalvik虛擬機采用JIT(Just In Time)編譯,AOT編譯把應(yīng)用程序的字節(jié)碼在安裝時就編譯成機器碼,而JIT編譯則是在應(yīng)用程序運行時編譯字節(jié)碼,因此AOT編譯可以提高應(yīng)用程序的執(zhí)行效率。

28、混淆so庫有什么分析經(jīng)驗,idapython相關(guān)問題?

1、使用procyon反編譯器對so庫進行反編譯,可以獲取到混淆之前的源代碼。

2、使用IDA Pro,進行反匯編,可以查看混淆之前的函數(shù)名、局部變量名等。

3、使用IDAPython,可以自動識別和修復(fù)函數(shù)名、局部變量名,進行分析和調(diào)試。

4、通過分析so庫的符號表,可以獲取到混淆之前的函數(shù)名、局部變量名等。

5、使用查找技術(shù),可以在已經(jīng)混淆過的函數(shù)中搜索指定的字符串,以確認函數(shù)的功能。

29、了解過微信xposed插件怎么做的嗎?

微信Xposed插件是一款可以實現(xiàn)各種微信功能的插件,它可以讓你在不破壞微信原有功能的情況下改變原有功能,并且可以添加新的功能。它通過替換微信安裝包來做到這一點,以滿足用戶的特殊需求。

30、分析項目中的xposed插件做什么輔助功能,哪些app做了?

Xposed插件可以為Android系統(tǒng)提供輔助功能,使用者可以通過安裝插件來定制自己的設(shè)備,獲得更多功能,并且安全可靠。

目前有不少應(yīng)用程序已經(jīng)使用了Xposed插件,其中包括:手機管家、護眼模式、狀態(tài)欄自定義、桌面美化、模塊定制、網(wǎng)絡(luò)加速、流量監(jiān)控、安全管理、屏幕解鎖、增強系統(tǒng)等。

31、項目中的抓包怎么抓的?抓不到怎么解決的,原因有哪些?

抓取項目中的抓包需要依賴一些工具,比如Wireshark、Charles、Fiddler等。首先需要將電腦和需要抓取的設(shè)備連接在同一個局域網(wǎng)中,然后打開相應(yīng)的抓包軟件,從而實現(xiàn)抓取項目中的數(shù)據(jù)包。

如果抓不到,可能原因有:

1.局域網(wǎng)連接出現(xiàn)問題;

2.抓包軟件配置有誤;

3.抓取設(shè)備上的防火墻設(shè)置或者其他安全軟件,阻擋了抓取數(shù)據(jù)包;

4.需要抓取的項目中沒有發(fā)出數(shù)據(jù)包;

5.網(wǎng)絡(luò)中出現(xiàn)了干擾,導(dǎo)致抓取數(shù)據(jù)包失敗。

解決這些問題的方式有:

1.確保局域網(wǎng)連接正常;

2.檢查抓取軟件的配置,保證正確;

3.檢查抓取設(shè)備上的防火墻設(shè)置,以及其他安全軟件,保證不阻擋抓取的數(shù)據(jù)包;

4.確保需要抓取的項目正確運行,發(fā)送出數(shù)據(jù)包;

5.確保網(wǎng)絡(luò)無干擾,保證抓取數(shù)據(jù)包的正常性。

32、xposed JustTrustMe的原理?

JustTrustMe是一種用于Android的Xposed框架的模塊,它可以讓用戶在沒有Root權(quán)限的情況下自動模擬系統(tǒng)對應(yīng)用的系統(tǒng)簽名,從而使用戶可以安裝未經(jīng)過系統(tǒng)或第三方簽名的應(yīng)用。JustTrustMe的原理是通過攔截Android系統(tǒng)的PackageManager應(yīng)用程序安裝和更新方法,將用戶安裝的未經(jīng)簽名的應(yīng)用程序替換為一個用戶簽名的應(yīng)用程序。這樣就可以實現(xiàn)安裝未經(jīng)簽名的應(yīng)用程序,而無需Root權(quán)限。

33、了解過ssl-pinning?ssl-pinning證書是怎么獲取的?

SSL Pinning是一種針對SSL/TLS協(xié)議的安全技術(shù),它允許應(yīng)用程序檢查連接到它的服務(wù)器的證書或公鑰,以確保它是有效的,并且沒有被中間人攻擊者篡改。

SSL Pinning證書可以通過從服務(wù)器獲取公鑰,或者從證書頒發(fā)機構(gòu)(CA)獲取證書來獲取。在獲取證書后,它們可以存儲在應(yīng)用程序中,以便在每次發(fā)起連接時進行檢查。

34、frida的檢測與對抗?

1.使用動態(tài)的檢測:使用動態(tài)的檢測來嘗試檢測Frida的使用,可以使用系統(tǒng)調(diào)用,模塊加載,網(wǎng)絡(luò)流量,線程狀態(tài)等來判斷程序中是否有調(diào)用Frida的行為。

2.使用靜態(tài)的檢測:可以通過檢查可執(zhí)行文件或應(yīng)用程序的字節(jié)碼,來查找Frida API調(diào)用的特征,以及用于注入代碼的匯編指令。

3.對抗Frida:應(yīng)用程序可以使用隨機化的技術(shù)(如ASLR)來防止Frida注入,它可以使Frida無法在特定的位置注入代碼。另外,應(yīng)用程序可以使用代碼簽名來防止Frida注入,因為Frida在運行時必須修改可執(zhí)行文件,但是如果可執(zhí)行文件被簽名,那么修改就會被拒絕。

35、雙進程的ptrace反調(diào)試如何解決?

雙進程ptrace反調(diào)試可以通過在兩個進程中分別捕獲對方的ptrace事件,并在發(fā)現(xiàn)調(diào)試行為時終止對方的調(diào)試活動來實現(xiàn)。這樣,即使一個進程被調(diào)試,另一個進程也可以檢測出來,從而阻止調(diào)試行為的發(fā)生。

36、指令抽取殼怎么脫?

脫殼指令抽取的步驟如下:

1.使用反編譯工具,如IDA Pro,Hopper等,將可執(zhí)行文件(EXE)反編譯成匯編指令;

2.尋找可疑的脫殼函數(shù),如LoadLibrary,GetProcAddress等;

3.根據(jù)脫殼函數(shù)的匯編指令,分析函數(shù)的加載流程,提取出脫殼的匯編指令;

4.將提取的脫殼指令轉(zhuǎn)換成十六進制值,編寫反脫殼程序進行脫殼。

37、fart脫殼?

Fart脫殼是指通過解密和反匯編技術(shù)來分析和破解Fart程序的過程。這種技術(shù)可以幫助破解者查看程序的源代碼,以便更好地理解程序的工作流程和內(nèi)部運行機制,并對其進行修改。有時,可以使用此技術(shù)來破解某些保護程序,以便破解者能夠更好地控制程序的運行。

38、注入、hook框架的原理?

1、注入原理:注入原理是利用反射機制,在運行時,將目標(biāo)類中的某些方法進行攔截,然后在攔截的方法中進行操作,從而實現(xiàn)對目標(biāo)類的改變,是最常見的hook原理。

2、hook框架原理:hook框架原理是 使用classloader加載指定的jar包,然后替換掉系統(tǒng)中的某些類,最后調(diào)用框架內(nèi)部的hook方法,對系統(tǒng)中原有的某些方法進行攔截,從而達到hook的效果。

39、elf文件格式,安卓的文件格式了解嗎?

安卓的文件格式主要有APK、DEX、ODEX、ELF、SO、JAR等。
ELF(Executable and Linkable Format)是可執(zhí)行和可鏈接格式,是UNIX系統(tǒng)中最常用的可執(zhí)行文件格式之一,主要用于Linux操作系統(tǒng),它能夠裝載可執(zhí)行文件、共享庫(shared library)和其他數(shù)據(jù)文件。ELF是Linux系統(tǒng)中最常見的可執(zhí)行文件格式,它是一種標(biāo)準的可執(zhí)行文件格式,它可以為操作系統(tǒng)提供一種靈活的模塊化架構(gòu),從而使操作系統(tǒng)可以運行在不同的硬件環(huán)境上。

40、dex最多有多少個方法,原理?

Dex文件最多可以包含65535個方法,原理是Dex文件中存儲了類、方法和字段的描述信息,這些信息是以32位字節(jié)為單位存儲的,而一個方法的描述信息可以占用2個字節(jié),所以Dex文件中最多可以存儲的方法數(shù)就是65535個。

41、davlik與art虛擬機的區(qū)別?

兩者之間的最明顯的區(qū)別是Dalvik虛擬機是Android系統(tǒng)的核心,而ART虛擬機是Android的新的運行時(runtime),用于替換Dalvik虛擬機。

Dalvik虛擬機采用的是JIT(Just-In-Time)編譯器,它可以在應(yīng)用程序運行時動態(tài)編譯代碼,從而提高應(yīng)用程序的性能。

而ART虛擬機采用的是AOT(Ahead-of-Time)編譯器,它在應(yīng)用程序安裝時就將代碼編譯成機器碼,可以節(jié)省時間,并且運行更流暢。

此外,Dalvik虛擬機使用的是DEX文件格式,而ART虛擬機使用的是OAT文件格式。

42、安卓系統(tǒng)沙箱是怎么實現(xiàn)的?

Android系統(tǒng)沙箱是通過安全機制來實現(xiàn)的,它主要包括文件系統(tǒng)權(quán)限,網(wǎng)絡(luò)訪問權(quán)限,內(nèi)存保護,進程隔離等。

文件系統(tǒng)權(quán)限:每個應(yīng)用都有一個單獨的文件系統(tǒng),它們之間不會相互干擾;

網(wǎng)絡(luò)訪問權(quán)限:每個應(yīng)用只能訪問自己擁有權(quán)限的網(wǎng)絡(luò)資源,不能訪問其他應(yīng)用的網(wǎng)絡(luò)資源;

內(nèi)存保護:每個應(yīng)用占用的內(nèi)存都受到嚴格限制,它們之間不能相互訪問;

進程隔離:每個應(yīng)用都運行在自己的進程中,它們之間不會受到影響。

43、binder機制?

Android的Binder機制是Android操作系統(tǒng)的一種遠程過程調(diào)用(RPC)機制,它將Android系統(tǒng)中的進程間通信(IPC)虛擬化,從而允許在不同的進程中調(diào)用遠程對象的方法。AndroidBinder使用一個叫做Binder的內(nèi)核組件,將系統(tǒng)中的進程連接在一起。Binder通信是在內(nèi)核空間進行的,當(dāng)客戶端和服務(wù)端進程之間發(fā)生數(shù)據(jù)交換時,它們都會發(fā)送一個Binder消息到內(nèi)核空間,Binder內(nèi)核組件會將這些消息傳遞到指定的服務(wù)端進程。Binder機制也支持遠程方法調(diào)用(RPC),允許客戶端遠程調(diào)用服務(wù)端進程中的方法。

44、app的安裝過程?

1.拷貝apk文件到指定目錄

2.解壓apk,拷貝文件,創(chuàng)建應(yīng)用的數(shù)據(jù)目錄

3.解析apk的AndroidManifinest.xml文件

4.顯示快捷方式
https://www.jianshu.com/p/21412a697eb0

45、如何防止app重打包?

1、在代碼中添加加密模塊,實現(xiàn)對重要代碼的加密保護;
2、在編譯過程中添加簽名保護,防止惡意篡改應(yīng)用程序;
3、在應(yīng)用程序中添加激活機制,防止被拆分和重新打包;
4、添加防止反編譯的機制,防止應(yīng)用程序被反編譯;
5、在項目中加入對資源的加密操作,以防止反編譯和重新打包;
6、添加動態(tài)加載機制,分拆代碼,以防止被反編譯和重新打包;
7、在應(yīng)用程序中添加防止模擬器運行的機制,以防止程序被重新打包。

46、JVM虛擬機與Android虛擬機區(qū)別?

JVM虛擬機主要用于運行Java程序,它是一種跨平臺的虛擬機,可以在多種操作系統(tǒng)上運行,以便跨平臺使用。Android虛擬機是一種特殊的虛擬機,主要用于運行Android應(yīng)用程序,它只能在Android系統(tǒng)上運行,不能在其他操作系統(tǒng)上運行。此外,Android虛擬機比JVM虛擬機更節(jié)省資源,能夠更好地適應(yīng)移動環(huán)境,使程序的啟動和運行更加流暢。

48、那dex和class到底在結(jié)構(gòu)上有什么區(qū)別呢?

dex文件是Android應(yīng)用程序的二進制文件,它存儲了應(yīng)用程序的字節(jié)碼,這些字節(jié)碼是Java虛擬機可以理解和執(zhí)行的。

class文件是Java應(yīng)用程序的二進制文件,它存儲了Java程序的字節(jié)碼,這些字節(jié)碼是Java虛擬機可以理解和執(zhí)行的。

dex文件和class文件在結(jié)構(gòu)上有很大的不同,dex文件是Android特有的二進制格式,而class文件是Java特有的二進制格式。

49、Android虛擬機中寄存器起什么作用,與棧的區(qū)別在哪里(又或者基于棧與基于寄存器的架構(gòu),誰更快?)

Android虛擬機中的寄存器主要用于存放CPU中臨時保存數(shù)據(jù)和指令的內(nèi)存單元,它不像棧會自動擴展,而是有一定的大小,可以存放一個指令。

與棧的區(qū)別在于,棧是一種自動增長的內(nèi)存結(jié)構(gòu),它可以用來存儲函數(shù)調(diào)用參數(shù)和函數(shù)返回值,它能夠自動增長和減少;而寄存器是一種固定大小的內(nèi)存結(jié)構(gòu),它只能用來存儲一個指令。

基于棧的架構(gòu)比基于寄存器的架構(gòu)更快,因為棧的操作更加簡單,不需要像寄存器架構(gòu)那樣實時保存和加載數(shù)據(jù)。

50、arm指令究竟是什么指令,能說說他與字節(jié)碼指令的區(qū)別嗎?

Arm指令是一種處理器指令,由英國Advanced RISC Machines Ltd(ARM)公司開發(fā)。最初它是一種RISC(降低精度計算機)指令,其目的是為了節(jié)省存儲空間,提高處理器性能。Arm指令通常用于智能手機和平板電腦,因為它們比其他處理器更節(jié)能,并且可以提供更快的處理速度。

字節(jié)碼指令是一種編碼,用于表示機器指令的抽象概念,它們可以用來生成真正的機器指令。字節(jié)碼指令與Arm指令最大的不同之處在于,前者是一種抽象概念,而后者則是一種特定的處理器指令。另外,字節(jié)碼指令可以通過解釋器或虛擬機執(zhí)行,而Arm指令則只能由特定的Arm處理器來執(zhí)行。

51.C++內(nèi)存對象布局(函數(shù),虛函數(shù),純虛函數(shù)),成員函數(shù)調(diào)用地址是什么樣?

C++內(nèi)存中的對象布局如下:

?普通函數(shù):普通函數(shù)只有一個存儲地址,指向代碼段中函數(shù)的入口點。

?虛函數(shù):虛函數(shù)有一個存儲地址,指向派生類中函數(shù)的入口點,以及一個虛函數(shù)表(vtable),包含虛函數(shù)及其地址。

?純虛函數(shù):純虛函數(shù)只有一個存儲地址,指向虛函數(shù)表(vtable),而不是派生類中函數(shù)的入口點。

成員函數(shù)調(diào)用地址是派生類中函數(shù)的入口點,即虛函數(shù)表(vtable)中的地址。

52.zygote啟動,怎么啟動app,app啟動流程(從點擊到界面顯示),啟動涉及到的線程,怎么交互?

1.點擊應(yīng)用程序圖標(biāo):用戶點擊圖標(biāo),系統(tǒng)會接收到點擊事件,并將該事件分發(fā)到Activity Manager服務(wù)中,Activity Manager服務(wù)會識別該事件,并打開相應(yīng)的應(yīng)用程序;

2.啟動Zygote:Activity Manager服務(wù)會啟動Zygote進程,Zygote進程負責(zé)為應(yīng)用程序創(chuàng)建一個新的進程;

3.啟動App進程:Zygote會啟動一個新的App進程,新的App進程會加載應(yīng)用程序的代碼和資源,并初始化應(yīng)用程序;

4.啟動線程:App進程會創(chuàng)建并啟動主線程、渲染線程和其它線程,主線程負責(zé)處理應(yīng)用程序的主要邏輯,渲染線程負責(zé)UI的繪制,其它線程負責(zé)更新數(shù)據(jù)和處理網(wǎng)絡(luò)請求等;

5.主線程加載Activity:主線程會加載應(yīng)用程序的啟動Activity;

6.啟動Activity:Activity Manager服務(wù)會啟動Activity,啟動Activity會激活渲染線程;

7.渲染線程繪制界面:渲染線程會繪制界面,并將繪制的界面展示在屏幕上;

8.交互:用戶可以通過界面進行交互,應(yīng)用程序會根據(jù)用戶的操作來更新界面并處理相關(guān)的邏輯。

53.linker加載so流程,so有依賴時如何執(zhí)行,so加殼原理和脫殼,soinfo如何替換?

linker加載so流程

1.首先,linker將要加載的so文件從文件系統(tǒng)中加載到內(nèi)存中;

2.然后,linker將讀取so文件,解析其ELF頭,以確定文件信息;

3.接著,linker將檢查so文件是否與當(dāng)前進程的ABI兼容;

4.接著,linker檢查so文件的依賴庫,并加載所有依賴的so文件;

5.然后,linker將加載so文件到虛擬地址空間,并處理其重定位段;

6.最后,linker將調(diào)用so文件的入口函數(shù),將其加載到內(nèi)存中。

so有依賴時如何執(zhí)行

當(dāng)so文件依賴其他so文件時,linker將首先加載依賴的so文件。然后,linker將加載要執(zhí)行的so文件。在加載過程中,linker將檢查依賴的so文件是否與當(dāng)前進程的ABI兼容,如果不兼容,則會拋出異常。

so加殼原理

so加殼的原理是將so文件的入口函數(shù)替換成加殼程序的入口函數(shù),而加殼程序的入口函數(shù)可以分析so文件的內(nèi)部結(jié)構(gòu),并且可以針對不同的so文件實現(xiàn)不同的加密算法。

so脫殼

so脫殼的原理是在加載so文件之前,先將加殼程序的入口函數(shù)替換回so文件的入口函數(shù),然后再加載so文件,從而達到脫殼的效果。

soinfo如何替換

soinfo可以使用linker的linker_find_soinfo函數(shù)來查找so文件,使用linker_add_soinfo函數(shù)來添加so文件,使用linker_remove_soinfo函數(shù)來移除so文件,使用linker_replace_soinfo函數(shù)來替換so文件。

54.inline hook和got hook原理,如何檢測?inline hook跳板設(shè)計,多次跳轉(zhuǎn)情況?

1.Inline hook原理:Inline hook是通過在原函數(shù)的開頭插入一段機器碼實現(xiàn)的,將原函數(shù)的開頭替換成一段跳轉(zhuǎn)機器碼,跳轉(zhuǎn)機器碼指向hook函數(shù),在hook函數(shù)中進行操作,然后再跳回原函數(shù),實現(xiàn)對函數(shù)的修改和攔截。

2.Got hook原理:Got hook是通過修改GOT表來實現(xiàn)的,GOT表中的函數(shù)地址入口默認是指向原函數(shù),hook實現(xiàn)時將其改為指向Hook函數(shù),在Hook函數(shù)中進行操作,然后再跳回原函數(shù),實現(xiàn)對函數(shù)的修改和攔截。

3.檢測:可以通過檢查函數(shù)的前面幾個字節(jié)來進行檢測,如果存在跳轉(zhuǎn)指令,則說明該函數(shù)被hook了;另外可以通過檢查GOT表中的函數(shù)地址入口來進行檢測,如果地址指向hook函數(shù),則說明該函數(shù)被hook了。

4.Inline hook跳板設(shè)計:Inline hook實現(xiàn)時,為了避免hook函數(shù)插入到原函數(shù)中造成函數(shù)體變大,可以使用跳板來實現(xiàn),即在原函數(shù)的開頭插入一段跳轉(zhuǎn)機器碼,跳轉(zhuǎn)機器碼指向一個跳板函數(shù),在跳板函數(shù)中再跳轉(zhuǎn)到hook函數(shù),在hook函數(shù)中進行操作,然后再跳回原函數(shù),實現(xiàn)對函數(shù)的修改和攔截。

5.多次跳轉(zhuǎn)情況:多次跳轉(zhuǎn)也是可以實現(xiàn)的,可以設(shè)計多個跳板函數(shù),每個跳板函數(shù)負責(zé)跳轉(zhuǎn)到下一個跳板函數(shù),最后一個跳板函數(shù)負責(zé)跳轉(zhuǎn)到hook函數(shù),在hook函數(shù)中進行操作,然后再跳回原函數(shù),實現(xiàn)對函數(shù)的修改和攔截。

55. Java hook中,xposed注入原理和hook原理,artmethod相關(guān),Javahook如何檢測,如何分析app是否有hook檢瀏?

1.Xposed注入原理:Xposed框架本質(zhì)上是基于模塊化的,它以一種特殊的形式將Java層的Hook技術(shù)注入到Android應(yīng)用程序中,從而實現(xiàn)對應(yīng)用程序的功能修改和增強。它使用一個叫做XposedBridge.jar的中間件,它將框架元素初始化到Zygote進程中,然后將Hook注入到每個應(yīng)用程序的進程中,以改變其行為。

2.Hook原理:Hook技術(shù)是一種通過改變應(yīng)用程序中原有函數(shù)的行為來實現(xiàn)目的的技術(shù)。它可以在應(yīng)用程序執(zhí)行前或執(zhí)行后更改函數(shù)行為,以改變應(yīng)用程序的行為。例如,可以使用Hook技術(shù)來改變應(yīng)用程序中的某些函數(shù),以達到隱藏系統(tǒng)的某些功能的目的。

3.ARTMethod相關(guān):ARTMethod是Android Runtime的一個重要組件,它可以替代早期的Dalvik虛擬機。ARTMethod負責(zé)將Java代碼編譯成機器語言,并執(zhí)行它。它的核心是ARTMethod表,其中包含了所有Java方法的信息,包括方法名、參數(shù)類型和堆棧大小等。

4.Javahook如何檢測:可以使用反編譯工具通過分析應(yīng)用程序的代碼來檢測java Hook技術(shù)。反編譯工具可以解碼應(yīng)用程序的字節(jié)碼,從而可以檢測出程序中使用的Hook技術(shù),如Xposed框架。

5.如何分析應(yīng)用程序是否有hook檢測:可以使用反編譯工具對應(yīng)用程序的字節(jié)碼進行分析,以檢測應(yīng)用程序是否包含特定的Hook檢測代碼。可以使用工具分析應(yīng)用程序的字節(jié)碼,以查找是否有用于檢測Hook技術(shù)的代碼。例如,可以檢查代碼中是否有檢查Xposed框架的代碼,以及檢查是否有替換ARTMethod表的代碼等。

56.riru和zygisk原理,4個回調(diào)的時機?

Siru和Zygisk原理是一種有效的控制算法,它通過定義四個回調(diào)來實現(xiàn)程序中止、掛起和重新啟動邏輯。

回調(diào)的時機如下:

1.啟動回調(diào):控制算法開始運行時調(diào)用。

2.執(zhí)行完成回調(diào):控制算法正常完成時調(diào)用。

3.掛起回調(diào):控制算法掛起時調(diào)用。

4.終止回調(diào):控制算法終止時調(diào)用。

57.ollvm混淆有哪些,怎么實現(xiàn)的,分析的方法有哪些,分別怎么做?

LLVM混淆有以下幾種:

1.算術(shù)混淆:通過添加無意義的數(shù)學(xué)運算,讓目標(biāo)代碼變得更復(fù)雜,混淆反編譯后的結(jié)果,從而達到安全加固的目的。

2.字符串混淆:在目標(biāo)代碼中添加大量的無意義的字符串,從而混淆反編譯后的結(jié)果,從而達到安全加固的目的。

3.代碼混淆:加入大量的無意義的代碼,從而讓反編譯后的結(jié)果變得更復(fù)雜,從而達到安全加固的目的。

4.函數(shù)重命名:將函數(shù)名重新命名,使反編譯后的結(jié)果更復(fù)雜,從而達到安全加固的目的。

5.棧混淆:使用?;煜?,使反編譯后的結(jié)果更復(fù)雜,從而達到安全加固的目的。

LLVM混淆實現(xiàn)的方法有以下幾種:

1.通過LLVM工具鏈進行混淆。

2.使用LLVM的插件進行混淆。

3.利用LLVM的API進行混淆。

分析LLVM混淆的方法有以下幾種:

1.逆向工程:使用現(xiàn)有的工具對LLVM混淆的代碼進行逆向工程,從而恢復(fù)原始的代碼。

2.分析混淆后的代碼:通過分析混淆后的代碼,從而恢復(fù)原始的代碼。

3.測試:使用現(xiàn)有的測試工具對LLVM混淆的代碼進行測試,從而恢復(fù)原始的代碼。

58. dex保護的方式(加殼)有哪些?分別怎么解決?

1.定長加殼:定長加殼是指在dex文件的前面添加一段固定長度的加殼程序,此類加殼程序通常有一定的檢測機制,可以檢測出被加殼,并且進行解密操作,以便正常使用dex文件。解決方法:需要逆向分析加殼程序,以便反編譯出原始dex文件。

2.變長加殼:變長加殼是指在dex文件的后面添加一段長度不定的加殼程序,由于變長加殼程序的長度不固定,因此可以更好地隱藏dex文件信息。解決方法:需要逆向分析加殼程序,以便反編譯出原始dex文件。

3.加密加殼:加密加殼是指對dex文件進行加密處理,然后在其外面加上一段加殼代碼,以便檢測出被加殼,并且進行解密操作,以便正常使用dex文件。解決方法:需要逆向分析加殼程序,以便反編譯出原始dex文件,以及解密dex文件。

59.如何hook動態(tài)加載的dex?

目前Android上有三種方法可以hook動態(tài)加載的dex:

1、使用InlineHook技術(shù):InlineHook技術(shù)可以通過修改原始字節(jié)碼,在dex加載時注入自定義代碼,從而實現(xiàn)hook動態(tài)加載的dex。

2、使用Substrate技術(shù):Substrate技術(shù)也是一種在dex加載時注入自定義代碼的技術(shù),它可以為dex文件注入額外的字節(jié)碼,從而實現(xiàn)hook動態(tài)加載的dex。

3、使用Xposed技術(shù):Xposed技術(shù)是一種在Android上動態(tài)加載模塊的技術(shù),它可以在dex加載時加載特定的模塊,從而實現(xiàn)hook動態(tài)加載的dex。

60.arm指令相關(guān),art指令相關(guān)。

Arm指令集是一種用于微處理器和處理器架構(gòu)的指令集架構(gòu),它有助于在不同的軟硬件環(huán)境中運行應(yīng)用程序。ARM指令集包括表示操作和數(shù)據(jù)的指令,以及用于控制程序流程的指令。

ART指令集是Android運行時(ART)編譯器使用的指令集。ART指令集旨在提高應(yīng)用程序的性能,因為它使用了高性能的指令,這使得應(yīng)用程序能夠更快地運行,而不會影響電池壽命。

61.內(nèi)存保護方案,如何實現(xiàn)?

內(nèi)存保護方案是指利用操作系統(tǒng)提供的安全機制來防止內(nèi)存被意外或惡意破壞。

實現(xiàn)內(nèi)存保護方案的方法有:

1.使用操作系統(tǒng)提供的安全機制,如訪問控制列表,讓每個進程只能訪問它被授權(quán)的內(nèi)存區(qū)域;

2.使用數(shù)據(jù)執(zhí)行保護,防止惡意代碼在內(nèi)存中執(zhí)行;

3.使用虛擬內(nèi)存,將程序的內(nèi)存拆分成不同的內(nèi)存頁,并建立相應(yīng)的映射,以限制特定的進程訪問內(nèi)存的多少;

4.使用緩沖區(qū)溢出保護,檢查用戶輸入的數(shù)據(jù)是否超出內(nèi)存的容量,以防止內(nèi)存損壞;

5.使用內(nèi)存污染檢測,檢查內(nèi)存中是否有意外的改變,以及檢測是否有未知代碼在內(nèi)存中運行;

6.使用內(nèi)存隔離技術(shù),將每個進程的內(nèi)存隔離開,以防止一個進程訪問另一個進程的內(nèi)存;

7.使用可信計算,通過在操作系統(tǒng)中執(zhí)行安全檢查,來防止惡意代碼執(zhí)行;

8.使用安全更新,定期更新系統(tǒng)補丁,以防止惡意代碼攻擊。

62.常見反調(diào)試以及繞過方式

反調(diào)試:

1.系統(tǒng)API檢測:通過調(diào)用系統(tǒng)提供的API函數(shù),檢測是否存在調(diào)試器,檢測到調(diào)試器即停止程序執(zhí)行,常用API函數(shù)有IsDebuggerPresent()、CheckRemoteDebuggerPresent()等。

2.系統(tǒng)進程檢測:通過枚舉系統(tǒng)進程,檢測調(diào)試器進程是否存在,存在即停止程序執(zhí)行,常用API函數(shù)有FindWindow()、FindWindowEx()等。

3.系統(tǒng)文件檢測:通過檢測系統(tǒng)文件,檢測調(diào)試器文件是否存在,存在即停止程序執(zhí)行,常用API函數(shù)有GetFileAttributes()等。

4.系統(tǒng)服務(wù)檢測:通過枚舉系統(tǒng)服務(wù),檢測調(diào)試器服務(wù)是否存在,存在即停止程序執(zhí)行,常用API函數(shù)有OpenSCManager()、OpenService()等。

5.內(nèi)存檢測:通過檢測內(nèi)存,檢測調(diào)試器斷點是否被設(shè)置,存在即停止程序執(zhí)行,常用API函數(shù)有VirtualQueryEx()、ReadProcessMemory()等。

6.硬件斷點檢測:通過檢測CPU寄存器,檢測硬件斷點是否被設(shè)置,存在即停止程序執(zhí)行,常用API函數(shù)有GetThreadContext()、SetThreadContext()等。

繞過方式:

1.模擬調(diào)試:被調(diào)試程序利用調(diào)試API函數(shù)檢測到調(diào)試器,但是并不是真正的調(diào)試器,而是模擬的調(diào)試器,此時可以繞過反調(diào)試檢測。

2.修改PE頭:修改可執(zhí)行文件PE頭中的標(biāo)志位,來繞過被調(diào)試程序的反調(diào)試檢測。

3.修改內(nèi)存:被調(diào)試程序利用內(nèi)存檢測技術(shù)檢測是否存在調(diào)試器,此時可以通過修改內(nèi)存來繞過被調(diào)試程序的反調(diào)試檢測。

4.注冊表修改:被調(diào)試程序利用注冊表檢測是否存在調(diào)試器,此時可以通過修改注冊表來繞過被調(diào)試程序的反調(diào)試檢測。

5.利用代碼混淆技術(shù):可以通過使用代碼混淆技術(shù),來隱藏被調(diào)試程序的反調(diào)試檢測代碼,從而繞過調(diào)試檢測。

63.elf格式相關(guān),靜態(tài)庫和共享庫區(qū)別。

靜態(tài)庫和共享庫是兩種不同的動態(tài)鏈接庫形式,它們之間的區(qū)別如下:

1.靜態(tài)庫是一種特殊的二進制文件,它的被鏈接的程序的程序大小會增加,但不會增加系統(tǒng)資源占用;共享庫是擴展動態(tài)鏈接庫,它的被鏈接的程序的大小不會增加,但會增加系統(tǒng)資源占用。

2.靜態(tài)庫是把對應(yīng)的函數(shù)或者類的定義都嵌入到目標(biāo)文件中,不依賴其他文件,可以在不同平臺之間移植;而共享庫是把某一類函數(shù)或者類的定義放在一個獨立的文件中,它們可以被多個程序共享,從而節(jié)約內(nèi)存和存儲空間,但是只能在同一類系統(tǒng)間共享,移植性較差。

3.靜態(tài)庫的編譯時間一般較長,但運行效率高;共享庫的編譯時間一般較短,但運行效率較低。

64.如何檢測重打包?

1.使用靜態(tài)代碼分析工具:靜態(tài)代碼分析工具可以檢測出重打包的應(yīng)用程序,因為它們會發(fā)現(xiàn)應(yīng)用程序中的重復(fù)代碼,以及被添加到應(yīng)用程序中的額外代碼。

2.使用動態(tài)分析工具:動態(tài)分析工具可以通過分析應(yīng)用程序的運行行為來檢測是否有重打包的應(yīng)用程序。

3.使用反匯編工具:反匯編工具可以通過分析應(yīng)用程序的機器代碼來檢測是否有重打包的應(yīng)用程序。

4.使用反編譯工具:反編譯工具可以將機器代碼轉(zhuǎn)換成可讀的源代碼,以發(fā)現(xiàn)重打包的應(yīng)用程序。

5.使用流量分析工具:流量分析工具可以檢測應(yīng)用程序的網(wǎng)絡(luò)流量,以發(fā)現(xiàn)重打包的應(yīng)用程序。

65.Java棧和c棧的區(qū)別。

Java棧和C棧的區(qū)別主要有以下幾點:

1.Java棧是一個虛擬機棧,用于存儲方法的執(zhí)行幀,而C棧是操作系統(tǒng)使用的棧,用于存儲函數(shù)的參數(shù)、局部變量等。

2.Java棧是由JVM負責(zé)管理,而C棧是由操作系統(tǒng)負責(zé)管理。

3.Java棧是安全的,可以防止溢出;而C棧則不安全,不能防止溢出。

4.Java棧的深度是限制的,而C棧的深度可以設(shè)置的比較大,甚至可以無限制。

5.Java棧中只存儲Java對象,而C棧中存儲的可以是任意類型的數(shù)據(jù)。

66.延遲處罰型風(fēng)控如何對抗?群控(工作室)有哪些檢測方式?

1.延遲處罰型風(fēng)控的對抗方式主要是建立一套完善的風(fēng)控體系,提高風(fēng)控質(zhì)量,保證風(fēng)控能力滿足經(jīng)營要求。包括:

(1)建立良好的客戶關(guān)系,及時發(fā)現(xiàn)客戶的異常行為,及時采取措施。

(2)提高風(fēng)控數(shù)據(jù)質(zhì)量,建立完善的風(fēng)控數(shù)據(jù)庫,并定期更新,以確保風(fēng)控數(shù)據(jù)的可靠性。

(3)定期對風(fēng)控系統(tǒng)進行檢測,確保系統(tǒng)的可用性和安全性。

(4)實施有效的風(fēng)控管理制度,如風(fēng)控流程、風(fēng)控規(guī)定等,確保風(fēng)控管理規(guī)范。

1.群控(工作室)檢測方式包括:

(1)賬號監(jiān)測:對工作室?guī)ぬ柕娘L(fēng)控措施,比如設(shè)置超額警報、建立風(fēng)險報表、實施定期檢查等。

(2)建立風(fēng)控報警系統(tǒng),及時發(fā)現(xiàn)異常行為和潛在風(fēng)險。

(3)實施安全測試,定期對系統(tǒng)進行滲透測試,及時查找系統(tǒng)漏洞。

(4)建立安全管理體系,定期檢查和評估安全管理機制。

67.設(shè)備指紋生成會遇到的問題,異常情況如何解決?

1.如果在獲取設(shè)備指紋的過程中出現(xiàn)網(wǎng)絡(luò)問題,可以采用重試機制,即在設(shè)定的時間內(nèi)重復(fù)嘗試獲取設(shè)備指紋。

2.如果在獲取設(shè)備指紋的過程中出現(xiàn)瀏覽器不支持的情況,可以通過探測瀏覽器版本,跳過不支持的瀏覽器,使用其他瀏覽器生成設(shè)備指紋。

3.如果設(shè)備指紋生成和存儲時出現(xiàn)異常,可以采用多種措施,比如檢查瀏覽器的cookie是否可用,檢查存儲空間是否有足夠的空間,檢查是否存在其他技術(shù)因素影響等。

68.native如何獲取xx設(shè)備信息?

React Native提供了React Native Device Info模塊,可以幫助開發(fā)者獲取有關(guān)設(shè)備的信息,如設(shè)備型號,系統(tǒng)名稱和版本,設(shè)備識別碼,應(yīng)用程序版本,屏幕寬度等等。

69.Android四大組件是什么?

Activities
Services
Broadcast receivers
Content providers

70.Activity的生命周期?

71.Android進程之間的通信方式?

Android進程之間的通信方式包括socket、Bundle、文件共享、Messenger、AIDLContentProvider等。

72:匯編 函數(shù)參數(shù)傳遞的過程?

1.首先,在調(diào)用函數(shù)時,把參數(shù)壓入棧中。

2.然后,函數(shù)調(diào)用前會將傳入?yún)?shù)的地址存儲到寄存器中。

3.最后,當(dāng)函數(shù)調(diào)用結(jié)束后,將返回值存儲到棧中,并且把返回地址從棧中取出,從而完成函數(shù)參數(shù)傳遞的過程。

73.匯編 函數(shù)返回有幾種形式?

1.使用 ret 指令返回;

2.使用 iret 指令返回;

3.使用 jmp 指令返回;

4.使用 call 指令返回;

5.使用 ljmp 指令返回。

74.Java與C++面向?qū)ο蟮膮^(qū)別?多重繼承

Java和C++都是面向?qū)ο蟮木幊陶Z言,但是它們在面向?qū)ο蟮膶崿F(xiàn)方式上有很大的不同。

1.Java支持單一繼承,而C支持多重繼承。Java只允許一個父類,而C可以從多個父類繼承。

2.Java只支持public、protected、friendly和private這4種訪問修飾符,而C++還支持protected,internal和package等訪問修飾符。

3.Java不支持指針,而C++支持指針。

4.Java不支持goto語句,而C++支持goto語句。

5.Java不支持operator overloading,而C++支持operator overloading。

6.Java支持垃圾回收,而C++不支持垃圾回收。

7.Java支持多線程,而C++不支持多線程。

75.全局變量,局部變量,const修飾的值保存在elf文件結(jié)構(gòu)的哪里?

全局變量:保存在ELF文件結(jié)構(gòu)的.data段中。

局部變量:保存在ELF文件結(jié)構(gòu)的.bss段中。

const修飾的值:保存在ELF文件結(jié)構(gòu)的.rodata段中。

76.堆和棧的區(qū)別?

堆和棧是兩種不同的內(nèi)存結(jié)構(gòu),它們都是用于存儲數(shù)據(jù)的內(nèi)存模型。

堆是一種隨機訪問存儲器,它是一種動態(tài)內(nèi)存分配模式,用于存儲任意大小的數(shù)據(jù)塊,它僅由程序員控制。堆中的數(shù)據(jù)不會因為函數(shù)的執(zhí)行和退出而被釋放,只有調(diào)用free()函數(shù)釋放。

棧是一種后進先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),它的內(nèi)存分配是固定的,它分配的內(nèi)存空間大小是固定的,它的操作是快速的。棧是用于存儲函數(shù)參數(shù),局部變量等局部數(shù)據(jù)的內(nèi)存模型。在函數(shù)調(diào)用結(jié)束時,棧中的數(shù)據(jù)會自動釋放。

77.怎么繞過SSLpining?

1.使用Hook技術(shù):Hook技術(shù)可以使用Xposed等框架,在安裝App時或運行時修改SSL證書的驗證方式,從而繞過SSL Pinning的限制。

2.使用反編譯工具:可以使用反編譯工具如dex2jar、jadx等工具,將App的可執(zhí)行文件dex文件反編譯成源代碼,修改源代碼中的SSL Pinning邏輯,再重新編譯成可執(zhí)行文件。

3.使用Root技術(shù):使用Root技術(shù)可以實現(xiàn)完全控制系統(tǒng),獲取系統(tǒng)的所有權(quán)限,進而修改SSL Pinning的實現(xiàn)邏輯,從而繞過SSL Pinning的限制。

78.怎么針對Socket通信防護?

1.使用安全的傳輸協(xié)議:在進行Socket通信時,應(yīng)使用安全的傳輸協(xié)議,例如SSL/TLS,能夠?qū)?shù)據(jù)進行加密,以防止數(shù)據(jù)泄漏和竊取。

2.建立安全的網(wǎng)絡(luò)環(huán)境:為了確保Socket通信的安全,需要建立安全的網(wǎng)絡(luò)環(huán)境,包括安裝和配置防火墻,禁止不必要的連接,并使用安全的身份驗證,確保只有被授權(quán)的用戶才能訪問網(wǎng)絡(luò)資源。

3.定期更新軟件:應(yīng)定期更新操作系統(tǒng)和應(yīng)用程序,以消除新發(fā)現(xiàn)的安全漏洞,防止惡意軟件的入侵。

4.使用虛擬私有網(wǎng)絡(luò):使用虛擬私有網(wǎng)絡(luò)(VPN)能夠?qū)W(wǎng)絡(luò)通信進行加密,以防止數(shù)據(jù)泄漏和竊取,提高網(wǎng)絡(luò)安全性。

79.權(quán)限的分類?

1.存儲權(quán)限:允許應(yīng)用程序訪問設(shè)備的存儲空間,以訪問、修改、刪除存儲的文件和數(shù)據(jù)。

2.設(shè)備權(quán)限:允許應(yīng)用程序訪問設(shè)備的功能,例如相機、麥克風(fēng)、藍牙等。

3.網(wǎng)絡(luò)權(quán)限:允許應(yīng)用程序訪問網(wǎng)絡(luò),以及使用網(wǎng)絡(luò)服務(wù),例如訪問網(wǎng)絡(luò)資源、發(fā)送短信、接收網(wǎng)絡(luò)數(shù)據(jù)等。

4.通訊錄權(quán)限:允許應(yīng)用程序訪問用戶的通訊錄,以便讀取、修改和添加聯(lián)系人。

5.安全權(quán)限:允許應(yīng)用程序執(zhí)行安全性相關(guān)的任務(wù),例如管理用戶賬戶、禁止應(yīng)用程序安裝等。

6.高級權(quán)限:允許應(yīng)用程序執(zhí)行高級任務(wù),例如管理系統(tǒng)設(shè)置、定位、監(jiān)控等。

80.Binder通信原理?

Binder是Android中的一種IPC(進程間通信)機制,它負責(zé)在進程之間傳遞消息和數(shù)據(jù),使得不同進程間可以進行通信。

Binder的工作原理是將消息封裝成一個特定的格式,然后通過系統(tǒng)內(nèi)核的binder驅(qū)動程序?qū)⑾l(fā)送到另一個進程,另一個進程收到消息后,解析消息,并發(fā)送響應(yīng)消息,雙方之間可以不斷發(fā)送消息,實現(xiàn)必要的通信。

81.說一下arm-vmp與dex-vmp的區(qū)別?

ARM-VMP是一種虛擬機,它可以在ARM處理器上運行Java虛擬機,而DEX-VMP則是一種基于Android的虛擬機,它可以運行Android應(yīng)用程序的Dalvik字節(jié)碼。ARM-VMP可以運行任何Java虛擬機,而DEX-VMP則只能運行Android應(yīng)用程序的Dalvik字節(jié)碼。此外,ARM-VMP可以支持多種不同的指令集,而DEX-VMP只能支持Android應(yīng)用程序的Dalvik字節(jié)碼。

82.說一下當(dāng)前dex-vmp的一些解決思路,以及新的vmp的混淆點,有了解么?

dex-vmp是一種反編譯混淆技術(shù),最初由Google開發(fā)。它旨在加強APK文件的安全性,以防止反編譯和分析。dex-vmp的解決方案是將原始字節(jié)碼替換為預(yù)先編譯的混淆字節(jié)碼。這樣反編譯者就無法準確地識別原始字節(jié)碼的功能,也無法輕松跟蹤應(yīng)用程序的控制流程。

新的VMP混淆也增加了對逆向工程的難度,使得攻擊者無法識別和跟蹤應(yīng)用程序的控制流程。新的VMP混淆點包括:混淆字節(jié)碼和指令;使用復(fù)雜的壓縮算法,加密混淆字節(jié)碼;混淆堆棧;混淆函數(shù)調(diào)用;混淆變量名;混淆局部變量;混淆全局變量;混淆寄存器;混淆代碼段;以及使用虛擬機代碼混淆等。

83.說一些ollvm的分 類以及如何解決ollvm的初步思路

OLLVM分為以下幾類:

1.編譯器優(yōu)化:OLLVM可以優(yōu)化源代碼,以改善程序的執(zhí)行效率。它可以改變源代碼的結(jié)構(gòu),消除不必要的操作,消除重復(fù)計算,提高內(nèi)存利用率,以及對算法進行優(yōu)化。

2.逆向工程:OLLVM可以借助目標(biāo)代碼逆向工程,即從目標(biāo)代碼中提取可執(zhí)行的原始源代碼。這類技術(shù)可以幫助用戶了解原始代碼的結(jié)構(gòu),以便更好地修改和優(yōu)化。

3.安全性分析:OLLVM可以掃描源代碼,檢測可能存在的安全漏洞,并幫助用戶修復(fù)這些漏洞。

4.代碼審計:OLLVM可以幫助用戶對源代碼進行審計,以確保代碼的可讀性、可維護性和可重用性。

解決OLLVM的初步思路:

1.了解OLLVM可以實現(xiàn)的功能,以及它們?nèi)绾文軌驇椭岣叱绦蛐省?/p>

2.搭建OLLVM開發(fā)環(huán)境,以便在實踐中進行嘗試。

3.熟悉OLLVM中的技術(shù),以便更好地利用它們。

4.根據(jù)實際需要,選擇合適的OLLVM技術(shù),并根據(jù)實際情況進行定制。

84.現(xiàn)在ollvm中你認為比較困難的點是哪些?

OLLVM中比較困難的點包括:

1、LLVM編譯器的架構(gòu)理解:LLVM是一個編譯器架構(gòu),它的組件非常多,非常復(fù)雜,難以理解。

2、LLVM IR的使用:LLVM IR是一種中間表示語言,它本身并不是一種高級編程語言,而是一種半結(jié)構(gòu)化的、非常低級的、直接操作硬件的語言,對于編程而言要求非常高,需要掌握很多底層的知識。

3、LLVM命令行接口的使用:LLVM的命令行接口非常復(fù)雜,每個命令都有非常多的參數(shù),對于初學(xué)者來說很難理解。

4、LLVM IR的優(yōu)化:LLVM IR的優(yōu)化是一個非常復(fù)雜的問題,需要掌握一系列優(yōu)化策略,并且要熟練運用LLVM提供的優(yōu)化工具,才能得到最佳的優(yōu)化效果。

85.Android上中間人抓包的原理?如何進行防護?如何進行對抗?還有哪些抓包方式?非root環(huán)境可以抓包嘛?說說方案?現(xiàn)有的一些最難的抓包情況是怎么樣的?

Android上中間人抓包的原理

Android中間人抓包的原理就是在中間進行抓包,將客戶端與服務(wù)器之間的數(shù)據(jù)流量攔截下來,進行監(jiān)控、分析和修改。這種抓包方式的實現(xiàn)方式一般先將客戶端的請求發(fā)送到中間服務(wù)器,中間服務(wù)器將請求轉(zhuǎn)發(fā)到服務(wù)端,服務(wù)端返回信息,中間服務(wù)器攔截返回信息,然后將返回信息轉(zhuǎn)發(fā)到客戶端。

如何進行防護

1、采用https協(xié)議:采用https協(xié)議可以有效防止中間人抓包,因為https協(xié)議會將請求和響應(yīng)進行加密,中間人無法讀取。

2、采用VPN技術(shù):將客戶端和服務(wù)端的連接封裝在一層VPN隧道中,使中間人無法攔截到數(shù)據(jù)流量,也無法抓包。

3、限制網(wǎng)絡(luò)訪問:可以限制客戶端只能訪問自己的服務(wù)器,這樣可以有效防止中間人抓包。

如何進行對抗

1、采用加密方案:可以采用加密方案,如SSL/TLS,來對數(shù)據(jù)進行加密,這樣即使中間人抓包,也無法解密數(shù)據(jù),從而防止被竊取信息。

2、采用雙因素認證:可以采用雙因素認證的方式來確??蛻舳说陌踩裕丛诳蛻舳说卿洉r,需要輸入用戶名和密碼,同時還需要輸入一個動態(tài)口令,這樣可以有效防止中間人抓包。

3、采用混淆算法:采用混淆算法可以把客戶端與服務(wù)端之間的數(shù)據(jù)流量進行混淆,從而使中間人抓包無從下手。

還有哪些抓包方式:

1、ARP欺騙抓包:ARP欺騙抓包是通過在網(wǎng)絡(luò)中偽造一個ARP請求來抓取數(shù)據(jù)包,這種方式是比較容易實現(xiàn)的,但是抓取的數(shù)據(jù)包量不大。

2、DNS欺騙抓包:DNS欺騙抓包是通過偽造DNS響應(yīng)來抓取數(shù)據(jù)包,這種方式比較容易實現(xiàn),但是可能引起DNS泄漏,需要注意。

3、MITM抓包:MITM抓包就是上面提到的中間人抓包,是一種比較常用的抓包方式,但是也比較容易被發(fā)現(xiàn)。

非root環(huán)境可以抓包嘛

是的,非root環(huán)境也可以抓包,比如采用ARP欺騙抓包、DNS欺騙抓包等方式。

說說方案:

1、采用https協(xié)議:采用https協(xié)議可以有效防止中間人抓包,因為https協(xié)議會將請求和響應(yīng)進行加密,中間人無法讀取。

2、采用VPN技術(shù):將客戶端和服務(wù)端的連接封裝在一層VPN隧道中,使中間人無法攔截到數(shù)據(jù)流量,也無法抓包。

3、采用雙因素認證:可以采用雙因素認證的方式來確??蛻舳说陌踩?,即在客戶端登錄時,需要輸入用戶名和密碼,同時還需要輸入一個動態(tài)口令,這樣可以有效防止中間人抓包。

4、采用加密方案:可以采用加密方案,如SSL/TLS,來對數(shù)據(jù)進行加密,這樣即使中間人抓包,也無法解密數(shù)據(jù),從而防止被竊取信息。

現(xiàn)有的一些最難的抓包情況是怎么樣的?

現(xiàn)有的一些最難的抓包情況是:

1、采用動態(tài)IP地址的抓包:當(dāng)客戶端的IP地址每次都在變化時,中間人抓包就會非常困難,因為中間人無法知道客戶端的IP地址,也無法進行抓包。

2、采用混淆算法的抓包:采用混淆算法可以把客戶端與服務(wù)端之間的數(shù)據(jù)流量進行混淆,使中間人抓包無從下手,這種抓包情況也是比較難的。

86.flutter有了解么?遇到這種情況怎么進行抓包?除了你提到的這些通用抓包方案?還有沒有其他思路?

Flutter是一款由谷歌開發(fā)的跨平臺應(yīng)用開發(fā)框架,它可以讓開發(fā)者利用Dart語言快速開發(fā)出高質(zhì)量的應(yīng)用程序,并且可以在Android和iOS平臺上部署。

對于Flutter抓包,除了你提到的這些通用抓包方案,還有一些特定的方案。比如,你可以使用Flutter中提供的HttpClient和HttpOverrides來抓取網(wǎng)絡(luò)數(shù)據(jù),也可以使用Flutter Inspector來檢查網(wǎng)絡(luò)請求。另外,還可以使用工具如Charles Proxy和Fiddler來抓取網(wǎng)絡(luò)請求,以及使用Wireshark來分析數(shù)據(jù)包。

87.Android動力態(tài)加載殼,不落地加載殼、函數(shù)抽取殼的加殼原理以及脫殼方案?

動力態(tài)加載殼是一種Android應(yīng)用程序保護方式,它是將原始代碼拆分成多個模塊,并利用動態(tài)加載技術(shù)在運行時將這些模塊加載到內(nèi)存中,從而實現(xiàn)代碼的重組和重新加載,從而達到防止反編譯的目的。

不落地加載殼的原理是將加殼后的程序的所有部分,包括殼程序、原始程序、加殼后的程序以及所有的被殼程序加載的動態(tài)庫,都放在一個可執(zhí)行文件中,并且不將任何文件保存在磁盤上,而是將文件加載到內(nèi)存中,運行時動態(tài)加載殼程序?qū)⒃汲绦蚺c加殼后的程序重新組合,從而實現(xiàn)加殼。

函數(shù)抽取殼的原理是,殼程序?qū)⒃汲绦虻暮瘮?shù)調(diào)用指令替換為自己的函數(shù)調(diào)用指令,然后將原始函數(shù)提取出來,保存在加殼后的程序中,當(dāng)程序運行時,殼程序?qū)⒆约旱暮瘮?shù)調(diào)用指令替換成原始函數(shù),從而實現(xiàn)加殼。

脫殼方案:可以采用反匯編技術(shù),對加殼后的程序進行反匯編,然后分析殼程序的加載過程,以及原始程序與殼程序的組合方式,從而實現(xiàn)脫殼。

88.了解Hook么,說下當(dāng)前常用的一些hook方式?xposed與Frida的原理,F(xiàn)rida氣ptrace的關(guān)系,F(xiàn)rida和1DA能同時使用么?Frida繞過的第見方式?

Hook是一種可以攔截程序流程的技術(shù),使用它可以攔截程序函數(shù)的調(diào)用,修改函數(shù)的參數(shù)和返回值,以及替換函數(shù)的實現(xiàn)。

目前常用的hook方式有:

1.目標(biāo)程序中使用代碼行為hook,如使用編譯器提供的特殊指令替換函數(shù);

2.通過系統(tǒng)API hook,如調(diào)用CreateRemoteThread函數(shù)注入DLL,替換函數(shù)調(diào)用;

3.內(nèi)存Hook,如通過VirtualProtect修改內(nèi)存保護屬性,修改函數(shù)代碼;

4.動態(tài)調(diào)試,如使用OllyDbg、WinDbg、GDB等工具調(diào)試程序,添加斷點,更改返回值。

Xposed是一種基于Android系統(tǒng)的框架,它使開發(fā)者可以使用自己的專用模塊對系統(tǒng)進行修改,而無需修改源代碼,即在不重新編譯系統(tǒng)的情況下,實現(xiàn)對系統(tǒng)的修改,其原理是通過對dalvik虛擬機的hook,實現(xiàn)對應(yīng)用程序的hook。

Frida是一款基于Python開發(fā)的跨平臺的應(yīng)用程序逆向工程工具,可以實現(xiàn)分析和檢查應(yīng)用程序的行為,并可以實時調(diào)試應(yīng)用程序,其原理是通過ptrace系統(tǒng)調(diào)用,實現(xiàn)應(yīng)用程序的hook。

Frida和ptrace的關(guān)系:Frida使用ptrace系統(tǒng)調(diào)用實現(xiàn)應(yīng)用程序的hook。

Frida和IDA能同時使用么:不能,F(xiàn)rida和IDA是兩種不同的逆向工具,不能同時使用。

Frida繞過的常見方式:

1.修改寄存器:通過修改寄存器中的值,實現(xiàn)繞過被檢測的代碼;

2.修改堆棧:修改堆棧,替換正常的返回地址,實現(xiàn)跳過被檢測的代碼;

3.修改內(nèi)存:修改內(nèi)存中的值,使得程序執(zhí)行流程不走被檢測的代碼;

4.反調(diào)試:通過檢測當(dāng)前程序是否處于調(diào)試狀態(tài),從而實現(xiàn)繞過被檢測的代碼。

89.了解簽名校驗么?Android的簽名機制?一些常用的簽名校驗方式?如何進行繞過?

簽名校驗是指在Android應(yīng)用程序中使用簽名證書對應(yīng)用程序進行簽名,以驗證應(yīng)用程序的完整性和安全性。

Android的簽名機制是將應(yīng)用程序的相關(guān)信息(如類、資源文件等)組合成一個數(shù)據(jù)流,然后使用簽名密鑰生成摘要,對應(yīng)用程序進行簽名。

一些常用的簽名校驗方式包括:使用簽名驗證程序來驗證應(yīng)用程序的完整性;使用簽名證書進行簽名;使用公鑰和私鑰進行簽名;使用算法(如MD5和SHA-1)進行簽名;使用密碼和密鑰進行簽名。

繞過簽名校驗的常用方法包括:使用破解工具篡改簽名;使用Xposed框架進行Hook;使用破解軟件和破解工具繞過簽名檢查;使用模擬器和虛擬機繞過簽名檢查。

90.了解重打包么?如何檢測重打包?

重打包是指應(yīng)用程序的源碼被篡改后,重新編譯打包,然后發(fā)布到應(yīng)用市場的行為。

檢測重打包有以下幾種方法:

1、代碼簽名:應(yīng)用程序的代碼簽名可以有效防止重打包,因為在重打包后,應(yīng)用程序代碼簽名將發(fā)生變化,從而被檢測出來。

2、混淆:混淆代碼可以有效防止重打包,因為重打包后重新編譯后,混淆后的代碼將變得難以識別和破解,從而被檢測出來。

3、反調(diào)試:反調(diào)試技術(shù)可以有效的防止重打包,當(dāng)應(yīng)用程序被重新編譯后,反調(diào)試技術(shù)會檢測出來,從而發(fā)現(xiàn)重打包行為。

4、數(shù)字水?。簲?shù)字水印可以有效的防止重打包,當(dāng)應(yīng)用程序被重新編譯后,數(shù)字水印會發(fā)生變化,從而被檢測出來。

91.vmp虛擬化如何實現(xiàn)對字段的虛擬化?

VMP虛擬化可以實現(xiàn)對字段的虛擬化,通過使用虛擬機實現(xiàn)虛擬機技術(shù),將多個字段虛擬化,從而節(jié)省服務(wù)器和存儲空間,提高系統(tǒng)性能。虛擬化字段的過程包括:

1)分區(qū)分配:將多個字段分割成一系列獨立的存儲單元,以便虛擬機可以在它們之間進行數(shù)據(jù)轉(zhuǎn)移;
2)虛擬化:將存儲單元中的數(shù)據(jù)虛擬化,以便虛擬機可以對其進行快速處理;
3)虛擬化存儲:將存儲單元中的數(shù)據(jù)虛擬化,以便其他虛擬機可以訪問它們;
4)虛擬化處理:將存儲單元中的數(shù)據(jù)虛擬化,以便虛擬機可以對其進行處理。

92.中斷的具體匯編指令是哪個?

中斷的匯編指令是int,可以用來觸發(fā)中斷。

93.中斷hook的一些實現(xiàn)的函數(shù)方法?

1.函數(shù)替換:將要hook的函數(shù)用自定義函數(shù)替換,實現(xiàn)hook的功能。

2.指令替換:將要hook的函數(shù)的指令替換成自定義的指令,實現(xiàn)hook的功能。

3.內(nèi)聯(lián)指令替換:在要hook的函數(shù)中插入自定義的匯編指令,實現(xiàn)hook的功能。

4.修改函數(shù)指針:將函數(shù)指針指向自定義的函數(shù),實現(xiàn)hook的功能。

5.修改系統(tǒng)調(diào)用表:將系統(tǒng)調(diào)用表中的函數(shù)指針替換成自定義的函數(shù),實現(xiàn)hook的功能。

94.控制流平坦化的解決?

一種解決方案是使用迭代器模式。迭代器模式允許我們在不改變原有控制流的情況下將復(fù)雜的控制流平坦化。它使用一個迭代器對象來遍歷一個集合中的元素,以便在每次迭代之間保持一致的控制流。它可以讓我們在不使用復(fù)雜的控制流的情況下,實現(xiàn)簡單的控制流。

95.符號執(zhí)行解決虛假控制流?

虛假控制流是一種程序中未正確標(biāo)記的控制流,它會導(dǎo)致程序的行為不正確。符號執(zhí)行是一種基於符號的技術(shù),可以用於解決虛假控制流的問題。符號執(zhí)行的方法是將程序的控制流分解為由一系列符號組成的序列。它使優(yōu)化器可以更輕鬆地判斷程序的行為,並識別哪些能夠在不影響行為的情況下移除。符號執(zhí)行也可以用於偵測和修復(fù)虛假控制流,這可以使程序行為更加正確。

96.frida的inlinehook具體修改哪幾條指令?

Frida的inlinehook可以修改一條或多條指令,具體取決于hook的目的。例如,如果要hook一個函數(shù),可以使用一個跳轉(zhuǎn)指令(如JMP)來將函數(shù)的入口點替換為自定義的函數(shù),以便將函數(shù)的行為替換為自定義函數(shù)的行為。此外,也可以使用更多指令來替換函數(shù)的行為,以便在函數(shù)調(diào)用時執(zhí)行一些操作。

97.Magisk怎么實現(xiàn)root?

Magisk是一款強大的Android越獄工具,它可以幫助你輕松地實現(xiàn)root。

首先,你需要在手機上安裝Magisk Manager應(yīng)用程序。接著,你需要下載Magisk文件,并將其復(fù)制到手機存儲中。然后,打開Magisk Manager,點擊“安裝”,并選擇“從本地安裝”,選擇剛才復(fù)制的Magisk文件,并點擊“確認”完成安裝。最后,你可以使用Magisk Manager來檢查你的手機是否已經(jīng)實現(xiàn)了root。

98.Magisk和Edxposed的關(guān)系?

Magisk和EdXposed是一個結(jié)合體,Magisk提供了一個安全的框架來安裝和運行EdXposed模塊,以及允許用戶隱藏root。EdXposed是一個模塊,它基于Xposed框架,能夠在沒有root權(quán)限的情況下修改應(yīng)用程序的行為。

99.xposed為什么不能在Android8.0上使用?

Android 8.0開始支持安全性更高的SEAndroid,這種安全性的提升會影響Xposed的原有的操作方式,因此Xposed不能在Android 8.0上使用。

100.Android本更新,機制的重大變化?

Android本更新的重大變化包括:

1.功能和工具的更新,例如:新API,支持新的設(shè)備,改進的性能和新的UI等;

2.安全性更新,主要是改進系統(tǒng)的安全功能,防止未經(jīng)授權(quán)的訪問和攻擊;

3.用戶體驗更新,改進系統(tǒng)的交互和可用性,以及為用戶提供更好的服務(wù);

4.其他更新,如支持新標(biāo)準,改進系統(tǒng)的支持性能等。

101.Magisk怎么進行隱藏指紋信息?

1、安裝Magisk,打開Magisk Manager,滑動到模塊標(biāo)簽,點擊搜索圖標(biāo),搜索“Hide My Root”,安裝并重啟。

2、再次打開Magisk Manager,點擊左側(cè)菜單欄中的“模塊”,找到剛才安裝的Hide My Root,點擊它,勾選“隱藏指紋信息”,然后點擊“應(yīng)用”即可。

102.不落地加載的基本原理?

不落地加載基本原理是使用Ajax技術(shù)實現(xiàn)。Ajax技術(shù)使用XMLHttpRequest對象發(fā)送HTTP請求,從服務(wù)器端獲取部分數(shù)據(jù),只需要更新部分網(wǎng)頁元素而不需要重新加載整個頁面。不落地加載可以更高效的提高網(wǎng)頁的加載速度,減少服務(wù)器的負載,提高用戶體驗。

103.got表hook和plt表hook的區(qū)別?

GOT表hook

GOT(Global Offset Table)表是一個由ELF可執(zhí)行文件中的動態(tài)鏈接器建立的表,其中包含動態(tài)鏈接庫中的所有外部函數(shù)的地址,當(dāng)程序調(diào)用外部函數(shù)時,會從GOT表中取得外部函數(shù)的地址,然后調(diào)用該函數(shù)。GOT表hook是指在GOT表中改變函數(shù)的地址,從而使得程序在調(diào)用該函數(shù)時不調(diào)用其真實的地址,而是調(diào)用hook函數(shù)指定的地址。

PLT表hook

PLT(Procedure Linkage Table)表是一個由ELF可執(zhí)行文件中的動態(tài)鏈接器建立的表,其中包含外部函數(shù)的入口,當(dāng)程序調(diào)用外部函數(shù)時,會從PLT表中取得外部函數(shù)的入口,然后調(diào)用該函數(shù)。PLT表hook是指在PLT表中改變函數(shù)的入口,從而使得程序在調(diào)用該函數(shù)時不調(diào)用其真實的入口,而是調(diào)用hook函數(shù)指定的入口。

兩者的區(qū)別:GOT表hook是改變函數(shù)地址,而PLT表hook是改變函數(shù)入口。

104.got表中有幾種重定向的方式?

有三種。

1.301重定向:永久性重定向,表明URL已經(jīng)被永久更改。

2.302重定向:臨時性重定向,表明URL僅在某段時間內(nèi)更改。

3.303重定向:用于指示客戶端在請求新資源時應(yīng)使用GET方法。

105.為什么可以刪除section節(jié)區(qū)?

因為section節(jié)區(qū)是用來存放程序代碼和數(shù)據(jù)的,而在計算機程序編譯運行之后,這些代碼和數(shù)據(jù)都已經(jīng)加載到內(nèi)存中了,因此可以將section節(jié)區(qū)刪除。

106.init arry的作用,可以沒有init arry么?

arry是一種數(shù)據(jù)結(jié)構(gòu),它可以用于存儲一組有序的元素。init arry是用來初始化arry的函數(shù),可以為arry指定存儲的元素類型,并且可以設(shè)置arry的長度,也可以指定arry的元素的值。沒有init arry的話,arry的元素的值就會是隨機的,不能滿足使用者的要求。

107,針s0里面的不局點車行加密怎么解決,

一般來說,不同的車行加密可能需要不同的解決方案。如果你想要解決s0里面的不局點車行加密,可以使用暴力破解的方法,即嘗試各種可能的密碼,直到找到正確的密碼為止。除了暴力破解之外,還可以使用現(xiàn)有的密碼字典來嘗試破解,或者嘗試使用特定的軟件來破解加密信息。

108.got表hook和inlinehook的優(yōu)缺?

優(yōu)點:

1.GOT表hook更加穩(wěn)定,一旦hook住,幾乎沒有可能性被解除;

2.inline hook更容易檢測,因為可以被檢測出來,不需要修改內(nèi)存。

缺點:

1.GOT表hook只能hook函數(shù)的入口點,對于復(fù)雜的函數(shù)無能為力;

2.inline hook比較復(fù)雜,一旦函數(shù)地址發(fā)生變化,則hook失效。

109.Dex2c的分析手段?

DEX2C是一種基于DEX文件的反編譯工具,它可以將DEX文件反匯編成可讀的C源代碼。它可以將DEX文件中的字節(jié)碼(bytecode)轉(zhuǎn)換為可讀的C源代碼,從而可以更好地了解DEX文件中的指令和參數(shù)。此外,它還可以執(zhí)行其它分析,如析構(gòu)函數(shù)、內(nèi)存管理等,以更好地了解DEX**文件的內(nèi)部結(jié)構(gòu)和實現(xiàn)機制。

110.為什么Dex2C會影響性能?

Dex2C會影響性能,因為它會增加編譯時間,消耗更多的內(nèi)存和CPU資源,以及減少應(yīng)用程序的性能。此外,由于它是一種非傳統(tǒng)的方法,所有操作都必須在設(shè)備上完成,這意味著它需要更多的時間來執(zhí)行。由于需要更多的時間來執(zhí)行,這將使應(yīng)用程序的性能受到影響。

111.ollvm中的不透明謂詞有了解么?針對不透明謂詞是怎么解決的?

不透明謂詞是LLVM中抽象語法樹(AST)中的一種特殊節(jié)點,用于表示一個操作,它擁有一個特定的名字,但不能被轉(zhuǎn)換為LLVM代碼。因此,它們不支持直接編譯,也不會被轉(zhuǎn)換為LLVM中間表示(IR)。

為了解決不透明謂詞的問題,LLVM提供了若干解決方案,其中最常用的兩種是函數(shù)調(diào)用外部函數(shù)和內(nèi)聯(lián)匯編,這兩種方法可以將不透明謂詞轉(zhuǎn)換為可以直接編譯的LLVM IR。

112.Unicorn里面一些問題?

Unicorn 是一個模擬執(zhí)行框架(仿真工具),該框架可以跨平臺執(zhí)行Arm, Arm64 (Armv8), M68K, Mips, Sparc, X86 (include X86_64)等指令集的原生程序。

Unicorn 不僅僅是模擬器,更是一種“硬件級”調(diào)試器,使用Unicorn的API可以輕松控制CPU寄存器、內(nèi)存等資源,調(diào)試或調(diào)用目標(biāo)二進制代碼,現(xiàn)有的反調(diào)試手段對Unicorn 幾乎是無效的。

113.Android的設(shè)備指紋防護?

Android的設(shè)備指紋防護指的是Android系統(tǒng)的一種安全技術(shù),可以通過指紋識別來保護用戶的手機安全。它可以用來鎖定手機屏幕,登錄應(yīng)用,解鎖支付應(yīng)用等。Android設(shè)備指紋防護可以讓用戶更方便的使用手機,同時也有效的保護用戶的隱私和數(shù)據(jù)安全。
。

轉(zhuǎn)載自:https://www.spider007.cn/posts/28/(對其中部分答案進行了填充修改)


面試題丨android面試問題合集的評論 (共 條)

分享到微博請遵守國家法律
建宁县| 定边县| 凭祥市| 永春县| 彭阳县| 荃湾区| 五家渠市| 云和县| 上林县| 汤阴县| 石狮市| 伊吾县| 彝良县| 郸城县| 集贤县| 无为县| 永顺县| 桦南县| 长乐市| 社旗县| 三门县| 大冶市| 监利县| 密山市| 神池县| 大田县| 穆棱市| 蕲春县| 特克斯县| 崇左市| 盐源县| 普兰店市| 双柏县| 无锡市| 忻州市| 二连浩特市| 扶风县| 台安县| 无棣县| 田阳县| 裕民县|