SIP参考指南,浅谈Android应用保护
分类:高并发

针对 Python 编程语言的新功能提议之一是希望为运行时添加“透明度”,并让安全和审计工具查看 Python 何时可能运行潜在危险的操作。

对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击。使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码、数据,修改其代码逻辑和机制等操作。这篇文章主要介绍一些基本的应用逆向和分析方法,演示Android应用的代码机密性和完整性是如何被破坏,进而被应用攻击者所用的。

利用Xposed框架编写模块实现登录劫持

介绍

在当前的形式下,Python 不允许安全工具查看运行时正在执行的操作。 除非这些操作之一产生可能引起警报的特定错误,否则安全和审计工具就会视而不见,攻击者可能正在使用 Python 在系统上执行恶意操作。

 

用到的环境:

  • 一台已经root的Android手机
  • AndroidStudio
  • Xposed框架APK:http://repo.xposed.info/module/de.robv.android.xposed.installer
  • Xposed对应API:http://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067

本文是SIP4.18的参考指南。SIP是一种Python工具,用于自动生成Python与C、C++库的绑定。SIP最初是在1998年用PyQt开发的,用于Python与Qt GUI toolkit的绑定,但适用于生成任何C或C++库的绑定。

图片 1

一、Dalvik层源码逆向

在dalvik层代码的分析中,(一般情况下,对于未进行防护的应用)在Dalvik层,我们只关心classes.dex的逆向分析。

 

classes.dex是APK运行时的代码,是由源代码编译成的可以在dalvik上运行的代码。Dalvik虚拟机类似java虚拟机,所以可以用类似java的class文件的反编译方法,反编译classes.dex为java代码。对于未被保护的应用,可以用此方法还原出大部分代码。

 

整个过程中,涉及的代码形式如下:

· 1.dex文件,APK的可执行文件。

· 2.smali文件,Dalvik VM内部执行的代码。

· 3.jar文件和java文件,根据dex文件转换成的java代码文件.。

 

图片 2

 

用到的工具介绍:

· 1.smali/baksmali :dex可执行文件向smali字节码文件互相转换的工具,转换的过程不丢失信息。

· 2.dex2jar:dex文件转化成java的jar文件的工具。因为Dalvik虚拟机和Java虚拟机的差异,转换无法做到一一对应,会有信息丢失和代码的错误。(该工具是整个源码逆向中非常有意义的一步 )。

· 3.jd/jd-gui:java的jar文件反编译工具。

· 4.APK改之理(ApkIDE):Windows平台下一个集成了上述工具的有GUI的平台。

 

最终生成的java源码形式如图。此时Dalvik层源码的逆向已经完成,可以对应用进行进一步的准源码级别的分析。

图片 3

 

Xposed的使用:

  • Xposed可以在不修改APK的情况下对应用的运行结果产生影响,是一款比较常用的Android Hook工具。
  • 首先安装Xposed框架对应APK文件到已经root的手机中,安装完成后打开Xposed如下图所示:

图片 4

安装好的Xposed框架

  • 接着点击“安装/更新”。注意:安装Xposed存在手机变砖的风险,如果你不明白什么是变砖,也不知道如何解决此问题,请慎重。
  • 这样Xposed框架就在手机中安装完成了,但是这仅仅是一个框架,我们需要下载或者自行编写功能模块。

此版本SIP生成的绑定可用于Python 2.3以后的版本,包括Python 3.x。

PEP-551 为 Python 提出了两个新的 API

但在 Python Enhancement Proposal 551(PEP-551)中,Python 核心开发人员 Steve Dower 已经提出了两个新的 API,这些 API 将使安全工具能够在 Python 执行潜在危险操作时进行检测。

第一个是 Audit Hook API,它可以引发关于某些类型的 Python 操作的警告消息。

“这些操作通常在 Python 运行时或标准库的深处,比如动态代码编译,模块导入,DNS 解析或使用某些模块,如 ctypes,”Dower 说。

安全或审计工具可能会使用这些消息作为可疑事件的警告标志,并在真正造成危害之前标记或阻止 Python 进程继续。

第二种,验证 Open Hook API,这是是一种让 Python 运行时允许执行或篡改哪些文件的机制。 道尔解释道:

大多数操作系统都有一种机制来区分可以执行的文件和不可执行的文件。 例如,这可能是权限字段中的执行位,或者是文件内容的验证散列,以检测潜在的代码篡改。 这些是防止执行未被批准用于给定环境的数据或代码的重要安全机制。 目前,Python 在启动脚本或导入模块时无法与这些集成。

二、Dalvik层代码篡改

Dalvik层的代码篡改主要发生在smali文件上。反编译出的java代码虽然易读,但已经丢失了部分信息,同时可能存在若干错误,基本上没办法再编译回可执行文件。同时dex二进制文件不具备可读性。所以一般情况下,只能在smali中的代码上进行修改,重新打包生成APK。

 

代码层的篡改,可以修改应用的逻辑流程,插入恶意代码、绕过关键的安全流程(注册、验证、付款),打印敏感数据等。篡改代码、重打包技术一般应用在破解软件的注册验证机制(AD block破解注册,海卓破广告VIP,MIUI收费主题破解),修改游戏的规则(微信飞机大战破解),应用的敏感API调用的监控(APIMonitor,通过Android重打包加固APK拦截软件行为)。

 

Dalvik层代码篡改的使用的一个比较著名的例子是:APIMonitor。

APIMonitor的工作原理是,反编译apk文件,遍历smali代码,搜索配置文件中配置的需要监控的Api,如果找到一个Api的调用,则分析其参数,然后调用droidbox包空间下对应的类的静态函数。这些静态函数实现都是解析参数,打印输出log信息。处理完毕后,重新编译生成apk。

 

编写测试应用

  • 我们要模拟一个登陆劫持,下面给出一个模拟登录的APP,界面如图:

图片 5

登录失败

图片 6

登录成功

  • 下面附上测试应用关键登陆验证代码:

图片 7

登录验证.png

  • 测试应用的包名为:'com.example.administrator.logintest'

还有许多其他类似的工具,例如SWIG。事实上,SIP如此名字是因为它源于一个小型的SWIG。但不像SWIG,SIP是特别设计于将Python与C/C++进行绑定的,它尽可能地集成更多C/C++的功能。

Python 的性能影响可以忽略不计

道尔去年8月份提出了 PEP-551。 早期的测试表明,添加这两个 API 所带来的性能影响可以忽略不计,“绝大多数基准测试显示速度在 1.05 倍之间”的结果。

最初的计划是让 PEP-551 搭载 Python 3.7,并计划于 2018 年 6 月中旬发布,但根据下个月发布的新功能列表,该提案没有进行最终削减。 但这并不意味着 PEP-551 不会在未来版本的 Python 中提供。

原文:BleepingComputer  编译:开源中国

三、Dalvik层代码的Hook

samli代码的篡改需要重新打包,新的包的签名和文件校验都和原有的包不同,可以被应用内的完整性检查模块识别,进而限制进一步的操作。解决这个问题的一个方法是,可以通过把自定义代码注入到应用的进程空间,实时的代码hook,不修改代码,实现对应用的代码逻辑的修改。

可以实现上述功能的的框架工具是xposed,和cyida substrate。xposed应用相对广泛。xposed的原理可以参考之前分享的文档《Xposed原理及实现》。

 

Xposed的应用比较有名的两个例子分别是

1.Zjdroid,通过hook系统挂载dex文件的函数,自动化脱掉大部分android的加密壳。

2.Xprivicy,通过hook大部分隐私函数的调用,监控或者阻断应用对隐私API的调用。

Dalvik层代码的hook会在第三篇文章中详细介绍。

 

编写Hook模块

  • 使用AndroidStudio新建一个Android工程,可以没有Activity
  • 找到AndroidMainfest文件,添加如下几个标签:

图片 8

添加标签.png

  • 其中xposedminversion是API的最小版本,这里我们使用的版本为54
  • 将API导入工程:

图片 9

导入jar包.png

  • 注意不要放在libs里,新建一个lib文件夹粘贴进去,然后add library
  • 修改build.gradle,把compile改为provided:

图片 10

gradle.png

  • 新建一个类,继承 IXposedHookLoadPackage,Hook的关键步骤在此,下面直接上代码:

图片 11

Hook.png

  • 这里有两个比较关键的方法:handleLoadPackage获取包加载时候的回调并拿到其对应的classLoader;findAndHookMethod对指定类的方法进行Hook。

SIP官网:http://www.riverbankcomputing.com/software/sip

四、本地.so文件的分析

本地.so文件一般提供敏感函数的封装。对于未被保护的.so文件,可以通过IDA进行静态分析和动态挂载调试。so文件的分析会在第四篇文章中详细介绍。

 

编译并安装模块

  • Build APK后使用adb install XXXX.apk 命令将模块APK安装到手机中:

图片 12

InstallHookMoudle.png

  • 手机上的Xposed框架检测的模块安装:

图片 13

检测到模块

  • 激活模块,重启手机:

图片 14

激活模块

  • 打开模拟登陆应用,进行登录操作,在Xposed的日志中查看劫持到的信息:

图片 15

查看劫持到的信息

在这里你总能找到最新的稳定版与最新版的文档。

五、浅谈Android应用保护系列文章

Acknowledge

  • 感谢《Android安全技术揭秘与防范》这本书和其作者 周圣韬
  • Hook的关键在于对目标应用的逆向,找到关键方法
  • 写的比较粗略,如果疑问欢迎留言交流

SIP也可以从Mercurial库下载:http://www.riverbankcomputing.com/hg/sip.

浅谈Android应用保护(零):出发点和背景


作者:纳池@阿里移动安全,更多安全类技术文章,请点击阿里聚安全博客

许可

SIP许可类似于Python,也采用GPL协议(包括v2和v3)。如果你使用SIP,意味着你必须遵循GPL协议。

特征

SIP和它所生成的绑定拥有如下特征:

加载迅速,内存占用低。

自动转换标准的Python与C/C++数据类型。

不同参数签名的函数和方法的重载

访问C++类的protected方法

能够定义一个继承于C++类型的Python子类,包括C++抽象类

Python子类可以实现__dtor__()方法来支持C++类的虚析构函数的调用。

支持普通C++函数、类方法、静态类方法、虚类方法和抽象类方法。

可以在Python中重新实现C++虚/抽象方法

支持全局和Class变量

支持全局和Class操作

支持C++命名空间

支持C++模板

支持C++异常并转换为Python异常

丰富的comparsion slots的自动生成

支持deprecation警告

支持定义C++类与相似的Python数据类型的映射,并自动调用

支持自动利用任何可用的运行时类型信息,确保Python实例对象类型与对应的C++对象实例相匹配

可以转换在类型与meta类型之间转换python对象,用以包装一个C/C++数据类型

支持Python全局解释器锁,包括指示一个C++函数可能被阻塞,从而允许释放锁,让其他Python线程运行。

支持将多个简单的或私有相关的模块合并为一个模块。

支持C++实例所有权概念(即代码的哪些部分负责调用实例的析构函数),支持所有权在应用程序运行期间的改变。

产生一个本身建立在其他C++类库之上的C++类库,允许不同的bindings之间代码集成与共享。

支持用一套规范的文件,定义复杂的版本控制系统。允许控制C++类库的全生命周期,包括指定特定于平台的可选功能。

支持自动生成PEP 484 类型hint stub文件,可以在指定的文件中包含说明文档,并允许外部工具提取和处理。

可以在所有生成的源码中自动包含规范文件中所声明的版权和授权信息。

可以在Python书写的构建系统中继承配置,编译并且安装你自己的绑定,从而无需担心平台的具体问题。

使用distutils构建你的扩展支持。

SIP以及其生成的bindings,可以运行在UNIX,Linux,Windows,MacOS/X,Android and iOS中

SIP组件

SIP由一些不同的组件构成。

SIP代码生成器。它处理.sip规范文件并生成C或C++bindings。转换详情参考《使用SIP(Using SIP)》一节。

SIP头文件(sip.h)。它包含生成C与C++代码所需要的规范与数据结构。

SIP模块(sip.so或sip.pyd)。这是一个python扩展模块,自动由SIP生成的bindings导入,并为它们提供一些通用的工具函数。详情参考《应用程序Python API(Python API for Applications)》

SIP构建系统(sipconfig.py)。它是一个纯python模块,在SIP被配置并封装所有系统的相关信息时被创建。它包含目录名称、编译和链接标志以及版本号,它也包含一些Python类与函数。它帮助你为bindings编写配置脚本。

SIP distutils扩展(sipdistutils.py)。这是一个distutils扩展,可以用distutils构建你的扩展模块。用于替代手动编写SIP构建系统的配置脚本。它可以很简单的添加.sip文件到你需要构建和扩展的文件清单。详情参见《用distutils构建扩展(Building Your Extension with distutils)》。

SIP v5的准备

SIP指定文件的语法将在SIP v5中改变。SIP代码生成器的命令行选项也会改变。为了帮助用户管理过度,将采用以下方法

尽可能把所有不兼容的变更,首先在SIP v4中实现。

不兼容的变更实现之后,老的语法将被指定为deprecated(提示警告),但仍然在v4中支持。

Qt支持

SIP为创建基于Digia的Qt 工具包提供支持。

SIP代码生成器理解signal/slot类型安全的回调机制,该机制被Qt用于把对象连接到一起。它允许应用程序定义新的Python signals,并且允许python调用对象可以像slot一样使用。

本文由10bet手机官网发布于高并发,转载请注明出处:SIP参考指南,浅谈Android应用保护

上一篇:微软公司发布图表自黑Windows,但已在超车道上追赶Windows 下一篇:如何设计进度指示器,面对现实这么难
猜你喜欢
热门排行
精彩图文