反編譯android
㈠ Android/Linux so動態庫分析和反編譯
Android/Linux so動態庫分析和反編譯的答案如下:
一、so動態庫文件頭分析
本質與查看方法:
- so動態庫文件的本質是ELF文件。
- 可以通過將armeabiv7a類型的so動態庫文件放置於Linux系統路徑中,然後在Linux終端進入文件目錄,執行readelf h xxxx.so命令來查看文件頭部信息。
文件頭部信息詳解:
- Magic/e_ident[]:用於標識ELF目標文件。
- Class:標記文件類型為32位ELF格式。
- Data:指示數據組織格式,如小端格式。
- Version:當前文件頭版本號,通常為1。
- OS/ABI:描述操作系統類。
- ABI Version:ABI版本號,通常為0。
- Type/e_type:指明文件類型,這里是共享庫。
- Machine/e_machine:顯示機器平台類型,如ARM類型。
- Entry point address/e_entry:表示程序入口地址。
- Stars of program headers/e_phoff:記錄程序頭表文件偏移。
- Stars of section headers/e_shoff:記錄節區頭文件偏移。
- Flags/e_flags:處理器相關標識。
- Size of this header/e_ehsize:表示ELF頭文件大小。
- Number of program headers/e_phnum:表示程序頭表條目數量。
- Size of section headers/shentsize:表示節區頭表條目大小。
- Number of section headers/e_shnum:為節區頭表條目數量。
- 節區頭字元表索引/e_shstrndx:其他相關信息。
二、反編譯so動態庫方法
使用IDA軟體:
- 解壓IDA安裝包,並按照ReadMe文檔進行安裝,注意避免中文路徑。
- 安裝完成後,打開IDA軟體,點擊「GO」按鈕。
- 拖拽so動態庫文件至工作區,點擊「OK」按鈕等待反編譯完成。
反編譯後查看內容:
- 反編譯後,工作區會顯示包含機器碼的Hex View1窗口、匯編代碼的IDA ViewA窗口以及保存函數名的Function window窗口。
- 可以通過雙擊函數名定位到對應函數的匯編代碼。
- 使用Ctrl+F搜索特定函數名,雙擊函數名查看匯編代碼。
- 按下F5鍵,可以將匯編代碼轉換為C代碼進行查看。
以上就是對Android/Linux so動態庫進行文件頭分析和反編譯的詳細步驟和方法。
㈡ Android反編譯(三)— 手動編譯
PS: 最近沒工作,沒工作就沒需求,沒需求就沒什麼技術總結的靈感,那就沒更新什麼。但是兩個月不更新了,要是三個月不更新就會出大事,所以這次打算做一件有意思又不難的事。
之前有發文章寫過反編譯,今天就來試試反編譯之正編譯,開玩笑的,就是試試手動編譯的過程, 平時我們在項目中編譯出包都是使用Gradle直接執行assemble任務就能解決,我打算試試手動模擬整個過程。當然我也是第一次這樣搞,所以如果有寫得不對的地方,還望指出。
眾所周知,apk實質上就是一個壓縮包。復習一下,我們寫個最簡單的Demo,然後打包,然解壓,注意是解壓,不是反編譯,意義是不同的。
注意我這個Demo很簡單,什麼都不引入
然後我們看看整個出包的過程,隨便從網上拿張圖
然後這里我們用Android SDK給我們提供的工具來完成整個流程,工具在sdk文件夾下的build-tools文件夾下,有什麼aapt.exe、dx.bat,用的就是這些
這步應該是整個流程最簡單的吧,我感覺,所以從最簡單的開始。
我們先看看生成的dex有什麼
對比項目,我是一開始最基本的項目,什麼都沒動,所以只有一個MainActivity.clas,所以這里肯定是要先想辦法得到BuildConfig.class和R.class。
輸入命令:
aapt p -f -m -J <輸出路徑> -S <res路徑> -I <android.jar路徑> -M <Manifest路徑>
下一步,我們需要BuildConfig.class
這個BuildConfig.java是由gradle在我們配置好gradle之後自己幫我們生成的,所以我們直接拿來用,然後再javac就得到class文件了
然後我們再編譯我們的MainActivity.java並將它們放到同一個文件夾下, MainActivity因為引用了Android.jar和R文件,所以編譯時注意點,我為此被動好好的復習了一遍javac,都是淚
最後一步,我們用dx工具就能打出dex文件了
然後執行命令就得到一個Dex文件,看看這個文件裡面和上面直接打出的apk中的Dex文件有什麼不同:
看圖,我們上一步已經生成.dex了,那麼我們需要和compiled Resource 還有 Other Resource 一起生成APK。
我們先來生成compiled Resource,也就是resources.arsc
發現之前使用aapt生成R文件的時候沒寫完整,當時可以加一個-F參數直接生成arsc和Manifest
導出的abc.zip裡面就有resources.arsc和AndroidManifest.xml。
因為之前寫漏了,所以肯定要重新編一次MainActivity.java和Dex
我們把剛才的dex文件和aapt生成的resources.arsc、AndroidManifest.xml和res放到一個文件夾裡面。
PS:res文件夾也是上面aapt的命令生成的
然後我們對比這個文件夾和之前apk解壓的文件夾
最後運行
看來是成功了。
再說說遇到的還有兩個問題,並說下我解決問題的思路
(1)我把它們都放到一個文件夾之後,我壓縮成壓縮包,然後改後綴成.apk,然後發現安裝不了,我就直接反編譯,發現發編譯失敗,提示包有問題,以我多點玩包的經驗,我感覺就是壓縮工具出了問題,然後我去下個「好壓」(這不是廣告啊),然後就能正常反編譯了。
(2)但是還是安裝不了,再根據我多年的玩包經驗,我感覺是簽名問題,然後我隨便給這個包上一個簽名,就能正常安裝得到上圖的結果了。
總體來說,還真挺好玩的,這整個過程,就是翻車了幾次。做完之後感覺非常牛逼,為什麼這樣說,因為我知道這整個過程,我就可以做到,我不經過gradle來打包,我自己寫個python腳本來調用aapt和dx來打包也是能做到的。
當然上面純屬異想天開,因為這是個什麼都沒有的Demo所以覺得簡單,要是一個真實的項目,我感覺肯定要有很多坑,別的先不說,一個項目那麼多依賴關系,我這javac要搞死人。
最後如果有不對的地方,希望有大佬能夠指出,畢竟能運行也不能證明完全沒問題。然後我使用的build-tools是28的,不敢保證其它版本包括以後版本的玩法都一樣。
㈢ 濡備綍鍙嶇紪璇慳ndroid搴旂敤騫墮噸鏂版墦鍖
涓.鐪媋ndroid鐨勬簮浠g爜
銆銆1)灝咥pkd.apk 鐢▃ip瑙e帇鍚庯紝鍑虹幇浜嗕竴涓猚lasses.dex鏂囦歡
銆銆2014/02/19 19:42
銆銆.
銆銆2014/02/19 19:42
銆銆..
銆銆2014/02/19 15:35 1,656 AndroidManifest.xml
銆銆2014/02/19 15:35 687,024 classes.dex
銆銆2014/02/19 15:49
銆銆META-INF
銆銆2014/02/19 15:49
銆銆res
銆銆2014/02/19 15:35 2,200 resources.arsc
銆銆2)榪涘叆鍒癲ex2jar鐩褰曚腑錛岃繍琛屾儏鍐靛備笅錛
銆銆D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d
銆銆ex"
銆銆this cmd is deprecated, use the d2j-dex2jar if possible
銆銆dex2jar version: translator-0.0.9.15
銆銆dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar
銆銆Done.
銆銆鍦╝pk鎵鍦ㄧ殑鐩褰曚細鍑虹幇 classes_dex2jar.jar 鏂囦歡銆
銆銆3) 鐢↗D-GUI瀵筳ar鍖呰繘琛屾煡鐪嬶紝鍙浠ユ煡鐪嬫簮鏂囦歡
銆銆浜.鍙嶇紪璇慳pk
銆銆1.鍦ㄣ涓嬭澆銆APKTOOL涓鐨勪笁涓鏂囦歡錛坅apt.exe銆乤pktool.bat銆乤pktool.jar錛夎В鍘嬬緝鍒頒綘鐨刉indows瀹夎呯洰褰曚笅錛屼互鏂逛究浣跨敤Dos鍛戒護.
銆銆2012/12/06 11:44 854,016 aapt.exe
銆銆2014/02/19 17:15 277,372 Apkd.apk銆//紺轟緥鐢ㄣapk鏂囦歡
銆銆2012/12/23 23:39 92 apktool.bat
銆銆2013/02/03 02:37 2,655,843 apktool.jar
銆銆2.榪涘叆鍒癮pktool.bat鎵鍦ㄧ殑鐩褰曪紝榪愯岋細
銆銆apktool d Apkd.apk decode_dir
銆銆鍙嶇紪璇戝悗,decode_dir鐩褰曚笅鐨勫唴瀹瑰備笅錛
銆銆2014/02/19 17:16 716 AndroidManifest.xml
銆銆2014/02/19 17:16 237 apktool.yml
銆銆2014/02/19 17:18
銆銆build
銆銆2014/02/19 17:16
銆銆res
銆銆2014/02/19 17:16
銆銆smali
銆銆姝ゆ椂鎴戝彲浠ユ煡鐪嬪師鏂囦歡AndroidManifest.xml浜嗭紝涔熸槸鏌ョ湅smali婧愭枃浠訛紙鏄鐢╯mali璇璦鍐欑殑錛屽彲浠ュ圭収java鐪嬶級銆
銆銆涓.APKTOOL鐨勪嬌鐢
銆銆1).decode
銆銆璇ュ懡浠ょ敤浜庤繘琛屽弽緙栬瘧apk鏂囦歡錛屼竴鑸鐢ㄦ硶涓
銆銆apktool d
銆銆浠h〃浜嗚佸弽緙栬瘧鐨刟pk鏂囦歡鐨勮礬寰勶紝鏈濂藉啓緇濆硅礬寰勶紝姣斿侰:\MusicPlayer.apk
銆銆浠h〃浜嗗弽緙栬瘧鍚庣殑鏂囦歡鐨勫瓨鍌ㄤ綅緗錛屾瘮濡侰:\MusicPlayer
銆銆濡傛灉浣犵粰瀹氱殑宸茬粡瀛樺湪錛岄偅涔堣緭鍏ュ畬璇ュ懡浠ゅ悗浼氭彁紺轟綘錛屽苟涓旀棤娉曟墽琛岋紝闇瑕佷綘閲嶆柊淇鏀瑰懡浠ゅ姞鍏-f鎸囦護
銆銆apktool d 鈥揻
銆銆榪欐牱灝變細寮鴻岃嗙洊宸茬粡瀛樺湪鐨勬枃浠
銆銆2).build
銆銆璇ュ懡浠ょ敤浜庣紪璇戜慨鏀瑰ソ鐨勬枃浠訛紝涓鑸鐢ㄦ硶涓
銆銆apktool b
銆銆榪欓噷鐨
銆銆灝辨槸鍒氭墠浣犲弽緙栬瘧鏃惰緭鍏ョ殑
銆銆錛堝侰:\MusicPlayer錛,杈撳叆榪欒屽懡浠ゅ悗錛屽傛灉涓鍒囨e父錛屼綘浼氬彂鐜癈:\MusicPlayer鍐呭氫簡2涓鏂囦歡澶筨uild鍜宒ist錛屽叾涓鍒嗗埆瀛樺偍鐫緙栬瘧榪囩▼涓閫愪釜緙栬瘧鐨勬枃浠朵互鍙婃渶緇堟墦鍖呯殑apk鏂囦歡銆
銆銆3).install-framework
銆銆璇ュ懡浠ょ敤浜庝負APKTool瀹夎呯壒瀹氱殑framework-res.apk鏂囦歡錛屼互鏂逛究榪涜屽弽緙栬瘧涓浜涗笌ROM鐩鎬簰渚濊禆鐨凙PK鏂囦歡銆傚叿浣撴儏鍐佃風湅甯歌侀棶棰
銆銆鍥.smali涓巎ava婧愮爜瀵圭収錛屽苟鍋氬嚭鐩稿簲鐨勪慨鏀
銆銆java婧愪唬鐮侊細
銆銆import android.os.Bundle;
銆銆import android.app.Activity;
銆銆import android.view.Menu;
銆銆import android.widget.*;
銆銆public class MainActivity extends Activity {
銆銆@Override
銆銆protected void onCreate(Bundle savedInstanceState) {
銆銆super.onCreate(savedInstanceState);
銆銆setContentView(R.layout.activity_main);
銆銆TextView a = (TextView)this.findViewById(R.id.test) ;
銆銆a.setText("raoliang");
銆銆}
銆銆@Override
銆銆public boolean onCreateOptionsMenu(Menu menu) {
銆銆// Inflate the menu; this adds items to the action bar if it is present.
銆銆getMenuInflater().inflate(R.menu.main, menu);
銆銆return true;
銆銆}
銆銆}
銆銆瀵瑰簲鐨剆mali婧愪唬鐮侊細
銆銆.class public Lali/text/apkd/MainActivity;
銆銆.super Landroid/app/Activity;
銆銆.source "MainActivity.java"
銆銆# direct methods
銆銆.method public constructor ()V
銆銆.locals 0
銆銆.prologue
銆銆.line 8
銆銆invoke-direct {p0}, Landroid/app/Activity;->()V
銆銆return-void
銆銆.end method
銆銆# virtual methods
銆銆.method protected onCreate(Landroid/os/Bundle;)V
銆銆.locals 2
銆銆.parameter "savedInstanceState"
銆銆.prologue
銆銆.line 12
銆銆invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
銆銆.line 13
銆銆const/high16 v1, 0x7f03
銆銆invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V
銆銆.line 14
銆銆const/high16 v1, 0x7f08
銆銆invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View;
銆銆move-result-object v0
銆銆check-cast v0, Landroid/widget/TextView;
銆銆.line 15
銆銆.local v0, a:Landroid/widget/TextView;
銆銆const-string v1, "raoliang"
銆銆invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
銆銆.line 16
銆銆return-void
銆銆.end method
銆銆.method public onCreateOptionsMenu(Landroid/view/Menu;)Z
銆銆.locals 2
銆銆.parameter "menu"
銆銆.prologue
銆銆.line 21
銆銆invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;
銆銆move-result-object v0
銆銆const/high16 v1, 0x7f07
銆銆invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V
銆銆.line 22
銆銆const/4 v0, 0x1
銆銆return v0
銆銆.end method
銆銆閫氳繃瀵規瘮鍙浠ョ湅鍒幫紝甯擱噺鏄娌℃湁蹇呭彉鐨勶紝鍙浠ユ牴鎹鐨剆mali鐨勮娉曪紝榪涜岀浉搴旂殑淇鏀
銆銆浜.3銆佹墦鍖呫佺懼悕鍜屽畨瑁呬慨鏀瑰悗鐨刟pk
銆銆淇鏀瑰畬浜嗭紝灝卞彲浠ユ墦鍖呭洖apk浜嗐傛墽琛屼互涓嬪懡浠わ細
銆銆apktool b decode_dir
銆銆鍦╩ygame鐩褰曚笅鐨刣ist鍦ㄤ細鐪嬪埌鎵撳寘濂界殑apk銆
銆銆褰撶劧錛岀幇鍦ㄤ竴鑸鏄鏃犳硶瀹夎呯殑錛屽洜涓篴pk榪樻病鏈夌懼悕銆備笅闈㈠氨鏉ョ懼悕銆傜懼悕闇瑕乲eystore鏂囦歡錛屾垜宸茬粡鏈変笓鐢ㄧ殑keystore浜嗭紝濡傛灉榪樻病鏈夛紝璇峰弬闃呰繖閲岃繘琛岀敓鎴愩
銆銆鎵ц屼互涓嬪懡浠や負閲嶆柊緙栬瘧鐨刴y_game.apk絳懼悕錛
銆銆jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
銆銆鏈鍚庯紝鍦ㄥ畨瑁呭埌鎵嬫満鍓嶏紝闇瑕佹妸鎵嬫満涓鐨勫凡鏈夌増鏈鍏堝嵏杞斤紝鍥犱負濡傛灉絳懼悕涓嶅悓錛屾槸涓嶈兘瑕嗙洊瀹夎呯殑錛屼細鎻愮ず鈥滃簲鐢ㄧ▼搴忔湭瀹夎呪濋敊璇銆
銆銆瀹屾暣鐨勮繍琛屾儏鍐靛備笅錛
銆銆D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
銆銆杈撳叆keystore瀵嗙爜錛
銆銆鍐嶆¤緭鍏ユ柊瀵嗙爜:
銆銆鎮ㄧ殑鍚嶅瓧涓庡撴皬鏄浠涔堬紵
銆銆[Unknown]錛 rao
銆銆鎮ㄧ殑緇勭粐鍗曚綅鍚嶇О鏄浠涔堬紵
銆銆[Unknown]錛 rao
銆銆鎮ㄧ殑緇勭粐鍚嶇О鏄浠涔堬紵
銆銆[Unknown]錛
銆銆鎮ㄦ墍鍦ㄧ殑鍩庡競鎴栧尯鍩熷悕縐版槸浠涔堬紵
銆銆[Unknown]錛
銆銆鎮ㄦ墍鍦ㄧ殑宸炴垨鐪佷喚鍚嶇О鏄浠涔堬紵
銆銆[Unknown]錛
銆銆璇ュ崟浣嶇殑涓ゅ瓧姣嶅浗瀹朵唬鐮佹槸浠涔
銆銆[Unknown]錛
銆銆CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 姝g『鍚楋紵
銆銆[鍚]錛 y
銆銆杈撳叆鐨勪富瀵嗙爜
銆銆錛堝傛灉鍜 keystore 瀵嗙爜鐩稿悓錛屾寜鍥炶濺錛夛細
銆銆D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
銆銆杈撳叆瀵嗛掗搴撶殑鍙d護鐭璇錛
銆銆姝e湪娣誨姞錛 META-INF/MANIFEST.MF
銆銆姝e湪娣誨姞錛 META-INF/DEMO_KEY.SF
銆銆姝e湪娣誨姞錛 META-INF/DEMO_KEY.RSA
銆銆姝e湪絳懼悕錛 res/drawable-hdpi/ic_launcher.png
銆銆姝e湪絳懼悕錛 res/drawable-mdpi/ic_launcher.png
銆銆姝e湪絳懼悕錛 res/drawable-xhdpi/ic_launcher.png
銆銆姝e湪絳懼悕錛 res/drawable-xxhdpi/ic_launcher.png
銆銆姝e湪絳懼悕錛 res/layout/activity_main.xml
銆銆姝e湪絳懼悕錛 res/menu/main.xml
銆銆姝e湪絳懼悕錛 AndroidManifest.xml
銆銆姝e湪絳懼悕錛 classes.dex
銆銆姝e湪絳懼悕錛 resources.arsc
銆銆D:\developer\tools\test_apk\new\decode\dist>
銆銆鍒版や負姝錛屼慨鏀瑰悗鐨刟pk鍙浠ユe父鐨勫畨瑁呬簡錛屼笉榪囷紝鍦ㄥ畨瑁呬箣鍓嶏紝蹇呴』瑕佸厛鍗歌澆浠ュ墠鐨刟pk錛屼笉鑳界洿鎺ユ浛鎹錛堝洜涓虹懼悕涓嶄竴鏍鳳級