文档章节

android app安全初入门(一)

季牧云
 季牧云
发布于 2015/10/22 16:00
字数 2105
阅读 711
收藏 11
点赞 0
评论 0

    最近开始接触android客户端安全相关技术,以前对移动客户端的测试主要集中在数据传输层面,现在开始学习基于软件层面的安全测试。其实,很多东西和windows平台的软件安全还是有些相似的。

    APP相关安全测试或者破解,基本思路大概就是,先对apk进行反编译,然后通过分析反编译的文件(smali文件或这jar文件)来寻找程序突破口,进行程序的修改,完成修改后,重新打包成apk文件并签名。下面主要是各步的常用操作流程。

    首先,对于反编译apk文件,相对来说比较简单。因为安卓应用是基于java进行开发的,相对来说,java还是比较容易被反编译的。可以利用apktool将apk文件反编译成smali文件,如下图:

    

但smali文件相对来说不是特别直观,对smali语法掌握不好的人来说(比如我),直接看smali文件并不友好。第二种是使用dex2-jar直接反编译成jar文件,随后可以使用jd-gui打开成类似java源码的代码,,当然有时候jd-gui也不好使,源码反编译不出来。不过最近找到一个叫luyten的软件,功能类似jd-gui,有些类jd-gui没法反编译成java源码的,lutyen可以反编译出来。后面简单分析jd-gui和luyten优缺点。总体来说,smali文件和java源码两者结合使用可以加快分析速度。

    完成反编译之后,现在就有smali文件和能被反编译成类似源码的jar文件了。通过这两类文件分析程序运行原理,一般主要看jar文件,毕竟近似源码的代码更友好,找到需要修改的地方,然后去相应的smali文件进行修改。但实际使用时,发现jd-gui有些地方反编译没有luyten好。例如一个APP,启动页面中的一个方法addDuStatistics,两个软件的反编译结果如下:

jd-gui反编译结果:(打码。。避免泄漏是什么APP)

luyten反编译结果:

smali文件中该函数的代码如下:

通过分析smali文件可以看出来,其实jd-gui的反编译结果是错误的,luyten是正确的。用了一段时间,个人总结了一下jd-gui和luyten的优缺点:

            1.在反编译效果方面,各有优缺点,总体来说luyten正确性要高点。

            2.有些类jd-gui是无法反编译出来的,一般luyten都可以反编译。

            3.jd-gui操作方便,主要是可以直接点击被下划线标识的类,跳转到该类的反编译文件中。这个还是很方便的,luyten就没有这个功能,所以你得自己去找,而且在一堆类中,一个人还真不一定那么容易找到这个类的。

            4.jd-gui还有个有点就是,可以通过中键列出该类的所有属性和方法。便于遍历了解该类以及跳转到需要查看的方法。

总体来说luyten在反编译方面还是较强的,但易用性方面不如jd-gui。所以一般都是两者结合使用,效果还不错。

    至于具体的分析过程,每个APP可能都不一样。一般第一步是查看反编译后的AndroidManifest.xml文件,可以了解到很多信息。最主要是找到软件运行时候第一个启动的activity,这样就知道从哪里开始下手。如下图,android:name中就是开始运行第一个启动的activity(打码。。)。然后就顺着该activity进行分析。当然一般先大致浏览一下整体的包结构,类等,在未做混淆处理的情况下,包名和类名的含义还是很容易理解的,并且能给出不少有价值的信息。

    至于如何定位到关键代码,《Android软件安全与逆向分析》中提到了六种方法:

        1.信息反馈法。主要是大多数软件会有一些正常或错误的信息提示字符串,通过res中的public.xml和string.xml得到相应的id,这些id值都会在程序中进行引用的,找到引用的地方,就可以正推或反推,从而找到关键代码。

        2.特征函数反馈法。类似第一种方法,通过一些特定的sdk去找,因为一般提示信息都是弹窗方式显示的,通过定位弹框sdk去找。

        3.顺序查看法。也就是从上面的第一个activity开始,按程序流程分析下去。。。。这个方法应该说很好,但是太耗时耗力,完整的分析APP的运行流程大多数情况下是不需要的。

        4.代码注入法。主要通过修改apk代码,加入log输出,随后使用logcat捕获到输出的信息。比如捕获注册码等信息。目前还没用过,其实和windows平台的类似。。。

        5.栈跟踪法。动态调试方法,类似上面的,输出栈信息。

        6.method profiling。也是动态调试的手段,据说比栈跟踪更强大,,,没用过

其实怎么分析APP,每个人可能都有自己的玩法。而且有时候还需要点运气。。。。

    分析完APP,定位到需要修改的代码,直接到smali文件中修改即可,修改完成后,就可以直接用apktool进行重打包,生成apk文件。这步也有很多坑,有时候打包会各种报错,导致重打包不成功。

    遇到的一种报错如下:

就是报资源文件中的png文件不是png格式的。。。一开始也比较奇怪,为什么格式不对。使用file测试了一下

结果显示这个png文件,真实格式是jpeg的,,,然后把这些png后缀改成jpg就可以了。有人说这个是一种防护手段,没做过app开发,不清楚是作为防护手段还是因为开发中的其他原因导致的。如果不修改资源文件,直接在反编译的时候使用-r参数,不反编译资源文件即可避免这个问题。

    重打包完成后,就是签名了。理论上除非你能搞到这个APP的正式发布证书,一般都是使用测试证书进行签名,所以这样签名后的app肯定和发布版不一样的。如果这个APP做了签名校验的话,自己修改的app肯定也无法运行的。签名校验模块一比对签名发现APP被修改了,就会报错自动退出运行的。这也是一种APP加固方法。

    通常,如果APP没做加固,上面的一套下来,就可以实现自己想要的功能,,比如破解注册,去除广告等。。。不过目前大部分APP都或多或少的做了一些加固。目前了解到的一些主流加固方法有:

        1.混淆技术。最简单,用的最多的加固方法,效果还可以,至少可以增加写分析难度。目前主要是proguard

        2.签名对比。上面也说了,做了签名对比的话,除非你能拿到正式的证书,不然测试证书是过不了的。签名对比模块如果是通过Java程序实现的话,,,其实也很容易破解。并且也有人分享了些绕过思路。不要用java做签名模块,可以使用ndk

        3.NDK技术。可以把一些重要核心的模块,使用c/c++编写成so库,随后使用jni去调用。相对来说c/c++破解难度会大一点。。。不过有人说很熟悉ARM反编译。。就喜欢直接看ARM反编译的。。只能说增加难度。。高手还是很难挡住的

        4.加壳技术。类似windows上的各种加壳,换成android平台。也有很多加壳方法等等。。。

        5.其他技术。。。。。还有很多吧,没了解过,或者不是很主流。


© 著作权归作者所有

共有 人打赏支持
季牧云
粉丝 20
博文 26
码字总数 20788
作品 0
浦东
其他
AndroidThings之基础一 基本概念

转载自:https://blog.csdn.net/weixin41636248/article/details/79069994 Android Things是什么 一句话说,AndroidThings就是让开发者可以使用Android开发工具开发嵌入式设备。 If you can...

qq_28831197 ⋅ 05/09 ⋅ 0

android悬浮窗、收款二维码、相机处理、事件通知库、NFC读取等源码

Android精选源码 一个漂亮而强大的自定义view SeekBar(http://www.apkbus.com/thread-598080-1-1.html) 适用于Android的简单NFC读取源码(http://www.apkbus.com/thread-598082-1-1.html) 安卓......

逆鳞龙 ⋅ 04/24 ⋅ 0

加密传输才是王道!谷歌在 Android P 上默认启用 TLS

上周四谷歌表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 ...

局长 ⋅ 04/16 ⋅ 0

带来手势操作的 Android P beta 发布,Pixel 尝鲜

Google 2018 I/O 大会正在进行,Android P Beta 公测版目前已经发布。 下载地址 >>> https://developer.android.com/preview/download Android P Beta 计划针对 Pixel 手机开放 —— 今天开始......

局长 ⋅ 05/09 ⋅ 4

AndroidStudio3.0NDK输出多个so库

个人博客地址 http://dandanlove.com/ 前言 去年的 Android之NDK开发初体验 这篇文章讲述NDK开发环境的搭建,以及在AndroidStudio3.0版本之前的NKDK简单开发。这次升级到Android Studio3.1,...

静默加载 ⋅ 04/12 ⋅ 0

APP漏洞赏金项目之安卓APP应用程序测试(一)

        两个月以前,我在ITsec公司开始了我大学最后一年的实习生涯。ITsec是一家全方位的信息安全评估公司,我的实习工作就是开发一个以供公司内部使用的安卓APP。通常,我在检查程序...

FreeBuf ⋅ 昨天 ⋅ 0

Android 渗透测试学习手册 第一章 Android 安全入门

第一章 Android 安全入门 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 Android 是当今最流行的智能手机操作系统之一。 随着人气的增加,它存在很多安全风险,这些风险不可避免地被...

apachecn_飞龙 ⋅ 2016/12/06 ⋅ 0

基于 MVP 架构使用Android通用开发框架快速开发微博项目实战

课程目标: 基于 MVP 架构使用Android通用开发框架快速开发微博项目实战 适应人群: 适合大学生和初中级android开发工程师,可以系统化的微博类APP的开发,系统化掌握商业化项目的开发。* 不...

13122542396 ⋅ 05/25 ⋅ 0

寄Android开发Gradle你需要知道的知识

初识Gradle Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和...

猴亮屏 ⋅ 05/22 ⋅ 0

浅谈Kotlin(一):简介及Android Studio中配置

浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型、基本语法、代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言:   今日新闻:谷歌宣布,将Kotli...

听着music睡 ⋅ 2017/05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Boost库编译应用

版本:Boost 1.66.0 Windows库编译 官网指南:直接执行bootstrap.bat处理文件即可,可以我却遇到一堆的问题。 环境:Windows 10 + Visual Studio 2017 Boost编译出来库命名 boost库生成文件命...

水海云 ⋅ 26分钟前 ⋅ 0

解决Eclipse发布到Tomcat丢失依赖jar包的问题

如果jar文件是以外部依赖的形式导入的。Eclipse将web项目发布到Tomcat时,是不会自动发布这些依赖的。 可以通过Eclipse在项目上右击 - Propertics - Deployment Assembly,添加“Java Build ...

ArlenXu ⋅ 26分钟前 ⋅ 0

iview tree组件层级过多时可左右滚动

使用vue+iview的tree组件,iview官网iview的tree树形控件 问题描述:tree层级过多时左右不可滚动 问题解决:修改overflow属性值 .el-tree-node>.el-tree-node_children { overflow: vi...

YXMBetter ⋅ 28分钟前 ⋅ 0

分布式锁

1.通过数据库实现 http://www.weizijun.cn/2016/03/17/%E8%81%8A%E4%B8%80%E8%81%8A%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E7%9A%84%E8%AE%BE%E8%AE%A1/ 2.ZK实现:curator-recipes分布式锁的......

素雷 ⋅ 36分钟前 ⋅ 0

Sublime Text3 快捷键

选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本。 Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选中并更改所有相同的变量名...

AndyZhouX ⋅ 43分钟前 ⋅ 0

XamarinAndroid组件教程RecylerView自定义适配器动画

XamarinAndroid组件教程RecylerView自定义适配器动画 如果RecyclerViewAnimators.Adapters命名空间中没有所需要的适配器动画,开发者可以自定义动画。此时,需要让自定义的动画继承Animation...

大学霸 ⋅ 43分钟前 ⋅ 0

eureka 基础(二)

使用Eureka服务器进行身份验证 如果其中一个eureka.client.serviceUrl.defaultZone网址中包含一个凭据(如http://user:password@localhost:8761/eureka)),HTTP基本身份验证将自动添加到您...

明理萝 ⋅ 46分钟前 ⋅ 1

Kubernetes(五) - Service

Kubernetes解决的另外一个痛点就是服务发现,服务发现机制和容器开放访问都是通过Service来实现的,把Deployment和Service关联起来只需要Label标签相同就可以关联起来形成负载均衡,基于kuberne...

喵了_个咪 ⋅ 46分钟前 ⋅ 0

更新队友POM文件后报错

打开报错的地方的pom及其引用方法所在文件的pom,观察其版本号是否一致,不一致进行更改

森火 ⋅ 59分钟前 ⋅ 0

IDEA使用sonarLint

一、IDEA如何安装SonarLint插件 1.打开 Idea 2.点击【File】 3.点击【Settings】 4.点击【Plugins】 5.在搜索栏中输入“sonarlint”关键字 6.点击【Install】进行安装 7.重启Idea 二、IDEA如...

开源中国成都区源花 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部