优秀的编程知识分享平台

网站首页 > 技术文章 正文

Android 安全逆向:篡改你的位置信息

nanyue 2024-10-24 11:49:47 技术文章 1 ℃

作者博客

https://my.oschina.net/u/1433837/home

文章目录

  1. 前言

  2. 准备工作

  3. 逆向分析

  4. 回编译,二次打包

  5. 验证

  6. 一些建议

  7. 声明

1

前言

前几天,一个哥们向我提了一个需求,怎么能改变当前应用的位置信息。当时工作比较忙,就说有时间研究下。想了下,这个可以有三种方式来解决。

  • 1.找个虚拟机,因为虚拟机可以进行模拟定位,可以实现


  • 2.写一个应用Hook调当前设备的位置,不过这个好像要求有Root权限

    关于Hook原理可以自己去查,推荐几个Hook框架,Xposed/Legend。这个原理就是对定位返回值进行一个替换。


  • 3.反编译App,修改结果,这个需要做如下几个步骤

    • 反编译 找到需要修改定位结果的地方做出相应修改

    • 重新打包

      优点: 无需root,稳定性强(前提是找准入口)。 缺点: 技术水平要求高。根据应用复杂程度、混淆、安全策略等不同,难度差异较大。难易程度包括很多内容,包括混淆部分、入口寻找、签名验证等。


      本文采用第三种方法来进行修改,上面说的混淆,签名校验也都遇到了,下面会详细分析。

2

准备工作

  • 要反编译的app包,这个是必须的


  • 反编译工具等。


    反编译工具有很多,但是底层基本上都是差不多,本文采用AndroidKiller,Jadx-gui


  • 由于是直接修改smali代码,所以需要对这个smali比较熟悉,之前写过几篇文章,可以移步链接Android逆向分析(二)之Smali 指令集及文件详解

    (https://my.oschina.net/u/1433837/blog/865762)


3

逆向分析

准备工作OK。下面开始反编译修改流程

反编译,查找需要修改的页面

我在反编译的时候,发现该App居然用了两家的定位SDK,(百度、高德),这就比较头痛了,不过,别慌,我们来缕下思路,用了两家定位SDK,有与我们只是去改某个界面的定位信息,我们应该去找这个界面,然后去看它的定位是用的哪一个,手机上打开需要操作的页面,cmd 中输入已下命令。

adb shell dumpsys activity top

会看到该页面的类详细信息

我们再用jadx-gui打开反编译之后的源码,全局搜索。找到该Activity,可以看到该页面用的是高德的定位模块,不熟悉的同学可以去移步高德地图官网,简单的看一下。

找到其定位模块

简单分析下逻辑,该页面收到高德地图回调以后,将AMapLocation对象中的信息拿出来,然后赋值给成员变量,并且该对象中的位置信息设置到TextView中去。下面看一下对应的smali文件

对于JAVA代码就没有必要多说了,下面分析下对应Smali文件

可以看到,先从AMapLocation 对象中拿到Address信息,然后判断下是否为0,如果不为真的话,跳转到cond_2偏移处,稍后再看下cond_2 偏移处的代码

下面再看下cond_2处的代码

修改Smali

下面我们在对应位置,给相应的寄存器赋值,在这我们把位置个经纬度信息写死,在smali里面不能直接去写字符串,需要将字符串转为ASCII,再写进去。关于这个经纬度信息,也不能直接写进去,也是有一定的规则。

相应的也要对cond_2 进行修改

OK,至此我们已经修改完了对应的smali,接下来就是二次打包了。

4

回编译,二次打包

二次打包

二次打包成功,现在我们安装到手机上,进行测试,WTF???,可以看到弹出一个Dialog,显示如下信息。

辛苦改了那么久,结果发现该应用做了签名校验,我们再来看一下,它的签名校验怎么做的。

签名校验

手机停留在该页面,在命令行中输入

adb shell dumpsys activity top

可以找到对应的Activity信息,可以发现该Dialog 是在 WelcomeActivity 弹出的

OK 很明显的可以看到isTwickPack方法,我们猜测这就是校验签名的地方,也可以反过来验证下,全局搜索关键字,“该应用被二次打包,程序将关闭”

可以看到引用String name为"keystore_error",然后再全局搜索该关键字,找到该name 在R文件中的引用。

全局搜索引用的地址“0x7f080200”,可以看到引用的地方是在,WelcomeActivity中。

具体看下是onAnimationEnd 这个方法里面,这个方法一上来就做一次二次打包校验,可以先看下Java代码。

对应smali如下,代码校验,截取部分看下。

其实我们要做的很简单,在这个smali里面直接return 一个false,这样就绕过了,二次打包校验。对应smali

OK 至此已经改动完毕,简单验证一下

5

验证

修改前

修改后

6

一些建议

通过本文案例,其实对于现在应用防护有这些建议:首先关于应用签名校验这块逻辑,可以做的更安全点,就是在native层用反射调用系统获取签名的方法,然后直接在native层进行比较,如果发现签名不正确,就退出程序,全部放在native层做,这样安全系数会高点

再者就是推荐一些企业级别的加固方案,第三方的有很多。

7

声明

本文的目的只有一个,通过一个案例来分析如何去修改位置,以及如何去破解,如果有人利用本文内容进行任何商业目的和非法牟利,带来的任何法律责任将由操作者本人承担,和本文作者没有任何关系,所以还是由衷的希望大家秉着技术学习的目的阅读此文,非常感谢!

今日推荐

Tags:

最近发表
标签列表