Android逆向工程 初篇
Android逆向工程 初篇
本篇文章建立于有開發環境(jdk,android sdk)基礎之上,沒有環境的朋友自己去配。
什么是APK? </p>
什么是Dalvik?</p>
什么是Smali?</p>
什么是APK
APK的本質是一個zip的壓縮包,用壓縮軟件打開后就可以看到里面的文件以及結構。
assets/res:都是資源目錄,但是二者有區別。
1: Assets
不會再R.java文件里面生成相應的引索,Assets文件夾可以自己隨意創建文件夾,用AssetsManager類訪問,存放再此目錄下的文件都會被打包到Apk里面。
2: lib
so庫存放位置,一般由NDK編譯得到.
META-INF
存放工程的一下屬性文件,例如Manifest.MFMETA-INF
3: res
會在R.java文件生成相應的引索,軟件里面使用到的資源文件會在這里生成相對應的引索。res/raw和assets文件夾存不需要編譯的二進制文件,比如字體,聲音.在res文件夾里面可以定義一下目錄:
res/anim:存放動畫資源.
res/xml :存放xml文件,利用getResource().getXML()得到資源.
res/raw :該目錄下的文件可以直接復制到設備上,不能有子文件夾,編譯軟件時,這里的數據不需要編譯,直接加入到程序安裝包中,使用方法是getResource().OpenRawResources(ID),其中參數ID的形式是R.raw.XXX.
4: AndroidManifest.xml
Android工程的基礎配置屬性文件.
5: Classes.dex
Java代碼編譯得到的Dalvik VM能執行的文件
6: resources.arsc
里面就是一些資源文件的引索
什么是Dalvik(逆向的基礎)
Dalvik是Google專門為Android操作系統設計的一個虛擬機,經過深度優化. Dalvik有專屬的文件執行格式dex,而Jvm則執行的是Java字節碼. DalvikVM比JVM速度更快,占用控件少.通過Dalvik的字節碼我們不能直接看到原來的邏輯代碼,這時需要借助ApkTool或者dex2jar jd-gui工具來看java代碼.由于Apk在打包之前都會有混淆,所以,基本上很難看出來邏輯處理,除非很簡單的邏輯.
什么是Smali(主角,一般人是很難看懂它的語法的,很少人能堅持研究.
先給大家露給臉
上面是一個監聽點擊事件,點擊后關閉窗口并且調用一些方法做某些事情.
從上面可以看到函數聲明使用.method開始 .end method結束,
方法定義:
是不是很簡單???
Smali語法
.method 方法<br> .parameter 方法參數<br> .prologue 方法開始<br> .line 12 此方法位于第12行<br> invoke-super 調用父函數<br> const/high16 v0, 0x7fo3 把0x7fo3賦值給v0<br> invoke-direct 調用函數<br> return-void 函數返回void<br> .end method 函數結束<br> new-instance 創建實例<br> iput-object 對象賦值<br> iget-object 調用對象<br> invoke-static 調用靜態函數<br>if-eq vA, vB, :cond_** 如果vA等于vB則跳轉到:cond_**<br> if-ne vA, vB, :cond_** 如果vA不等于vB則跳轉到:cond_**<br> if-lt vA, vB, :cond_** 如果vA小于vB則跳轉到:cond_**<br> if-ge vA, vB, :cond_** 如果vA大于等于vB則跳轉到:cond_**<br> if-gt vA, vB, :cond_** 如果vA大于vB則跳轉到:cond_**<br> if-le vA, vB, :cond_** 如果vA小于等于vB則跳轉到:cond_**<br> if-eqz vA, :cond_** 如果vA等于0則跳轉到:cond_**<br> if-nez vA, :cond_** 如果vA不等于0則跳轉到:cond_**<br> if-ltz vA, :cond_** 如果vA小于0則跳轉到:cond_**<br> if-gez vA, :cond_** 如果vA大于等于0則跳轉到:cond_**<br> if-gtz vA, :cond_** 如果vA大于0則跳轉到:cond_**<br> if-lez vA, :cond_** 如果vA小于等于0則跳轉到:cond_**<br>繼續來點理論,后面會有實例
數據操作指令 [->寄存器賦值]
數據操作指令為move, move指令的原先為"move destination source",move指令更具字節碼大小與類型不同,后面會跟上不同的后綴.
返回指令
返回指令指的是函數結尾時運行的最后一條指令。它的基礎字節碼為teturn,共有以下四條返回指令:
實例
Demo
用的軟件是JEB2
博客地址:http://blog.csdn.net/QQ541159...
總結
以上是生活随笔為你收集整理的Android逆向工程 初篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maven实战(二)——POM重构之增还
- 下一篇: Mybatis中的collection、