逆向学习实战之–替换哈罗单车图片

最近学习iOS逆向知识也有一段时间了,今天就找了一个App练下手,来检测这段时间的学习效果。
逆向的APP是哈罗单车,目的是实现替换地图上面单车的定位图片,之前好像在网上看到过有人实现过这个效果。

  • 明确目的,梳理思路

既然是替换原有单车的图片,那么只需要找到初始化设置图片的地方即可,然后hook处理成我们需要的图片。

  • 准备工作

1、越狱手机4S,iOS8.0系统,4S是armv7的架构,目前iPhone从5S开始都是arm64架构,奈何自己很穷,买不起好手机,哎o(╥﹏╥)o ,但是逆向的思路是一样的,区别只是汇编语言有点差异。
2、利用dumpdecrypted对应用砸壳获取EasyBike.decrypted备用,利用class-dump导出APP的头文件备用

  • 分析开始

1、从界面入手,利用cycript或者Reveal找出单车所在的视图 MAAnnotationContainerView

2、查看 MAAnnotationContainerView.h 文件分析该类中的方法

根据方法命名来初步猜测添加AnnotationView的方法。

- (void)addAnnotationView:(id)arg1;

3、利用lldb来动态调试目标程序
a、利用lldb命令 image list -o -f 获取目标APP的偏移地址0x0005e000
b、将之前砸壳的EasyBike.decrypted文件放入IDA分析获取addAnnotationView方法的基地址:__text:0x0050578C
c、设置断点 br s -a ‘0x0050578C+0x0005e000’ ,查看添加单车图片的时候是否会触发
当拖动地图,地图添加AnnotationView便会触发该方法,所以这个方法就是我们需要找的方法。

(lldb) br s -a '0x0050578C+0x0005e000'
Breakpoint 1: where = EasyBike`_mh_execute_header + 5230748, address = 0x0056378c
(lldb) c
error: Process is running.  Use 'process interrupt' to pause execution.
Process 2231 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1frame #0: 0x0056378c EasyBike`_mh_execute_header + 5248908
EasyBike`_mh_execute_header:
->  0x56378c <+5248908>: svcge  #0x3b5f00x563790 <+5248912>: stceq  p9, c14, [r0, #-180]0x563794 <+5248916>: pkhbtmi r4, r3, r2, lsl #130x563798 <+5248920>: .long  0xf25b4650                ; unknown opcode
Target 0: (EasyBike) stopped.
(lldb) c

d、那么现在利用IDA查看addAnnotationView方法的实现,确认这里是否有添加图片的操作呢

初略的过一遍该方法的汇编代码(汇编代码就不贴出了),并没有相关图片的操作,关键的几个方法如下:

[self addSubview:]
[self annotation]
setSelected:
setObject:forKey:

这个时候就要考虑,是否在其他地方就已经处理过了,那么接下来先看看addAnnotationView的参数类型了。
e、在之前设置的断点中,添加一些自定义的命令

br com add 1
po $r2
c
DONE// 断点打印参数类型
JYAroundBikeAnnoView JYNearlyBikeAnnoView
选中其中一个AnnotationView打印
JYStartPointAnnoView

所以addAnnotationView的参数类型可以是JYStartPointAnnoView、JYAroundBikeAnnoView、JYNearlyBikeAnnoView

f、利用导出的头文件查看这三个类的内容
结果是这三个类中都没有ImageView或者Image的影子,但是在这三个类的父类MAAnnotationView中存在UIImageView的属性,此时猜想界面上的单车图片就是这个ImageView来决定的

g、在IDA中搜索MAAnnotationView,查找有Image信息的方法,发现有一个[MAAnnotationView setImage:]的方法,查看这个方法的汇编实现。不难发现这个方法就是设置图片的方法。

// 关键代码
__text:0051A246                 MOV             R5, R0
__text:0051A248                 MOV             R0, R2
__text:0051A24A                 BLX.W           _objc_retain
__text:0051A24E                 MOV             R8, R0
__text:0051A250                 MOV             R0, #(_OBJC_IVAR_$_MAAnnotationView._image - 0x51A25C) ; UIImage *_image;
__text:0051A258                 ADD             R0, PC  ; UIImage *_image;
__text:0051A25A                 LDR             R6, [R0] ; UIImage *_image;
__text:0051A25C                 LDR             R4, [R5,R6]
__text:0051A25E                 CMP             R4, R8
__text:0051A260                 BEQ.W           loc_51A396
__text:0051A264                 MOV             R0, R8
__text:0051A266                 BLX.W           _objc_retain
__text:0051A26A                 STR             R0, [R5,R6]
__text:0051A26C                 MOV             R0, R4
__text:0051A26E                 BLX.W           _objc_release
__text:0051A272                 MOV             R0, #(selRef_imageView - 0x51A27E)
__text:0051A27A                 ADD             R0, PC  ; selRef_imageView
__text:0051A27C                 LDR.W           R10, [R0] ; "imageView"
__text:0051A280                 MOV             R0, R5  ; void *
__text:0051A282                 MOV             R1, R10 ; char *
__text:0051A284                 BLX.W           _objc_msgSend// 伪代码 UIIMageView * imageView = [self imageView];__text:0051A288                 MOV             R7, R7
__text:0051A28A                 BLX.W           _objc_retainAutoreleasedReturnValue
__text:0051A28E                 MOV             R4, R0
__text:0051A290                 MOV             R0, #(selRef_setImage_ - 0x51A29E)
__text:0051A298                 LDR             R2, [R5,R6]
__text:0051A29A                 ADD             R0, PC  ; selRef_setImage_
__text:0051A29C                 LDR             R1, [R0] ; "setImage:"
__text:0051A29E                 MOV             R0, R4  ; void *
__text:0051A2A0                 BLX.W           _objc_msgSend
__text:0051A2A4                 MOV             R0, R4// 伪代码
[imageView setImage:_image];

h、通过上面的分析终于找到设置图片的方法了,后面通过hook setImage:方法就可以将图片替换成自己的方法了

  • 编写Tweak验证
@interface MAAnnotationView: UIView
@property(readonly, nonatomic) UIImageView *imageView;
@end%hook MAAnnotationView
- (void)setImage:(UIImage *)image {%orig;// JYNearlyBikeAnnoView  JYAroundBikeAnnoView   JYStartPointAnnoView// JYStartPointAnnoView 选中之后的这种类型不做处理if ([self isKindOfClass:%c(JYNearlyBikeAnnoView)] || [self isKindOfClass:%c(JYAroundBikeAnnoView)]) {self.imageView.image = [UIImage imageWithContentsOfFile:@"/mv.png"];}
}
%end
  • 查看结果

  • 总结

这个是这段时间学习以来完成的一个比较完善的逆向实战了,虽然比较简单,但也实现了从零到一开始,刚开始的分析是不像上面那样简单的,分析过程中还是遇到了很多问题,但是多花时间去研究就会越来越窥探到逆向开发的门路。

逆向学习实战之--替换哈罗单车图片相关推荐

  1. 深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

    大家好,我是微学AI,今天给大家带来手写OCR识别的项目.手写的文稿在日常生活中较为常见,比如笔记.会议记录,合同签名.手写书信等,手写体的文字到处都有,所以针对手写体识别也是有较大的需求.目前手写体 ...

  2. 深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

    文章目录 一.前期工作 导入库包 导入数据 主成分分析(PCA) 聚类分析(K-means) 二.神经网络模型建立 三.检验模型 大家好,我是微学AI,今天给大家带来一个利用卷积神经网络(pytorc ...

  3. 深度学习实战1-(keras框架)企业数据分析与预测

    大家好,我是微学AI,今天给大家带来深度学习框架keras的实战项目,用于基本的企业数据分析,预测企业净利润情况,并利用灰色预测函数GM11进行预测模型.我们拿到企业数据,这里参数抽象成x1-x9,y ...

  4. 深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

    文章目录 一.前期工作 1. 设置GPU 2. 导入预处理词库类 二.导入预处理词库类 三.参数设定 四.创建模型 五.训练模型函数 六.测试模型函数 七.训练模型与预测 今天给大家带来一个简单的中文 ...

  5. 深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星

    大家好,我是微学AI,我们在日常生活中,经常会写一些文稿,比如:会议纪要,周报,日报,汇报材料,这些文稿里我们会发现有时候出现拼写.语法.标点等错误:其中拼写错误的错别字占大部分. 经过初步统计:在微 ...

  6. 深度学习实战2-(keras框架)企业信用评级与预测

    深度学习框架如果仔细研究,其实难度没有想象中的那么大,今天我给大家带来一个深度学习框架keras简单的实战项目:企业信用评级与预测. 企业信用评级目前是一个完整的体系,包括信用评级的要素和指标.信用评 ...

  7. 深度学习实战23(进阶版)-语义分割实战,实现人物图像抠图的效果(计算机视觉)

    大家好,我是微学AI,今天给大家带来深度学习实战23(进阶版)-语义分割实战,实现人物图像抠图的效果.语义分割是计算机视觉中的一项重要任务,其目标是将图像中的每个像素都分配一个语义类别标签.与传统的目 ...

  8. HTML+CSS实战(哈罗单车首页)

    思路:仿照哈罗单车官网将页面分成4块:头 第一块: LOGO,图片之类的东西, <div class ="header"><img src ="halu ...

  9. JS逆向学习笔记 - 持续更新中

    JS逆向学习笔记 寻找深圳爬虫工作,微信:cjh-18888 文章目录 JS逆向学习笔记 一. JS Hook 1. JS HOOK 原理和作用 原理:替换原来的方法. (好像写了句废话) 作用: 可 ...

最新文章

  1. spine - unity3D(摘自博主softimagewht)
  2. 【记录】ASP.NET IIS ISAPI_Rewrite
  3. XenServer 6.5实战系列之三:Prepare for XenServer 6.5
  4. 08.认证考试注意事项
  5. 关于通过DDMS向Android系统的模拟器的sdcard中导入mp3文件的问题
  6. 示例解读 Python 2 和 Python 3 之间的主要差异
  7. NLog自定义Layout Renderer
  8. 算法-排序-基数排序(对任意整数排序)
  9. 职场上个人的核心技术_职场上,这3种人表面老实,实际却是个“高手”,要远离...
  10. javascript在第三个文本框中显示文字_一段中的个别文字,显示在目录中
  11. 自己动手写Docker系列 -- 4.1使用busybox创建容器
  12. 立即更新 Chrome 浏览器!这个 0day 已遭在野利用
  13. 我竟然用git send-mail通过QQ邮箱提交了push request
  14. IOMMU之Interrupt Remapping
  15. 《系统集成项目管理》第十六章 变更管理
  16. 对于上海交通大学网络安全专业21考研823的一些总结以及22考研专业课如何准备的想法
  17. 计算机管理禁用usb,电脑如何禁用U盘、怎样禁用USB存储工具,防止USB端口泄密?...
  18. 方舟加载服务器就显示stm,方舟生存进化是不是stm
  19. 三次样条(Cubic Spline)的C++实现以及可视化
  20. Excel2016通过宏生成拼音码

热门文章

  1. CUT&RUN——检测蛋白-DNA相互作用的强大通用技术
  2. 等额本息还款和等额本金还款计算公式的推导
  3. CSS面试须知--关于图片
  4. 三分频电路Verilog设计
  5. mac连接wifi无ip/无法访问网络
  6. UCI机器学习数据库的Python API介绍
  7. 15幅非常有创意的影子摄影作品欣赏
  8. 华为服务器 自动安装 黑屏,华为服务器显示器黑屏如何解决
  9. 【数学】用C语言实现函数的定积分—— 把 “定积分定义计算出的值” 和 “牛顿-莱布尼兹公式计算出的值” 两者进行误差比较
  10. 【华为机试真题 Python】一个正整数到 Excel 编号之间的转换