apktools使用

1、apktools
apktool.jar apktool.bat
#apktool.bat d app.apk  //反編譯apk,在當前目錄生成app文件夾
可以修改res/ smali/文件,主要針對layout等xml

#apktool.bat b -o out/app1.apk //重新生成apk,沒有經過簽名

#系統簽名
java -jar signapk.jar platform.x509.pem platform.pk8 ppt1.apk SignApk/ppt1.apk


2、dex2jar-2.0、jd-gui-windows-1.4.0
#d2j-dex2jar.bat classes.dex //當前目錄生成classes-dex2jar.jar

jd-gui.exe 打開classes-dex2jar.jar


通過觀察classes-dex2jar.jar裏面某個class,對應apktool反編譯出來的smali,這時修改該smali文件,然後重新rebuild。
    setTextSize(15.0F)
    
    .line 134
    const/high16 v2, 0x41700000    # 15.0f

    invoke-virtual {v1, v2}, Landroid/widget/Button;->setTextSize(F)V
    


Bitmap bmp_old = BitmapFactory.decodeResource(getResources(), R.drawable.himi_old);
RectF rectf_old_two = new RectF(0, 50, bmp_old.getWidth() * 2, 120 + bmp_old.getHeight() * 2);
canvas.drawBitmap(bmp_old, null, rectf_old_two, paint);  

給定一個相同的資源ID,在不同的設備配置之下,查找到的可能是不同的資源。
這個查找過程對應用程序來說,是完全透明的,這個過程主要是靠Android資源管理框架來完成的,而Android資源管理框架實際是由AssetManager和Resources兩個類來實現的。其中,Resources類可以根據ID來查找資源,而AssetManager類根據文件名來查找資源。事實上,如果一個資源ID對應的是一個文件,那麼Resources類是先根據ID來找到資源文件名稱,然後再將該文件名稱交給AssetManager類來打開對應的文件的。

Resources.arsc://decodeResourcesFull
而Resources.arsc這個文件是存放在APK包中的,他是由AAPT工具在打包過程中生成的,他本身是一個資源的索引表,裏面維護者資源ID、Name、Path或者Value的對應關係,AssetManager通過這個索引表,就可以通過資源的ID找到這個資源對應的文件或者數據。
可以看到每個資源文件在R中都是一個class,每個資源項名稱都分配了一個id,id值是一個四字節無符號整數,格式是這樣的:0xpptteeee,(p代表的是package,t代表的是type,e代表的是entry),最高字節代表Package ID,次高字節代表Type ID,後面兩個字節代表Entry ID。

根據資源的id值定位resources.arsc中的數據:
aapt d resources XXX.apk

resource <Resource ID> <Package Name>:<Type>/<Name>: t=<DataType> d=<Data> (s=<Size> r=<Res0>) 
Resource ID R.java中的資源ID 
Package Name 資源所在的的包 
Type 資源的類型 
Name 資源名稱 
DataType 數據類型,按照以下枚舉類型取值 
Data 資源的值,根據dataType進行解釋 
Size 一直爲0x0008 
Res0 固定爲0x00

classes.dex //decodeSourcesSmali
與Resources.arsc類似,有methods,field等

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章