安卓程序逆向与防护

实际用处

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}
在这里插入图片描述
过啦
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值