ios逆向开发教程,iOS逆向开发

ios逆向笔记之反调试 以及反反调试 和反反反调试 ptrace篇

1.ptrace(process trace进程跟踪)

你所需要的网站建设服务,我们均能行业靠前的水平为你提供.标准是产品质量的保证,主要从事成都做网站、网站设计、外贸营销网站建设企业网站建设、手机网站开发、网页设计、品牌网站建设、网页制作、做网站、建网站。创新互联建站拥有实力坚强的技术研发团队及素养的视觉设计专才。

为了方便软件的开发和调试 ,UNIX早期版本就提供了一种对运行进程进行跟踪和控制的手段,那就是系统调用ptrace.通过ptrace可以实现对另一个进程实现调试和跟踪.同时,ptrace提供了一个非常有用的参数,那就是PT_DENY_ATTACH,这个参数用于告诉系统阻止调试器依附

我们创建一个mac项目 因为ptrace在iphone上不提供头文件

/*

* Copyright(c)2000-2005 Apple Computer,Inc. All rights reserved.

*

* @APPLE_OSREFERENCE_LICENSE_HEADER_START@

*

* This file contains Original Code and/or Modifications of Original Code

* as defined in and that are subject to the Apple Public Source License

* Version 2.0(the 'License'). You may not use this file except in

* compliance with the License. The rights granted to you under the License

* may not be used to create,or enable the creation or redistribution of,

* unlawful or unlicensed copies of an Apple operating system,or to

* circumvent,violate,or enable the circumvention or violation of,any

* terms of an Apple operating system software license agreement.

*

* Please obtain a copy of the License at

* and read it before using this file.

*

* The Original Code and all software distributed under the License are

* distributed on an 'AS IS' basis,WITHOUT WARRANTY OF ANY KIND,EITHER

* EXPRESS OR IMPLIED,AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,

* INCLUDING WITHOUT LIMITATION,ANY WARRANTIES OF MERCHANTABILITY,

* FITNESS FOR A PARTICULAR PURPOSE,QUIET ENJOYMENT OR NON-INFRINGEMENT.

* Please see the License for the specific language governing rights and

* limitations under the License.

*

* @APPLE_OSREFERENCE_LICENSE_HEADER_END@

*/

/* Copyright(c)1995 NeXT Computer,Inc. All Rights Reserved */

/*-

* Copyright(c)1984,1993

*    The Regents of the University of California.  All rights reserved.

*

* Redistribution and use in source and binary forms,with or without

* modification,are permitted provided that the following conditions

* are met:

* 1. Redistributions of source code must retain the above copyright

*    notice,this list of conditions and the following disclaimer.

* 2. Redistributions in binary form must reproduce the above copyright

*    notice,this list of conditions and the following disclaimer in the

*    documentation and/or other materials provided with the distribution.

* 3. All advertising materials mentioning features or use of this software

*    must display the following acknowledgement:

*    This product includes software developed by the University of

*    California,Berkeley and its contributors.

* 4. Neither the name of the University nor the names of its contributors

*    may be used to endorse or promote products derived from this software

*    without specific prior written permission.

*

* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

* ANY EXPRESS OR IMPLIED WARRANTIES,INCLUDING,BUT NOT LIMITED TO,THE

* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

* FOR ANY DIRECT,INDIRECT,INCIDENTAL,SPECIAL,EXEMPLARY,OR CONSEQUENTIAL

* DAMAGES(INCLUDING,BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS

* OR SERVICES;LOSS OF USE,DATA,OR PROFITS;OR BUSINESS INTERRUPTION)

* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,WHETHER IN CONTRACT,STRICT

* LIABILITY,OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY

* OUT OF THE USE OF THIS SOFTWARE,EVEN IF ADVISED OF THE POSSIBILITY OF

* SUCH DAMAGE.

*

*    @(#)ptrace.h    8.2(Berkeley)1/4/94

*/

#ifndef _SYS_PTRACE_H_

#define _SYS_PTRACE_H_

#include sys/appleapiopts.h

#include sys/cdefs.h

enum {

ePtAttachDeprecated __deprecated_enum_msg("PT_ATTACH is deprecated. See PT_ATTACHEXC")= 10

};

#define PT_TRACE_ME    0      /* child declares it's being traced */

#define PT_READ_I      1      /* read word in child's I space */

#define PT_READ_D      2      /* read word in child's D space */

#define PT_READ_U      3      /* read word in child's user structure */

#define PT_WRITE_I      4      /* write word in child's I space */

#define PT_WRITE_D      5      /* write word in child's D space */

#define PT_WRITE_U      6      /* write word in child's user structure */

#define PT_CONTINUE    7      /* continue the child */

#define PT_KILL        8      /* kill the child process */

#define PT_STEP        9      /* single step the child */

#define PT_ATTACH      ePtAttachDeprecated    /* trace some running process */

#define PT_DETACH      11      /* stop tracing a process */

#define PT_SIGEXC      12      /* signals as exceptions for current_proc */

#define PT_THUPDATE    13      /* signal for thread# */

#define PT_ATTACHEXC    14      /* attach to running process with signal exception */

#define PT_FORCEQUOTA  30      /* Enforce quota for root */

#define PT_DENY_ATTACH  31

#define PT_FIRSTMACH    32      /* for machine-specific requests */

__BEGIN_DECLS

int    ptrace(int _request,pid_t _pid,caddr_t _addr,int _data);

__END_DECLS

#endif  /* !_SYS_PTRACE_H_ */

2.写入函数

/**

arg1:ptrace要做的事情

arg2:要操作进程的ID

arg3(地址)\arg4(数据):取决于arg1

*/

ptrace(PT_DENY_ATTACH,0,0,0);

然后我们来Xcode调试发现进程断开了 这样就做到了防止调试

思考 :

我们首先思考下 ptrace是系统函数 我们hook系统函数的fishhook刚好可以解决这个问题 那么我们接下来我们hook这个ptrace这个函数

1).我们新建一个动态库

为了防止被其他人注入动态库hook我的函数 我可以自己注入动态库先调用ptarce

这里要注意一点 

1)工程优先加载自己工程的动态库 

2)然后加载注入的动态库 按照添加编译的顺序执行

3)最后加载我们的target 按照添加编译的顺序执行

按照这个原理我们就可以防止别人注入动态库

iOS 逆向(一)

学习了一段时间的iOS逆向工程,在此记录一下学习中的遇到的问题和知识点

iOS逆向必须要有一个越狱手机,最好是完美越狱的手机

爱思助手 或者 pp助手 中有详细的讲解,最好用ARM64位的手机,iPhone5s(以上)。

判断手机是否越狱:判断手机上是否安装了Cydia

SSH

Secure Shell的缩写,意为“安全外壳协议”,是一种可以为远程登录提供安全保障的协议

使用SSH,可以把所有传输的数据进行加密,“中间人”攻击方式就不可能实现,能防止DNS欺骗和IP欺骗

OpenSSH

是SSH协议的免费开源实现

可以通过OpenSSH的方式让Mac远程登录到iPhone

在iPhone上通过Cydia安装OpenSSH工具(软件源 )

很多人会将SSH、OpenSSH、SSL、OpenSSL搞混

SSL

Secure Sockets Layer的缩写,是为网络通信提供安全及数据完整性的一种安全协议,在传输层对网络连接进行加密

OpenSSL

SSL的开源实现

绝大部分HTTPS请求等价于:HTTP + OpenSSL

OpenSSH的加密就是通过OpenSSL完成的

查看SSH版本(查看配置文件的Protocol字段)

客户端:/etc/ssh/ssh_config

服务端:/etc/ssh/sshd_config

SSH的通信过程可以分为3大主要阶段

建立安全连接

客户端认证

数据传输

SSH-2提供了2种常用的客户端认证方式

基于密码的客户端认证

使用账号和密码即可认证

基于密钥的客户端认证

免密码认证

最安全的一种认证方式

SSH-2默认会优先尝试“密钥认证”,如果认证失败,才会尝试“密码认证”

在客户端生成一对相关联的密钥(Key Pair):一个公钥(Public Key),一个私钥(Private Key)

ssh-keygen

一路敲回车键(Enter)即可

OpenSSH默认生成的是RSA密钥,可以通过-t参数指定密钥类型

生成的公钥:~/.ssh/id_rsa.pub

生成的私钥:~/.ssh/id_rsa

把客户端的公钥内容追加到服务器的授权文件(~/.ssh/authorized_keys)尾部

ssh-copy-id root@服务器主机地址

需要输入root用户的登录密码

ssh-copy-id会将客户端 /.ssh/id_rsa.pub的内容自动追加到服务器的 /.ssh/authorized_keys尾部

注意:由于是在~文件夹下操作,所以上述操作仅仅是解决了root用户的登录问题(不会影响mobile用户)

可以使用ssh-copy-id将客户端的公钥内容自动追加到服务器的授权文件尾部,也可以手动操作

复制客户端的公钥到服务器某路径

scp ~/.ssh/id_ rsa.pub root@服务器主机地址:~

scp是secure copy的缩写,是基于SSH登录进行安全的远程文件拷贝命令,把一个文件copy到远程另外一台主机上

上面的命令行将客户端的 /.ssh/id_rsa.pub拷贝到了服务器的 地址

SSH登录服务器

ssh root@服务器主机地址

需要输入root用户的登录密码

在服务器创建.ssh文件夹

mkdir .ssh

追加公钥内容到授权文件尾部

cat ~/id_rsa.pub ~/.ssh/authorized_keys

删除公钥

rm ~/id_rsa.pub

端口就是设备对外提供服务的窗口,每个端口都有个端口号(范围是0~65535,共2^16个)

有些端口号是保留的,已经规定了用途,比如

21端口提供FTP服务

80端口提供HTTP服务

22端口提供SSH服务(可以查看/etc/ssh/sshd_config的Port字段)

更多保留端口号:

默认情况下,使用22端口进行SSH通信,采用的是TCP协议,Mac是通过网络连接的方式SSH登录到iPhone,要求iPhone连接WiFi

为了加快传输速度,也可以通过USB连接的方式进行SSH登录

Mac上有个服务程序usbmuxd(它会开机自动启动),可以将Mac的数据通过USB传输到iPhone

/System/Library/PrivateFrameworks/MobileDevice.framework/Resources/usbmuxd

注意:要想保持端口映射状态,不能终止此命令行(如果要执行其他终端命令行,请新开一个终端界面)

不一定非要10010端口,只要不是保留端口就行

端口映射完毕后,以后如果想跟iPhone的22端口通信,直接跟Mac本地的10010端口通信就可以了

新开一个终端界面,SSH登录到Mac本地的10010端口(以下方式2选1)

ssh root@localhost -p 10010

ssh root@127.0.0.1 -p 10010

localhost是一个域名,指向的IP地址是127.0.0.1,本机虚拟网卡的IP地址

usbmuxd会将Mac本地10010端口的TCP协议数据,通过USB连接转发到iPhone的22端口

远程拷贝文件也可以直接跟Mac本地的10010端口通信

scp -P 10010 ~/Desktop/1.txt root@localhost:~/test

将Mac上的 /Desktop/1.txt文件,拷贝到iPhone上的 /test路径

注意:scp的端口号参数是大写的-P

cycript 开启

cycript -p 进程ID

cycript -p 进程名称

取消输入:Ctrl + C

退出:Ctrl + D

清屏:Command + R

ps命令是process status的缩写,使用ps命令可以列出系统当前的进程

列出所有的进程

ps –A

ps aux

搜索关键词

ps –A | grep 关键词

顾名思义,它的作用就是把Mach-O文件的class信息给dump出来(把类信息给导出来),生成对应的.h头文件

官方地址:

iOS-逆向22-砸壳

应用加壳(加密)

提交给Appstore发布的App,都经过官方保护而加密,这样可以保证机器上跑的应用是苹果审核过的,也可以管理软件授权。经过App Store加密的应用,我们无法通过Hopper等反编译静态分析,也无法Class-Dump,在逆向分析过程中需要对加密的二进制文件进行解密才可以进行静态分析,这一过程就是大家熟知的砸壳(脱壳)

应用砸壳(解密)

静态砸壳

静态砸壳就是在已经掌握和了解到了壳应用的加密算法和逻辑后在不运行壳应用程序的前提下将壳应用程序进行解密处理。静态脱壳的方法难度大,而且加密方发现应用被破解后就可能会改用更加高级和复杂的加密技术

动态砸壳

动态砸壳就是从运行在进程内存空间中的可执行程序映像(image)入手,来将内存中的内容进行转储(dump)处理来实现脱壳处理。这种方法实现起来相对简单,且不必关心使用的是何种加密技术。

Clutch是由KJCracks开发的一款开源砸壳工具。工具支持iPhone、iPod Touch、iPad,该工具需要使用iOS8.0以上的越狱手机应用。

otool -l QQ,查看可执行文件QQ结构

越狱插入,不污染三方应用的插件

非越狱的注入

Github开源工具。 dumpdecrypted这个工具就是通过建立一个名为dumpdecrypted.dylib的动态库,插入目标应用实现脱壳。

该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件。

解决办法

遇到警告,sudo后面加-H

进入/opt/MonkeyDev/bin目录执行frida-ps列出所有进程

frida-ps -U此时列出USB连接的进程

frida的作用:

/opt/MonkeyDev/bin下直接进入具体应用

frida -U 微信

报错是因为我的手机里面安装了一个正版微信,一个砸壳微信

frida -U 支付宝,前提是支付宝在前台运行,可正常进入,并能执行frida语句,语法见 官网 doc

解决办法是将dump.py中的python改为python3,python版本是2改为python2,是python3就改为python3,通过python --version查看当前版本

scp -P 12345 .inputrc root@localhost:/var/root/

iOS 逆向----otool命令入门

首先可以拿自己的ipa包进行尝试。

选择你的ipa包,然后把后缀名改为zip,解压缩得到Payload文件夹,里面就是你的APP。

打开终端,直接cd到你的xxxx.app目录下。具体做法,输入cd,然后把xxxx.app直接拖到终端里打个回车。

然后输入otool,会显示如下内容:

有兴趣的同学可以仔细研究一下每个命令是干吗用的,这里介绍几个常用命令:

可执行文件的名称可以右键xxxx.app文件,选择显示包内容,然后找到里面的exec文件,把名字打进去。一般来说这个文件的名字跟xxxx是一样的

然后奇迹就出现了。。。

是不是很熟悉?这个命令列出了你使用的所有库的名字。

查看ipa包是否加壳:

其中cryptid代表是否加壳,1代表加壳,0代表已脱壳。我们发现打印了两遍,其实代表着该可执行文件支持两种架构armv7和arm64.

这里给大家推荐一个自动化检测的神器:

MobSF

根据Document的提示自行研究一下吧。

iOS逆向工程(4)SSH免密码连接iPhone

先摘抄一段简单介绍:

安全外壳协议(SSH)是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议。SecureShell,又可记为SSH,最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。

在我理解就是类似Windows 系统上面的Telnet,但是SSH相对于Telnet的一个重要优势就是所有传输都是经过加密的。

在iOS中我们使用OpenSSH软件。

OpenSSH原是一个在Linux下很实用的一个软件。iPhone本身就是一个运行BSD系统(可认为是一种Liunx)的硬件,因此,Cydia的作者Saurik把OpenSSH这一软件移植到了iOS平台上,并且简化了安全认证密钥的繁琐,使之成为一款可以在iPhone上运行的Cydia插件。

在iOS的系统管理中,多半是使用命令行。在远程管理中,多半是用OpenSSH通过Wi-Fi或者3G来对iPhone、iPad、iPod Touch执行命令修改文件等操作。

OpenSSH用途是在PC或者Mac上远程输入命令操作iOS设备,免去使用MobileTerminal,同时,也是一种在多系统下管理iPhone、iPad系统文件的方法。

连接到iPhone后可以执行各种UNIX命令,比如文件操作,拷贝删除,等等很多用途。

如果没有配置SSH免密码连接,那么我们在连接SSH的时候就会提示输入密码,每次都要输入很麻烦,比如:

1,如果本人是做iOS开发的,项目用到了GIT版本控制,一般都配置SSH密钥了。密钥已经存在了电脑的./ssh目录中,如果没有配置,那么可手动重新生成SSH密钥,比如:

ssh-keygen -t rsa -b 4096 -C "zhangdasen@126.com"

2,生成完成后,我们会在./ssh目录中发现id_rsa.pub公钥这个文件。

然后我们把它copy出来放到个人目录下,并重命名,比如:

cp /Users/zhangdasen/.ssh/id_rsa.pub ~/authorized_keys

3,我们手动SSH进入设备中,或者通过PP助手进入设备中,查看是否存在var/root/.ssh目录,如果没有,我们手动创建下。可通过SSH连接后mkdir创建,或者PP助手连接后创建。

4,创建后我们把authorized_keys拷贝到设备中,可利用SCP命令:

scp ~/authorized_keys root@10.10.245.208:/var/root/.ssh

5,然后按正常我们就可以直接SSH连接的时候不用输入密码了,如图:

6,这个时候,如果我们使用tweak打包时候,也不会再让我们输入SSH密码了。

下一篇: iOS逆向工程(8) 一条命令砸壳(详细菜鸟版)


本文标题:ios逆向开发教程,iOS逆向开发
文章出自:http://ybzwz.com/article/dssgpsd.html