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的值
如何分析Android程序
猜你喜欢
转载自blog.csdn.net/a90123/article/details/80712911
今日推荐
周排行