如何分析Android程序

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的值

猜你喜欢

转载自blog.csdn.net/a90123/article/details/80712911