安卓程序逆向与防护
创始人
2024-03-12 23:06:08
0

安卓程序逆向与防护

  • 实际用处
  • 代码打包生成apk的步骤
  • 程序基础逆向步骤
  • 程序基础防御
    • 代码混淆
    • 针对逆向工具的防御手段
      • Proguard
    • SO文件
    • 防止二次打包
  • 程序进阶逆向攻击
  • 实战练习逆向简易安卓程序

实际用处

1.当想要获得一款前后端分离的安卓程序的数据时,一般会考虑抓包后端传来的数据包,如果这个数据包的数据经过了加密,就不能直接获取我们想要的数据,一个经过加密的数据包将会在客户端解密,我们通过逆向安卓apk的方法获取解密的代码从而获取解密的数据(关于app的爬虫
2.当想要改变一个app中一段程序执行的代码,或者想要改变apk的美术资源时,可以逆向apk获取整个程序并修改对应代码段或者修改ui图片,最后重新打包即可(关于游戏外挂

代码打包生成apk的步骤

1.编译器将我们自己的Android工程下的源码文件、资源文件、aidl文件 和 依赖的module库文件、AAR库、jar库进行编译,所有源码编译后输出DEX文件,所有其他内容转换为已编译资源。
2.打包器将DEX文件和已编译资源文件合并成单个的apk
3.打包器对apk进行签名。如果是调试版本的apk用debug keystore进行签名,如果是release版本的apk用release keystore进行签名。
4.在生成最终的apk之前,使用zipalign工具对apk进行优化,减少在设备上运行时占用的内存。

程序基础逆向步骤

根据刚才的apk生成步骤逆序反推得到了获取源码的步骤
1.通过apktool将apk解包得到DEX和已编译文件
2.通过dex2jar将DEX文件逆向为jar包
3.通过jd-gui查看源码

程序基础防御

根据刚刚的步骤可以逆向出一个简单的apk的源码,那如何防御?下面给出基础防御的操作

代码混淆

将程序代码中的变量以及执行改变进行代码混淆,平时开发时,变量的命名一般遵循规律能看的出来变量的用途,通过改变变量的名字从而无法看出变量的用途。
将程序的执行步骤改变,就是等价的将代码段换成另一种难以理解的代码段,如将迭代换成递归(比如for换成递归)
代码混淆并没有加大逆向的难度,只是加大了源码阅读理解的难度,是一种比较基础的防御手段

针对逆向工具的防御手段

程序的代码段集中在DEX文件中,逆向工具都是基于DEX文件对程序进行逆向,如果不想DEX被逆向,则可以对DEX文件进行加密混淆,从而使得一些工具崩溃。

Proguard

Proguard 是混淆经常使用的工具,他的混淆原则如下反射用到的类不混淆JNI方法不混淆AndroidMainfest中的类不混淆,四大组件和Application的子类和Framework层下所有的类默认不会进行混淆Parcelable的子类和Creator静态成员变量不混淆,否则会产生android.os.BadParcelableException异常使用GSON、fastjson等框架时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象使用第三方开源库或者引用其他第三方的SDK包时,需要在混淆文件中加入对应的混淆规则有用到WebView的JS调用时,也需要保证写的接口方法不混淆

SO文件

java/kotlin都是基于jvm虚拟机的编程语言,逆向java和kotlin代码的难度并不高,如果想要提高代码文件的安全性,可以考虑将重要代码写在native层(C/C++编写),由于对c与c++代码进行逆向获得的都是汇编代码,难以阅读,从而提高了程序的安全性

防止二次打包

由于逆向的目的在于解包->修改->打包,所以可以通过防止二次打包的办法来使得最后一步无法完成,提高程序的安全性
二次打包,又称为重打包,一般是在使用逆向工具APKTool等工具逆向修改后,进行APK文件重新生成的过程,被重新打包的apk应用文件,因为与之前的应用程序高度相似,市面上称为山寨货盗版APP。

在android系统操作系统中apk的唯一识别码是靠包名和签名来做鉴别的,包名和签名是绑定在一起的,一旦apk被反编译后签名自动消失,apk签名需要签名文件,签名文件是md5值基本上是无法伪造成一致的,Android要求安装到手机上的apk文件必须有签名,而理论上开发者的签名他人是无法得到的(有密码),所以比较容易想到的就是执行签名校验,验证本程序的签名是否为合法程序。

目前市面上的很多应用商店也是通过开发者提供的包名与签名做正版判断,所以我们需要对自己的程序apk防止二次打包,也就是在自己的应用程序内部加入代码验证自我的签名与包名是否被篡改,如果被篡改了,那么肯定是被二次打包了。

程序进阶逆向攻击

上述逆向攻击都是基于解包->修改->打包的逻辑进行的,而实际上由于目前程序本身代码量大且防逆向手段越发成熟,我们可以考虑通过挂钩子的方式修改程序,进行一些非法的操作,使用Xpose可以准确hook从而做到劫持登录等操作.

实战练习逆向简易安卓程序

(题目为buuctf的Reverse的简单注册器题目)
链接 https://buuoj.cn/challenges
首先拿到了apk之后我们先解包,解包后文件如下
在这里插入图片描述
接下来对dex文件解包
将dex文件放置在dex2jar文件夹运行命令行d2j-dex2jar.bat classes.dex 得到下图文件
在这里插入图片描述
接下来我们使用jeb查看jar包源码得到下图
在这里插入图片描述

明显有对flag进行混淆,我们通过一段简单的python脚本即可还原flag
在这里插入图片描述

flag为flag{59acc538825054c7de4b26440c0999dd}
在这里插入图片描述
过啦
在这里插入图片描述

作者:刘威
原文链接:http://t.csdn.cn/lqYLO

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...