网站首页 > 技术文章 正文
作者博客
https://my.oschina.net/u/1433837/home
文章目录
前言
准备工作
逆向分析
回编译,二次打包
验证
一些建议
声明
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
声明
本文的目的只有一个,通过一个案例来分析如何去修改位置,以及如何去破解,如果有人利用本文内容进行任何商业目的和非法牟利,带来的任何法律责任将由操作者本人承担,和本文作者没有任何关系,所以还是由衷的希望大家秉着技术学习的目的阅读此文,非常感谢!
今日推荐
猜你喜欢
- 2024-10-24 初探animation中steps()属性(animation steps属性)
- 2024-10-24 HTML5(九)——超强的 SVG 动画(htmlsvg动画代码)
- 2024-10-24 自定义日历(二)(自定义日历控件)
- 2024-10-24 Flutter简单动画Animation运用(flutter 视频教程)
- 2024-10-24 css3中动画animation中的steps()函数
- 2024-10-24 移动端渲染原理浅析(移动端渲染原理浅析设计)
- 2024-10-24 iOS 事件处理机制与图像渲染过程(简述ios中的事件响应机制)
- 2024-10-24 Android 开机问题分析(android无法开机)
- 2024-10-24 GoogleCTF + zer0ptsCTF + ImaginaryCTF 2023 笔记
- 2024-10-24 决战“金三银四”,中高级Web前端大厂面试秘籍:CSS篇
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)