写作背景
最近自己利用业余时间研究了一点点逆向的皮毛,在此做个记录,坑还是有的,也是个以后再次学习做个铺垫吧。
前期准备工作
需要的硬件:
一部iOS的设备(有没有越狱都可以),区别在于:
·如果是越狱设备,那么我们可以自己在App Store下载正版软件自己去砸壳再做逆向。
·如果是非越狱设备,那么我们只能从一些助手下载越狱过的,也就是砸过壳的App去做逆向。
·本人是非越狱设备,所以本文重点讲第二种方法。
需要的软件:
MonkeyDev 主要工具
pp助手 管理手机工具,下载越狱ipa
reveal 查看app的图层和类名
具体步骤
1、安装MonkeyDev
具体操作请查看官方帮助文档,这里只记录一下我遇到的问题,可能大家也会遇到。
·当执行brew install ldid时提示-bash: brew: command not found 。这是因为brew未安装,运行/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"即可
2、创建MonkeyApp项目
安装好环境后,重启Xcode,新建工程,往下拉,选择MonkeyApp。
然后填写Product Name,不需要管Target App。创建完成,就会得到这样一个工程。
3、拖入编译
然后就可以设置Team,编译,运行了。注意这里只能真机运行。还有需要注意的是MonkeyApp目前只支持普通app,不支持扩展(appex),如果您的app有扩展,使用MonkeyApp时,会将所有的扩展删除。
现在可以看到运行效果了,与原本的App没有两样。现在先不要去玩app,看一看其他的东西。
4、class-dump
顾名思义,就是用来dump目标对象的class信息的工具。它利用Objective-c语言的runtime特性,将存储在Mach-O文件中的头文件信息提取出来,并生成对应的.h文件。
MonekeyDev很贴心的集成了class-dump功能,可以再build settings最下面开启该功能。
默认值为NO,设置为YES后开启,再次build一下工程,就可以在工程目录下,看到该app的所有头文件信息了,然后我们就可以从这些头文件中进行探索了。
5、用Reveal进行查看
随便点一个view,可以看到它所属的控制器的名字
6、代码注入
在工程中找到这个文件这时我们就可以在 项目名Dylib.xm中 对某个view做一些我们想做的事情。
注入格式:
%hook view的名字
%end
·如果方法有返回值,那么一定要返回,你可以直接返回nil,但不能不返回。
例:你要对下面函数的方法进行注入
%hook ShelfViewController
- (int)numberOfSectionsInCollectionView:(id)arg1
{//注入代码。。。。。。
return %orig();// %orig这个是调用原代码的方法,比如源代码返回1,那么%orig也是等于1
}
%end
·如果没有返回值,那么直接什么都不写,这样原先方法就会被hook掉,不会被执行原代码。
例:你要hook掉下面函数方法
%hook AppDelegate
- (void)applicationWillTerminate:(id)arg1{}
- (void)applicationDidBecomeActive:(id)arg1{}
- (void)applicationWillEnterForeground:(id)arg1{}
- (void)applicationDidEnterBackground:(id)arg1{}
- (void)applicationWillResignActive:(id)arg1{}
%end
·这样一个简单的hook app就这样完成了,这是最简单的hook程序,还有一些困难的,比如修改源码,修改判断if,这些就需要更多的软件去辅助。
学逆向不是为了去破解别人的app,对我来说,最重要的是为了防止别人破解自己的app,我们从逆向的过程中学习,想象自己的app如果被别人拿去,如何才能不被反编译,不被hook。
正向和逆向不会冲突,只要一起学习,才能更好的加深自己对于开发的理解,做出更好的程序。
参考链接:
网友评论