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等

    

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