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