android軟件破解的工具:
smali.jar——google官方提供,主要作用是把smali文件打包成class.dex文件
baksmali.jar——google官方提供,主要作用是把*.odex文件反編譯為smali文件
apktool.jar——第三方提供?用于解析*.apk文件,生成smali文件和解析資源文件
signapk.jar——apk簽名工具
ddms——ADT中的一個調(diào)試工具
破解工具的使用方法:
http://sin90lzc.iteye.com/blog/1198173
除了這些破解工具之外,還需要對smali語法有一定的了解。下面的網(wǎng)址對smali的語法有詳細的說明:
http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
最后,最好對Android的應(yīng)用開發(fā)有一定的了解,至少對Android的四大組件有深刻的認識:Activity,Service,ContentProvider,BroadcastReceiver
Android應(yīng)用程序在某些機器上不能運行、崩潰的原因不外乎以下幾點:
原因一:該應(yīng)用程序需要依賴于生產(chǎn)廠商的框架(像三星,它對android的framework做過大量的修改)
錯誤提示:找不到field,找不到對應(yīng)的方法,找不到相應(yīng)的類
解決途徑:
1.在smali中嘗試屏蔽掉相應(yīng)的field,method,或類的調(diào)用,然后進行大量測試,確保不影響正常使用
2.反編譯framework,找到缺少的field,method,類的相應(yīng)smali文件,根據(jù)smali文件編寫java源碼。(當smali文件比較小的時候,這個方法才可行,否則盡量避免用這種方法)
3.實在無招的情況下,只能把第三方的framework的smali文件復(fù)制到自己的framework里面(非常槽糕的方法)。
4.對于應(yīng)用程序需要依賴第三方低層的功能實現(xiàn)時,而我們的低層卻沒有這樣的功能(比如說視頻通話等),此時可以使用上面的方法一解決,也可以參考技術(shù)四。
原因二:資源文件不存在,像color,drawable,string等等的資源
錯誤提示:資源文件找不到
解決途徑:
在技巧一中有詳細說明。
原因三:應(yīng)用程序需要一些函數(shù)庫的支持(在目錄/system/lib中缺少相應(yīng)的函數(shù)庫)。
錯誤提示:一般都會拋出UnSatisfiedException異常,后面緊跟所缺函數(shù)庫的庫名。
解決途徑:
1.在第三方的函數(shù)庫中找到對應(yīng)的so文件,然后復(fù)制到自己的函數(shù)庫中。
2.如果函數(shù)庫與函數(shù)庫之間有著各種耦合的時候,方法一可能就會不適用了(看運氣唄)。這時候就只能反編譯so文件了(這個是C/C++的反編譯的應(yīng)用了,需要再學(xué)習(xí))
原因四:應(yīng)用程序沒有相應(yīng)的權(quán)限
錯誤提示:nopermission
解決途徑:
1.在AndroidMenifest.xml文件中添加<user-permision />添加相應(yīng)的權(quán)限
原因五:由于應(yīng)用程序本身的一些安全機制或條件判斷影響程序的表現(xiàn)
解決途徑:
1.反編譯成smali文件,使用技巧三的方法跟蹤程序的運行,耐心地分析程序的邏輯,找到可疑smali代碼,屏蔽或修改代碼。
原因六:數(shù)據(jù)庫的結(jié)構(gòu)不一樣
錯誤提示:缺少某個字段或類型不匹配
場情:比如android的音樂播放器與三星的音樂播放器,它們的數(shù)據(jù)庫結(jié)構(gòu)由MediaProvider.apk這個包提供。然而兩者在MediaProvider.apk中關(guān)于數(shù)據(jù)庫結(jié)構(gòu)的定義是不一樣的,三星音樂播放器需要更多的字段去保存信息。
解決途徑:
1.拿上面場情為例,反編譯MediaProvider.apk,從smali文件中找到組件ContentProvider的定義(smali文件), 在該smali文件中找到關(guān)于SQL生成表結(jié)構(gòu)的字符串(如:create table...),修改該SQL語句來適合三星音樂播放器的需要,然后重新打包回apk文件。
原因七:應(yīng)用程序需要引用第三方提供商自定義的框架(比如,三星的/system/framework目錄下有twframework.jar、twframework-res.apk,這個就是三星的UI框架)
錯誤提示:
解決途徑:
1.屏蔽AndroidMenifest.xml文件中<uses-library android:name="sec_feature" />的代碼,一般這樣改動是不可行的。
2.在/system/etc/permission目錄下添加庫的聲明,如添加touchwiz.xml文件,文件內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<library name="touchwiz" file="/system/framework/twframework.jar"/>
</permissions>
最后,還需要把三星的twframework.jar、twframework-res.apk復(fù)制到/system/framework目錄下
反編譯或破解的技巧總結(jié):
一、對無應(yīng)用程序源碼的情況下,對資源文件的增刪改。
概述:在無程序源碼,不重新編譯的情況下,刪除或修改資源文件都是非常簡單的一件事情,網(wǎng)上也有很多的文章提到過。但是網(wǎng)上卻找不到在不重新編譯的情況下添加資源文件的方法。
在不重新編譯的情況下添加資源文件的步驟:
1.按正常的應(yīng)用程序開發(fā)添加資源。比如,要添加一個string資源,在values/strings.xml上加上:
<string name="newstring">content</string>
2.一個編譯后的apk會在values目錄下多生成了一個public.xml文件,這個文件記錄了每個資源的引用編號。以添加string資源為例, 在public.xml文件中找到<public type="string" ...>中最后一個元素,在這個元素后添加
<public type="string" name="newstring" id="0x7f0700a0" /><!--此時id就是string資源newstring的引用編號,注意該id應(yīng)該是public.xml文件中是唯一值-->
3.修改smali文件,使用新增的資源
invoke-virtual {p0}, Lcom/sini/SfsdfsActivity;->getResources()Landroid/content/res/Resources;
move-result-object v0
const v1, 0x7f0700a0
invoke-virtual {v0, v1}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;
二、編寫smali文件
概述:自己一手一腳去寫smali文件是件超級困難的事情,如何快速地得到smali代碼呢?
技巧:使用eclipse開發(fā)工具,新建一個Android項目,用正常的開發(fā)方式寫一段java代碼(這個代碼就是你想在smali中完成的東西)。使 用eclipse的run->Android Application選項 生成apk文件,再把apk文件反編譯,找到需要的smali代碼,然后復(fù)制這段代碼到需要的地方。NOTIC:復(fù)制的時候需要注意smali的變量 v0,v1...的正確性。
三、跟蹤程序運行
概述:沒源碼=寸步難行!為了能跟蹤無源碼的apk程序的運行,只能辛苦地修改smali添加跟蹤信息了。值得慶幸的是,android本身自帶有方便的日志API(Log.i()\Log.w()...);
技巧:按技巧二的方法得到Log.i()的smali代碼,然后把這段代碼插入到你想跟蹤信息的地方。
四、只修改smali中影響UI的代碼,保留功能代碼(適用于必須得把smali寫回java源碼的情況)
概述:這里最好的例子就是破解三星的通話界面。三星的通話界面程序Phone.apk中包含了視頻通話的功能,這個功能又需要依賴三星的一些低層實現(xiàn)。而 我們的系統(tǒng)中沒有視頻通話的功能,也沒有相應(yīng)的低層實現(xiàn)。但Phone.apk的主要功能是打電話,而這個功能android本身就自帶的。也就是說三星 的Phone.apk與android的Phone.apk的核心功能是一樣的,只是UI不太一樣而已。此時應(yīng)該只修改smali中的影響UI的代碼,屏 蔽掉
smali中對視頻通話的調(diào)用。
技巧:找到程序中影響UI的Actvity,然后根據(jù)smali文件的內(nèi)容,寫java源碼