小白:小程,我一直想问,什么是逆向来着?是逆向行驶吗?

小程:理解为逆向行驶也没错。一般的项目是从无到有,而逆向是从已有的状态入手,分析出已有的流程与结构的手段。

iOS上的逆向开发,是一件有趣的事情(虽然有时很痛苦),而且还可能给你带来收益。

在接下来的几篇文章,小程会尝试介绍iOS逆向的一系列的知识与技能:从基础工具的使用,到目标类的定位、目标代码的调试,再到注入微信的实战示例。

本文介绍iOS逆向的基础工具的使用。

硬件方面,你需要一台iOS设备(iphone/itouch/ipad,以下都称为手机或iphone),以及一台电脑。电脑方面,小程建议你使用mac电脑,因为它的环境可以解决很多无谓的问题,当然如果你有很强的解决问题的能力并且坚持用windows来安装mac虚拟机的话,也是可以的。

系统环境方面,你需要给手机越狱。说到越狱,小程就想起scofield:

但这里的越狱,是指对手机有更多的操作权限,比如在手机运行命令行终端、往root等目录写入数据、安装非来自AppStore的应用,等等。但注意一点,越狱后,沙盒的机制还是存在的,比如你的App还是不能往其它App的Document目录写入数据。

小程在写这篇文章时,10.2以上的系统还不支持越狱,所以准备用于越狱的系统应该是10.2或低于10.2。使用pp助手、爱思之类的工具进行越狱。

解决了硬件和系统越狱的需求后,接着就是逆向的基本工具了,这些工具可以让你逼近攻击目标。

(1)ssh

ssh,就是Secure Shell,即安全外壳协议(ssh协议可以防范ip或dns欺骗,加密而且压缩数据,被广泛使用),常用于远程登陆。这里指的是ssh客户端。

如果最终是用yalu102来越狱的话,越狱后自带ssh(但scp要自行安装),注意,不要再安装ssh(比如openssh或ssh connect等),否则即使在Terminal上可以执行ssh命令也是连接不上--就是要Terminal上执行不了ssh命令,如果安装了openssh,要卸载掉。

试用ssh:

  • 在手机的wifi页面,找出当前使用的ip。
  • 在电脑上(mac机自带ssh客户端),使用ssh登陆设备:ssh root@ip
  • ssh登陆到手机,之后操作的就是这台手机,电脑上的键盘就是手机的键盘。

小白:喂,登陆时需要写密码,是多少呢?

  1. ios设备的两个默认ssh账号:
  2. root,默认密码:alpine
  3. mobile,默认密码:alpine
  4. ssh登陆示例:
  5. $ ssh root@192.168.1.101
  6. 或者:
  7. $ ssh -l root 192.168.1.100
  8. -----
  9. root@192.168.1.101's password:(输入密码,回车)
  10. 810:~ root#
  11. 登陆后,修改root密码:
  12. # passwd
  13. 登陆后,修改mobile密码:
  14. # passwd mobile
  15. 每次ssh到手机,都要经过密码验证。如果想简化这一步,那么可以使用iosod来建立这个信任,前提是,已经安装了iosopendev:
  16. cd /opt/iosopendev/bin
  17. ./iosod sshkey -h 192.168.1.101
  18. 这样就对这个ip建立信任,之后ssh登陆时不再输入密码。

上面已经提到了iOSOpenDev,这是一个编写注入代码的实用工具,后续再具体介绍。

使用ssh时可能遇到的一个问题,对于ios10.1.1(其它10.x也一样),在越狱后,用ssh是登陆不上的,原因参考http://blog.csdn.net/dianshanglian/article/details/62422627

以下是这个网页的内容摘录:


  1. 1SSH连接不上
  2. 在手机上安装Mterminal,运行su,输入root密码,进入root权限,执行ps aux|grep dropbear
  3. 1)如果你看到的进程没有dropbear
  4. 执行/usr/local/bin/dropbear -F -R -p 22
  5. 然后就可以连接了,重启依然有效
  6. 2)如果你看到进程是这样:/usr/local/bin/dropbear -F -R -p 127.0.0.1:22
  7. 意思是只能数据线重定向连接SSH,如果你想改成WIFI可以访问
  8. 那么用Filza修改/private/var/containers/Bundle/Application/{UUID}/yalu102.app/dropbear.plist
  9. 把里面有个参数127.0.0.1:22改成22保存,重启手机即可
  10. UUID在每个人手机上不一样
  11. 2、修复SCP
  12. 你会发现yalu102自带的SSH无法用WINSCP传输文件,因为缺少了scp
  13. 很简单
  14. 1cydia里面安装wget
  15. 2)在mterminal里面登陆root权限(在手机上,或在pcssh到手机)
  16. 3)执行以下命令
  17. wget mila432.com/scp
  18. ldid -S scp
  19. chmod 777 scp
  20. mv scp /usr/bin/scp
  21. (mila432.com/scp,如果已经不存在的话,那需要另找scp执行文件)

注意,如果是用“越狱助手”来越狱的,那上面的目录改为../Application/越狱助手/yalu102.app/..

(2)scp

scp,就是secure copy,是基于ssh的远程拷贝。

一般安装完ssh客户端后就可以使用scp指令(否则,可以参考上面办法下载scp来使用)。

比如,把hellowrold文件,拷贝到手机的root用户的根目录,命名为hello:

  1. scp helloworld root@192.168.1.100:hello

比如,拷贝手机里面的内容到电脑:

  1. scp root@192.168.2.21:/User/Documents/Cracked/* .

在ssh与scp安装完毕后,就可以做一些“攻击”的事情了。

比如,让手机重启

  1. ssh root@192.168.1.101
  2. (810:~ root#) killall SpringBoard

比如,在手机上执行hello wrold程序

  1. 首先编译出执行文件,使用clang
  2. clang -o helloworld -arch armv7 helloworld.c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk
  3. 拷贝执行文件到手机:
  4. scp helloworld root@192.168.1.100:hello
  5. 登陆手机并执行:
  6. ssh root@192.168.1.101
  7. cd /
  8. chmod +x hello
  9. ./hello

(3)socat

socat,是用来查看系统日志的工具。系统各个进程的动态信息、所有app的NSLog信息,都可以通过socat观察到。

安装

  1. cydia搜索SOcket CAT来安装,或者:
  2. apt-get install socat --前提是安装了apt-get

使用

  1. socat UNIX-CONNECT:/var/run/lockdown/syslog.sock
  2. >watch

为了跟踪信息,我们经常在hook某个APP后,再自行加上NSLog。但是,有一些APP,为了性能,会在发布版本中把NSLog重写为“什么都不做”,那这时再使用NSLog就看不到输出。这时,可以考虑用NSFileHandl来记录到文件,再打开文件查看输出,比如:

  1. NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/logme.txt"];
  2. NSFileManager *fileManager = [NSFileManager defaultManager];
  3. [fileManager createFileAtPath:path contents:nil attributes:nil];
  4. g_logfile = [NSFileHandle fileHandleForWritingAtPath:path];
  5. [g_logfile retain];
  6. [g_logfile seekToEndOfFile];
  7. NSString* info = @"-------MicroMessengerAppDelegate::didFinishLaunchingWithOptions\n";
  8. NSData* idata = [info dataUsingEncoding:NSUTF8StringEncoding];
  9. [g_logfile writeData:idata];

总结一下,本文简介了iOS逆向的准备工作,以及基础工具ssh/scp/socat的使用。这三个工具在以后的实战中会经常用到,虽然你也可以用其它工具来达到同样的目的(比如用p2p助手可以直接拷贝文件,甚至可以查看系统日志输出),但小程还是建议你掌握它们的使用。


iOS逆向开发(1):基础工具 | ssh | scp | socat的更多相关文章

  1. 20个可以帮你简化iOS app开发流程的工具

    这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是 ...

  2. iOS逆向开发(8):微信自动添加好友

    这一次,小程演示怎么让一个APP自动地运行,从而代替手工的操作.同样以"微信"以例,实现在一个微信群里面,对所有的成员,自动地一个一个地发出添加好友的请求. 知识点还是之前介绍的东 ...

  3. iOS逆向开发(4):注入目标函数 | fishhook | MobileSubstrate | MSHookFunction | iOSOpenDev

    从获得APP的所有类声明,到锁定目标类与函数,现在是时候注入函数了. 所谓"注入函数",小程的意思是让APP执行到小程写的代码中,跟"钩子"的概念一致.小程把个 ...

  4. iOS逆向开发(3):锁定APP的目标类与函数 | reveal | lldb | debugserver | 远程调试

    之前介绍了怎么获取APP的所有类的结构信息,这个有什么用呢?用处大了,比如以这一步为基础,下一步通过注入来做更多研究工作. 注入的最小单位是函数,实际上,编译执行的程序在编译后,类就不复存在了,留下来 ...

  5. iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted

    之前介绍了怎么操作越狱的iOS设备(以下简称为手机),但简单操作手机并不是目标,小程的目标是手机上特定的APP,比如微信.淘宝.QQ音乐等等,因为小程可以从这些APP上拿到一些有用的信息或资源--比如 ...

  6. iOS逆向开发(0):修改二进制代码与重签名 | hopper | codesigh

    小白:小程,你知道有些iOS程序是没人性的吗?老是不按我的意愿来运行! 小程:我怎么知道你的意愿就是有人性的? 本文解决一个问题:修改别人的二进制程序并运行起来. 让别人的程序按你的意愿来运行,文明一 ...

  7. iOS逆向工程之Reveal工具的安装、配置与使用

    今天博客内容比较简单,不过还是蛮重要的.经常有小伙伴在QQ上私下问我,说博客中是如何使用Reveal查看AppStore中下载应用的UI层级的,那么就在今天这篇博客中作为一个主题来统一的介绍一下吧.虽 ...

  8. iOS逆向开发(6):微信伪造位置

    仍然以微信为例,实战地练习一下使用Reveal.iOSOpenDev等工具注入APP的流程,积累经验.这一系列的文章都是学习过程的总结,不带任何商业目的. 本文解决一个问题:如何伪造一个经纬度,在微信 ...

  9. iOS逆向开发(5):微信强制升级的突破 | 多开 | 微信5.0

    接下来的几篇文章,小程以微信为例,实战地演示一下:如何注入iOS的APP.其中使用到的知识,基本在前面的文章中都有介绍到. 小白:小程,我想用回旧版本的微信! 小程:为什么要用旧版本微信呢? 小白:你 ...

随机推荐

  1. Deployment descriptor

    部署描述符是JavaEE程序常见的一部分,部署一个Servlet 3 或以上应用程序是一件轻而易举的事.通过Servlet注解,对于不太复杂的应用程序,甚至可以部署没有描述符的Servlet/JSP应 ...

  2. 用HTML做登录网页

    <html>  <head> 这里是文档的头部 ... ... ...<title>定义文档标题...</title> </head> &l ...

  3. ADO SQL手写分页

    //实现层 ---------------------------------------------------------分割线---------------------------------- ...

  4. MySQL 多表结构的创建与分析

    =====================多对一===================== create table press( id int primary key auto_increment, ...

  5. Day12 (黑客成长日记) 函数

    一.递归函数: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. #计算阶乘: def fact(n): if n == 1: return 1 return n ...

  6. 基于UML的时空建模

    一.基本信息 标题:基于UML的时空建模 时间:2018 出版源:东北大学学报(自然科学版) 领域分类:UML模型:RCC-8空间拓扑:Allen-13时态拓扑:时空数据:建模 二.研究背景 问题定义 ...

  7. 两台Linux机器传送文件

    https://www.cnblogs.com/lianrenjujishou/p/5458206.html

  8. 网络编程——I/O复用

    int select( int nfds, fd_set FAR* readfds, fd_set * writefds, fd_set * exceptfds, const struct timev ...

  9. 导入Dynamic Web Project后程序有红叉但是可以运行

    解决方法: 进入工程下的.setting文件夹,用记事本编辑org.eclipse.wst.common.project.facet.core.xml, 把<runtime name=" ...

  10. Hadoop集群及基本组件搭建

    本人采用一个master和两个slave的网络结构,具体搭建如下 1.准备安装包 1.下载安装包 http://pan.baidu.com/s/1jIoZulw 2.安装包清单 scala-2.12. ...