Android SO逆向2-实例分析
来源:互联网 发布:retintex算法 编辑:程序博客网 时间:2024/06/05 08:51
[TOC]
这篇文章主要介绍几个简单的例子,来逆向分析so,当然有些破解可以在smali里直接修改,但是这里均采用逆向so的方式。
0x01 ARM—HEX转换
1.将ARM指令转换为Hex时,可以使用工具Arm_Asm,如下图:
2.可以根据ARM参考手册,手动转换。比如add的指令格式如下:
当执行add r0,#1时,Rdn为0,imm8为1,所以二进制为00110000 00000001,转换为16进制就是3001,所以Hex code就是0130
3.百度文库上有人上传了一份整理好的thumb指令集,如果不想到ARM参考手册上找,可以看看这个。
0x02 示例
先对上篇文章中的switch分支进行逆向。
getSwitch()的代码如下:
1.逆向APK后,使用IDA打开libs目录下的libHelloJNI.so,alt+t找到GetSwitch函数
2.当我们传入的参数是4,2,2是,执行的是a – b,所以返回的结果是2
3.现在,我们将a – b改为a + b,就是要返回结果为6,找到i=2的减法分支,计算add ro,r2,r3的hex为D018
4.然后切换到Hex View,修改Hex为D018,再回到图形模式时,可以看到SUBS R0,R2,R3已经更改为ADDS R0,R2,R3了
5.使用010editor,ctrl+g跳转到104A的地址,修改Hex为D018,然后保存。
6.重新编译成APK,运行时,发现结果已经变为6了。
0x03 内购破解
1.正常情况下,购买金币时,是需要付费的,因为使用的是模拟器,所以显示付费失败。
2.从smali中找到相应的so,IDA打开。找到函数GameCoin,先F5看一下,看到关键点GameMain::GameCoin = v3 + v1,就是当前游戏的金币数量,对应的汇编为:ADDS R0,R0,R6
3.我们知道R0是返回值,R6是计算出的当前金币数,所以我们把此处改为ADDS R0,#255,所以每次都会增加255个金币,Hex为FF30
4.修改后,初始金币为10,点击一次后,增加了255个。
0x04 加密解密
这篇文章是从吾爱破解(http://www.52pojie.cn/thread-396463-1-1.html)看到的,作者是adslxyz。
准备工具:
- IntelliJ IDEA
- baksmali
- AndroidKiller
- IDA6.6
- Fiddler
- 一台Android真机(或者模拟器)
- eclipse
手机连上wifi,与电脑处于同一局域网,然后设置好Fiddler,具体步骤不详述。打开宝宝树孕育6.2.1版本,进入登陆窗口,输入账号密码点登陆,在电脑查看封包。可以得到请求URL:http://www.babytree.com/api/muser/login
分析可知:phone_number
,password
,email
,secret
四个参数为加密,其他参数均为固定或者地理位置信息等参数。所以此次目标就为这4个参数
- 先把apk拖入AndroidKiller进行分析,可知无壳。
- 根据先前分析,可在AndroidKiller中搜索相应字符串查找我们感兴趣的函数搜索
muser\login
,可知登陆的函数在com.babytree.platform.api.muser
中的login.smali
中。由图可知Login.java的父类是ApiBase,可以猜想,所有Api的请求所公共的函数都会在此类中生成。关键地方找一个就行,本次分析主要还是以动态调试为主. - 用baksmali将apk反编译成.smali文件
- 然后打开IntelliJ IDEA,创建一个java工程.将上一步反编译出的smali文件导入到src文件夹中。如图:
- 然后打开eclipse,切换到DDMS视图,选中手机,查看其端口,如图:
图上可以看到,目标应用的端口为8631.
- 切换到IntelliJ IDEA,选择Run-Configurations.
- 然后新建一个Remote,填写端口为8631,然后选择source using module’s classpath为我们之前创建的项目,点击OK
- 接下来在IntelliJ IDEA中打开Login.smali,快速浏览一下,选择一个感兴趣的地方下断点,这里我选择.method protected a()Ljava/lang/String;在函数起始处下断点后,在手机中输入账号密码,点击登陆,可以看到断点成功断下,如图所示:
从图中可以看到,左下角为函数的调用堆栈,从 登陆按钮 按下(OnClick),到api.user.login整个的调用过程。展开右下角的p0,可以看到此时已经生成了3个参数,
说明在断点之前,参数已经生成好了。所以我们按照函数的调用栈,挨个查看调用过的函数。查阅一番后可以发现。Login对象是在LoginActivity中的.method public a(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V方法创建的。在new-instance v0, Lcom/babytree/platform/api/muser/Login;处下断点,重新点击登陆按钮,如图:
此时v1.v2.v3寄存器分别出现了加密的结果,由上可知,分别对应
phone_number
,password
,email
三个参数。所以加密的函数应该就在上面。往上下断点,重新来一次观察一下加密的过程。
可知:
这一句函数调用之后,v0是一串固定字符串。
调用之后,v1为加密结果。查看a函数:
为RSA加密,所以之前的v0就是RSA的pubKey了。在a函数中下断点,看一看加密的参数是什么:
一切尽收眼底。由此可知
phone_number
,password
,email
三个参数的算法。 - 接下来找
secret
的算法。回到AndroidKiller搜索关键字,定位到
com/babytree/platform/api/ApiCommonParams;
大致看一下,这个是API通用参数生成的类。且加载了一个so:api_encrypt.so在secret
关键字附近看一下,调用了so的invoke-static {v1, v2}, Lcom/babytree/platform/api/ApiCommonParams;->nativeGetParam(Landroid/content/Context;Ljava/util/List;)Ljava/lang/String;
方法。我们先在这句上面下个断点,看看传给so函数的是什么参数。断点断下后,看到传递给so的参数是一个List,POST参数中除
secret
之外的所有参数。参数知道了,调用点知道了。分析一下so,看看需不需要动态调试。载入ida,找到调用的nativeGetParam函数。大致看一下,发现又调用了java的md5函数,好了,调试so的步骤剩下了。回到IntelliJ IDEA,在getMD5Str处下断点,继续调试:
很快我们可以知道,p0中就是进行md5的参数啦。
分析一下可知,
secret
就是 MD5(时间戳+所有参数排序+&asdf12341dfas!@#$%()(Ujjlasdflasdfj;asjdf23412313kljajsdflasjdflasjdflajsdf;lajsdf2342234sdfsdfffds)总结:
动态调试apk的方式让我们了解apk运作的过程,通过动静结合的分析方式,快速找到想要的东西~
0x05 签名校验
将关键代码放到so中,在底层获取签名信息并验证。因为获取和验证的方法都封闭在更安全的so库里面,能够起到一定意义上的保护作用。实例如下:
- 在程序中搜索getSignature,发现并没有调用此函数的地方,猜测在so文件中,搜索loadLibrary。
- 在代码中可以查找,可以找到调用的是signaturex.so
- 使用IDA打开signaturex.so,然后搜索getSiganture,找到调用此函数的地方。从代码中可以看到,此函数调用了org.cocos2dx.cpp.AppActivity.getSignature
- 查看F5代码,发现此函数是判断签名的函数,然后我们双击此函数的调用者,部分代码如下。
- 从上图可以看出,只需要修改BEQ loc_11F754,让其不跳转到jjni——>error,就可以绕过签名校验。 查看HEX,使用010editor跳到0011F73E,修改D0为D1。成功绕过签名校验。
转载自:http://drops.wooyun.org/mobile/10010 原文作者:3xpl0it
- Android SO逆向2-实例分析
- Android SO逆向2-实例分析
- Android逆向分析--so文件
- Android逆向实例笔记—初入so并还原分析出代码
- Android SO逆向-多重继承
- Android so逆向基本知识总结
- Android安卓破解之逆向分析SO常用的IDA分析技巧
- Android安卓破解之逆向分析SO常用的IDA分析技巧
- Android逆向实例笔记—在so里对游戏的修改
- Android逆向入门-动态分析技术进阶篇(IDA动态调试so源码)
- Android逆向分析必备
- Android的逆向分析
- 逆向分析 Android 程序
- Android逆向分析【未完】
- 逆向分析 Android 程序
- 逆向分析Android应用
- Android逆向so文件,调试加解读
- Android逆向so文件,调试加解读
- 集合
- hive中控制map和reduce数量的简单实现方法
- 滑动效果的七种方式
- jdk环境变量配置
- VS2008双机调试详解
- Android SO逆向2-实例分析
- 类,注意事项
- sql 查询重复的数据
- CSS3 skew倾斜、rotate旋转动画
- oracle自学笔记
- 第24讲项目2——油量监控
- 温习 C语言
- codevs - 图论 - SPFA
- hdoj 1210 Eddy's 洗牌问题