如何分析Android程序

本文介绍如何使用apktool反编译apk文件,并分析其内部结构,包括smali和res目录的内容。同时,还提供了修改smali代码、重新编译及签名的方法,以及对比Java字节码与Dalvik字节码的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.反编译apk文件
     下载apktool
     执行apktool d[encode] [opts] <file.apk> [<dir>]
     如 apktool d test.apk outdir
2. 分析apk文件
        反编译apk后, 会在设定的outdir目录下生成相应文件, 其中smali目录存放了程序所有的反汇编源码
        res目录则是程序中所有的资源文件
        寻找突破口, 一般都是各种提示语, 这些提示语可能是硬编码到源码中,也可能是"res\valus\"目录下的strings.xml, apk打包时strings.xml中字符串被加密存储为resources.arc
        开发Android时, strings.xml中的所有字符串都在R.java文件的string类中被标识, 反编译后,所有的索引值保存在string.xml文件同目录下的public.xml中
3. 修改smali文件代码
4. 重新编译apk文件并签名
    使用apktool b[uild] [opts] [<app_path>] [<out_file>]
    编译后的文件是没有签名的, 需要使用signapk.jar对apk进行签名, signapk.jar是Android源码的一个签名工具, 代码位于Android源码下/build/tools/signapk/SignApk.java文件中,源码编译后可以在/out/host/linux-x86/framework中找到
    签名文件可以使用Android源码中提供的签名testkey.pk8和testkey.x509.pem,位于Android源码的build/target/product/security目录, 使用 java -jar "%~dp0testkey.x509.pem" "%~dp0testkey.pk8" %1signed.apk
5. Java字节码与dalvik字节码比较
    Hello.java
public class Hello{
    public int foo(int a, int b){
        return (a+b)*(a*b);
    }
}
javac Hello.java编译成Java字节码
使用dx --dex --output=Hekko.dex Hello.class生成dex文件, dx在Android/sdk/build-tools/27.0.3/ 文件夹里
javap -c -classpath . Hello查看Java字节码
    Compiled from "Hello.java"
public class Hello {
  public Hello();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public int foo(int, int);
    Code:
       0: iload_1
       1: iload_2
       2: iadd
       3: iload_1
       4: iload_2
       5: imul
       6: imul
       7: ireturn
}
使用dexdump -d Hello.dex查看dalvik字节码. dexdump位于:Android/sdk/build-tools/27.0.3/  文件夹下
Hello.foo:(II)I
0000: add-int v0, v3, v4 #将v3与v4的字节码相加保存到v0寄存器中, v3 v4代表函数的第一个参数与第二个参数
0002: mul-int v1, v3, v4 #v3减去v4的值保存到v1寄存器
0004: mul-int/2addr v0, v1  #v0乘以v1的值保存到v0寄存器中
0005: return v0  #返回v0的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值