一般最好是手頭有一個安卓手機,模擬器不僅操作麻煩,有的時候還會被程序檢查,執行的邏輯也不同。關於模擬器的問題以後會說,這個據說使用夜神模擬器很不錯,android stdio的模擬器效率不敢恭維,但是可以下載無數的系統版本。
今天主要是各種主流工具的應用
這裏的·工具會介紹一些特別有用的,不要急不知道都是啥。
常見的題目是
給出apk安裝包,進行逆向
算法分析-web前端進行後端滲-混淆解密
一般我們的java組成有Dalvik層 主要是java 還有Native層 主要是c c++ 都可以出現題目
APK文件格式
apk是安卓程序安卓包,起始就是一個壓縮包,裏面是一些java代碼,資源文件,配置文件等。
Android APK文件是Java JAR包格式的擴展,當然也是ZIP文件格式的擴展格式。
APK文件以.apk爲後綴。
APK文件主要包含:代碼、資源、簽名文件等。
具體的看這位師傅的吧 https://blog.csdn.net/fwt336/article/details/52401902
具體而言,包含:
1.AndroidManifest.xml
該文件用來聲明應用程序的包名稱、版本、組件和其他數據。
2.classes.dex
該文件包含應用程序的可執行代碼,該文件格式是Dalvik VM的原生DES格式。
3.resources.arsc
該文件是資源索引表,包含res下的各類資源,如字符串和類型等。
4.assets
該目錄下存放着資源文件,如數據庫、字體文件、媒體文件、圖片文件等。
5.lib
該目錄下存放着庫文件。
6.META-INF
該目錄下存放着簽名文件。
7.res
該目錄下存放着資源文件。和assets目錄的差異是:res目錄下的子目錄是規定好的;除了raw子目錄,其他的子目錄都參與編譯,這些子目錄下的資源是通過編譯出的R類在代碼中訪問。而assets目錄下的資源子目錄的建立則不受限制;assets目錄下的資源訪問是直接通過引用文件名。
虛擬機dalvik虛擬機
關於虛擬機這個概念剛開始很難以理解,可以理解爲類似於pc的虛擬機,將不同的程序隔離運行。
Dalvik是Google公司自己設計用於Android平臺的Java虛擬機,它是Android平臺的重要組成部分,支持dex格式(Dalvik Executable)的Java應用程序的運行。dex格式是專門爲Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。Google對其進行了特定的優化,使得Dalvik具有高效、簡潔、節省資源的特點。從Android系統架構圖知,Dalvik虛擬機運行在Android的運行時庫層。
Dalvik虛擬機 依賴於底層Posix兼容的操作系統,它可以簡單的完成進程隔離和線程管理。它有着對內存的高效使用和在低速CPU上表現出的高性能。每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例, 其代碼在虛擬機的解釋下得以執行。
Dalvik作爲面向Linux、爲嵌入式操作系統設計的虛擬機,主要負責完成對象生命週期管理、堆棧管理、線程管理、安全和異常管理,以及垃圾回收等。Dalvik充分利用Linux進程管理的特定,對其進行了面向對象的設計,使得可以同時運行多個進程,而傳統的Java程序通常只能運行一個進程,這也是爲什麼Android不採用JVM的原因。Dalvik爲了達到優化的目的,底層的操作大多和系統內核相關,或者直接調用內核接口。另外,Dalvik早期並沒有JIT編譯器,直到Android2.2才加入了對JIT的技術支持。
Dalvik和標準Java虛擬機(JVM)之間的首要差別之一,就是Dalvik基於寄存器,而JVM基於棧。
Dalvik和Java之間的另外一大區別就是運行環境——Dalvik經過優化,允許在有限的內存中同時運行多個虛擬機的實例,並且每一個 Dalvik應用作爲一個獨立的Linux進程執行。
(1)虛擬機很小,使用的空間也小;
(2)Dalvik沒有JIT編譯器;
(3)常量池已被修改爲只使用32位的索引,以簡化解釋器;
(4)它使用自己的字節碼,而非Java字節碼。
描述方法:方法名、類型參數和返回值
格式如下:
一個例子
Lpackage/name/ObjectName;->MethodName(III)Z
Lpackage/name/ObjectName;:表示一個類型
MethodName:具體的方法名
(III)Z:方法的簽名部分,其中括號內的III爲方法的參數,在此爲三個整型參數,Z表示方法的返回類型爲boolean類型
method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
method:方法名
括號裏邊的爲方法參數,即
I:int
[[I:int[][]
Ljava/lang/String;:String
[Ljava/lang/Object;:Object[]
返回值:
Ljava/lang/String;:String
還原來就是:
String method(int ,int[][],int ,String,Object[])
arm架構
從源代碼到cpu的執行過程?
答.c等高級語言源代碼---------->.S彙編文件---------->.elf格式的二進制可執行程序---------->.bin格式的燒錄文件---------->CPU取址,譯碼,執行(流水線)
彙編語言的本質?
答:cpu機器指令集(機器碼)的助記符,是一款cpu的本質特徵。不同的cpu機器指令集設計不同,因此彙編指令不能在不同的cpu之間互相移植。也因此,理論上來說用機器指令集來操作cpu是效率最高的。但是現在沒人這麼寫代碼了,所以目前來說彙編指令能最大程度發揮硬件性能,之後才輪到c語言,再之後纔是上層語言比如c++,java,c#
ttps://blog.csdn.net/qq_35559358/article/details/79984935
https://www.cnblogs.com/xunbu7/p/8086091.html
原文:https://blog.csdn.net/doomvsjing/article/details/73695476
https://www.cnblogs.com/lao-liang/p/5111399.html
https://blog.csdn.net/itluochen/article/details/52262020
原文:https://blog.csdn.net/Kudou_Shinichi/article/details/79682575
來源: https://www.cnblogs.com/chen110xi/p/6612437.html
https://blog.csdn.net/weixin_39142112/article/details/80356244、
https://www.cnblogs.com/ouyangping/p/6366461.html
原文:https://blog.csdn.net/wangsfine/article/details/51205564
https://www.jianshu.com/p/8e8ed503d69b
https://www.cnblogs.com/gordon0918/p/5581597.html
https://blog.csdn.net/beyond702/article/details/50427640