android反编译和防止反编译的方法和原理

1>静态解析修改安装包

A.反编译android安装包

众所周知Android安装包apk是一个将资源和执行文件打包的压缩文件,所谓反编译就是把别人的apk的源代码给反编译出来,让程序员可读。

step1:工具包下载

反编译用到的工具:

1.  apktool     --------获取图片等资源的工具包

官网下载网址:https://bitbucket.org/iBotPeaches/apktool/downloads/

2.  dex2jar     --------将apk中的classes.dex编译成jar的工具包

官网下载网址:http://sourceforge.net/projects/dex2jar/files/

3.  jd-gui       --------获取图片等资源的工具包

官网下载网址:http://jd.benow.ca/

到这里工具都下载好了(建议下载到同一个目录,解压到当前文件夹)。

step2:反编译步骤

拿一个打包好的apk,这里使用自己编写的demo app,把后缀名.apk改为.rar 或 .zip,然后步骤解压:   

把classes.dex(它就是java文件编译再通过dx工具打包而成的)复制到dex2jar-2.0的目录下:

Win+R打开DOS命令窗口输入cmd 回车再cd进入该文件的目录:

输入:d2j-dex2jar.bat    classes.dex    如果你是linux或mac系统的话就要用d2j-dex2jar.sh这个文件。 

   

没报错,说明你的路径没问题,经过这步骤你的dex2jar-2.0的目录下会多出一个这样的文件:

现在肯定看不了源码,这里就要用到了我们的代码查看器JD-GUI

上面是针对比较初级的JAVA代码的反编译,这种情况可以使用混淆的方式解决,并将敏感信息存放到服务器上面,针对更加敏感的数据和算法之类的可以存放到so包里面并对再运行时对签名进行验证等方式,增加对代码和敏感信息解析的难度。

B.IDA逆向Android的.so动态库文件

so文件是C/C++编写并编译生成的二进制文件,所以我们可以用反汇编分析工具IDA进行分析和修改。

.用IDA打开.so文件

目录为project\townsmen7_36\lib下对应指令集文件夹,选择ARM指令集处理器(以armeabi为例)

点击搜索菜单,搜索文本

输入"hasADs",勾选"查找全部出现处",点"ok"

搜索结果出现很多,唯一的iniNewProfile应该就是创建新存档时的接口(如果有Root权限也可以直接修改存档)

双击定位

再双击iniNewProfile定位到该函数的指令处

注意指令0x3EA114处,就是这里默认给新建档案写入hasAds=1(true)

切换到Hex-View,显示01 32,如图

右键"Edit"直接按数字键改为0,再右键"Apply Changes"保存,如图

修改处变色如图

切换回IDA View发现指令已经变成

.text:003EA114 ADDS R2, #0

注意:这里并不会直接修改文件本身,只是确定我们的修改是正确的

然后打开WinHex或者UE(UltraEdit),定位到003EA114,用相同的方法修改二进制数据

到此我们对so文件的解析和修改已经完成,多平台按照步骤修改armeabi-v7a和x86的.so动态库就可以了。

针对这种方式可以通过使用upx或者其他工具对so文件进行单次或多次加壳解决。

2>动态解析修改安装包

A.JAVA层代码动态修改

可以使用xposed进行动态劫持

###1.xposed是什么?
框架是一款开源框架,其功能是可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。Xposed 就好比是 Google 模块化手机的主体,只是一个框架的存在,在添加其他功能模块(Modules)之前,发挥不了什么作用,但是没了它也不行。也正因为如此,Xposed 具有比较高的可定制化程度。Moto X 用户可定制手机的外观、壁纸、开机动画等,Xposed 则允许用户自选模块对手机功能进行自定义扩充。

###2.xposed框架的使用
xposed的主要作用是hook应用方法,动态劫持方法的运行。xposed的使用需要xposed框架.apk和XposedBridgeApi-54.jar配合使用 。而xposed框架apk可以看成是个Xposed 框架的管理工具,在这里可以安装、更新Xposed 框架,也可以卸载Xposed 框架,查看安装日志。也可设置Xposed 框架安装器是否联网更新框架及模块。
xposed框架.apk需要root权限,所以需要一台root后的手机或者模拟器

###3.xposed插件开发和使用

通过上面我们解析安装包可以知道对应的包名和函数方法,这时候编写对应的插件进行劫持就可以了。

针对这种情况可以使用加固工具进行加固并对Xposed等工具进行检测来避免,或者将敏感信息存入so包中解决。

A..so文件动态调试

针对加壳的so文件,可以通过动态的dump内存信息来进行解析。

1、安装目标apk和把android_server(在IDA的dbgsrv目录下 )放到/data目录下,注意要给data和android_server文件赋予相应的权限: 
chmod 777 <文件名>

2、运行android_server: 
/data/android_server 

è¿éåå¾çæè¿°

3、打开新的控制台,打开adb端口转发: 
adb forward tcp:23946 tcp:23946

4、运行apk,打开IDA,选择Debugger - Attach - Remote ARMLinux/Android debugger

è¿éåå¾çæè¿°

点击OK,然后选择进程,可以用CTRL+F查找,完成后进入到调试界面

5、打开另一个IDA,把目标.so文件拖进去,找到要调试的函数的相对地址: 

è¿éåå¾çæè¿°

这里是0xF14。回到调试中的IDA,CTRL+S打开程序地址信息,搜索需要调试的.so文件:

è¿éåå¾çæè¿°

注意:有时候搜不到想调试的.so文件,可能是因为你没有触发到Java层的System.loadLibrary方法,.so文件没有被加载到内存,尝试下点击app页面的按钮。 
在这里,libhellojni.so的开始地址是0x610AA000,加上函数的相对地址0xF14,等于610AAF14。
6、按G键跳转至该地址,然后下断点: 

è¿éåå¾çæè¿°

接着按F9执行到这里,把以下脚本保存成dump.py,通过在file->Script File,选择dump.py。然后输入对应的起始地址,最后输入保存的文件C:\classes.dex。

针对上面的方法可以通过在so内部开发工具监听是否是dump行为来进行避免。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值