F's Blog

博客 收藏夹
逆向与反逆向Android APK文件

28 Mar 2014

二次打包

android-apktool能将apk里的资源文件解压出来,并将代码反编译成dalvik的机器语言。

它包括:

下载解压放到同一个目录里,就可以使用了。

它有decode和build功能,即解包和打包。如下使用:

apktool d [OPTS] file.apk [<dir>] # 将file.apk文件解包到dir里。

apktool b [OPTS] [<app_apth>] [<out_file>] # 将app的文件夹打包成到out_file。如果app_path空,则默认当前目录;如果out_file空,则<app_path>/dist/<name_of_original.apk>。

其它:

sed -i "s/oldString/newString/g" `grep oldString -rl /path`

重新签名

因为二次打包会抹掉签名信息,因此需要重新签名。

创建签名

利用标准的java工具keytool创建key,利用jarsigner工具使用生成的key来生成证书和给程序签名。

 keytool -genkey -alias demo.keystore -keyalg RSA -validity 20000 -keystore demo.keystore

keytool工具是Java JDK自带的证书工具,参数解释如下:

签名

使用生成的key对apk签名,运行如下命令:

jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demo.keystore

jarsigner是Java的签名工具,参数解释如下:

如果有pem和pk8文件,也可以直接使用:

signapk.jar platform.x509.pem platform.pk8 demo.apk demo_signed.apk

可以用下面命令查看是否签名成功:

jarsigner –verify demo.apk

签名后需要做对齐优化处理:

zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

反编译代码

dex2jar将Android apk里的dex文件转换成jar文件。

dex2jar.sh file.apk #就会在相同目录出来它的jar版

生成jar文件后,就可以用Java Decompiler来反编译成java源码了,这里用JD-GUI,直接打开jar文件即能看见源码。

下面软件下载:

反逆向

上面可知,在发布apk时,一定要做好反逆向,要不你的代码就是裸奔,其实保护一下就是多穿了件衣服,费些时间还是能看到里面的。

混淆

通过混淆,会让代码变得难读,类名、变量等都变成了字母表。

具体可参考官方文档

JNI

反编译这个就需要更进一步的工具和能力,这样就提高了门槛。

使用步骤:

Java调用C/C++通过上面步骤很容易就实现了,可如果需要在C/C++里面处理Java层的东西,就需要:

下面是一个简单调用Java类中静态方法的C++代码:

int JNICALL Java_com_example_name_Test_init
  (JNIEnv *env, jclass klass)
{
  jclass App = env->FindClass("com/example/name/App");
  jmethodID getContext_method_id = env->GetStaticMethodID(App, "getContext", "()Landroid/content/Context;");
  jobject context = env->CallStaticObjectMethod(App, getContext_method_id);

  return 1;
}

上面的代码在Java中就是执行App.getContext(),但在C++中,它不知道Java中的信息。因此要通过env变量也就是虚拟机环境找到类,类的方法id,然后再调用,很符合逻辑。

说明一下这里的方法签名和smali中的是一样的。

总结

apk是要把自己的安装包发布出去,不像web别人浏览到的只是网页。所有发布前要谨慎,尽可能保护自己的代码。

想保护代码,就要知道怎么逆向代码,要去逆向分析代码就得会写代码。

参考

本文由 付豪 创作,采用署名 4.0 国际(CC BY 4.0)创作共享协议进行许可,详细声明