iOS逆向之iOSOpenDev
上篇谈到使用TheOS进行越狱开发,但是流程相对而言较复杂,本篇我们谈一下iOSOpenDev进行越狱开发。通过使用iOSOpenDev,我们可以使用Xcode进行开发、编译、生成并运行到设备上。
1.安装iOSOpenDev
- 打开网址:http://iosopendev.com/download/,选择“iOSOpenDev 1.6-2 Installer”,下载完成之后,直接安装pkg文件。在安装过程中,有可能出现失败,按照 这篇文章 介绍的方法,进行处理。
- 安装成功后,打开XCode,新建工程,我们可以看到iOSOpenDev已经集成在XCode中了,并附带了很多模板:
2.使用iOSOpenDev
第一步:新建工程,这里选择“Logos Tweak”,新建完成之后,工程结构如下图所示:
可以看到有一个.xm文件,我们打开看一下内容:
// Logos by Dustin Howett
// See http://iphonedevwiki.net/index.php/Logos #error iOSOpenDev post-project creation from template requirements (remove these lines after completed) -- \
Link to libsubstrate.dylib: \
(1) go to TARGETS > Build Phases > Link Binary With Libraries and add /opt/iOSOpenDev/lib/libsubstrate.dylib \
(2) remove these lines from *.xm files (not *.mm files as they're automatically generated from *.xm files) %hook ClassName + (id)sharedInstance
{
%log; return %orig;
} - (void)messageWithNoReturnAndOneArgument:(id)originalArgument
{
%log; %orig(originalArgument); // or, for exmaple, you could use a custom value instead of the original argument: %orig(customValue);
} - (id)messageWithReturnAndNoArguments
{
%log; id originalReturnOfMessage = %orig; // for example, you could modify the original return value before returning it: [SomeOtherClass doSomethingToThisObject:originalReturnOfMessage]; return originalReturnOfMessage;
} %end
.xm文件提示需要链接 libsubstrate.dylib,另外看一下很多%开头的语句。%是Legos中的指示符,和TheOS中一样。
这里先把.xm文件的内容清空,然后ibsubstrate.dylib链接进来,另外也把UIKit(因为我们需要一个提示框显示信息)链接进来:
和TheOS一样,这里我们也只是显示一个Alert框,代码也一样:
#import <UIKit/UIKit.h> %hook SpringBoard -(void)applicationDidFinishLaunching:(id)application {
%orig; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello, Gof!" message:@"LeeGof is very handsome" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
} %end
再看一下.mm文件,已经自动根据.xm文件生成了如下代码:
#line 1 "/Users/GofLee/Desktop/逆向工程/code/TweakDemo/TweakDemo/TweakDemo.xm"
#import <UIKit/UIKit.h> #include <substrate.h>
#if defined(__clang__)
#if __has_feature(objc_arc)
#define _LOGOS_SELF_TYPE_NORMAL __unsafe_unretained
#define _LOGOS_SELF_TYPE_INIT __attribute__((ns_consumed))
#define _LOGOS_SELF_CONST const
#define _LOGOS_RETURN_RETAINED __attribute__((ns_returns_retained))
#else
#define _LOGOS_SELF_TYPE_NORMAL
#define _LOGOS_SELF_TYPE_INIT
#define _LOGOS_SELF_CONST
#define _LOGOS_RETURN_RETAINED
#endif
#else
#define _LOGOS_SELF_TYPE_NORMAL
#define _LOGOS_SELF_TYPE_INIT
#define _LOGOS_SELF_CONST
#define _LOGOS_RETURN_RETAINED
#endif @class SpringBoard;
static void (*_logos_orig$_ungrouped$SpringBoard$applicationDidFinishLaunching$)(_LOGOS_SELF_TYPE_NORMAL SpringBoard* _LOGOS_SELF_CONST, SEL, id); static void _logos_method$_ungrouped$SpringBoard$applicationDidFinishLaunching$(_LOGOS_SELF_TYPE_NORMAL SpringBoard* _LOGOS_SELF_CONST, SEL, id); #line 3 "/Users/GofLee/Desktop/逆向工程/code/TweakDemo/TweakDemo/TweakDemo.xm" static void _logos_method$_ungrouped$SpringBoard$applicationDidFinishLaunching$(_LOGOS_SELF_TYPE_NORMAL SpringBoard* _LOGOS_SELF_CONST self, SEL _cmd, id application) {
_logos_orig$_ungrouped$SpringBoard$applicationDidFinishLaunching$(self, _cmd, application); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello, Gof!" message:@"LeeGof is very handsome" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
} static __attribute__((constructor)) void _logosLocalInit() {
{Class _logos_class$_ungrouped$SpringBoard = objc_getClass("SpringBoard"); if (_logos_class$_ungrouped$SpringBoard) {MSHookMessageEx(_logos_class$_ungrouped$SpringBoard, @selector(applicationDidFinishLaunching:), (IMP)&_logos_method$_ungrouped$SpringBoard$applicationDidFinishLaunching$, (IMP*)&_logos_orig$_ungrouped$SpringBoard$applicationDidFinishLaunching$);} else {HBLogError(@"logos: nil class %s", "SpringBoard");}} }
#line 13 "/Users/GofLee/Desktop/逆向工程/code/TweakDemo/TweakDemo/TweakDemo.xm"
接着我们看一下Target中的“User-Defined”:
在这里,配置“iOSOpenDevDevice”字段为联调的设备IP。直接连接真机运行(选择Build For -- Profiling),可以看到代码已经生效。如下图所示:
3.常见错误
错误一:Failed to create directory /var/root/iOSOpenDevPackages on device 10.1.xx.xx,如下图所示:
【解决方案】:在终端输入如下指令:
iosod sshkey -h 10.1.xx.xx
重新再试即可。
错误二:运行的时候,有可能出现这样的错误:Use of undeclared identifier 'HBLogError',如下图所示:
【解决方案】:在.xm文件中加入如下宏定义:
#define HBLogError NSLog
iOS逆向之iOSOpenDev的更多相关文章
- iOS逆向开发(1):基础工具 | ssh | scp | socat
小白:小程,我一直想问,什么是逆向来着?是逆向行驶吗? 小程:理解为逆向行驶也没错.一般的项目是从无到有,而逆向是从已有的状态入手,分析出已有的流程与结构的手段. iOS上的逆向开发,是一件有趣的事情 ...
- iOS逆向分析app
适合有一定的逆向编程基础的人看. 背景:自动抢红包的脚本工具:cyscript,reveal,class-dump,越狱的pod等. 这里先上一张reveal的分析图: 小结:获取到了真个软件的整体结 ...
- iOS 逆向之ARM汇编
最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...
- ios逆向过程中lldb调试技巧
在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便 一般的命令: 1.image list -o -f 看看各个模块在内存中的基址 2.register read r0 读取寄存器r0的 ...
- iOS逆向+越狱
感觉本文涉及内容有点多的,但是自己不愿意写太多,就简单的谢谢关于ios上手的东西吧 初级入手不免要用到,pp助手,i4 tools等 iOS逆向-ipa包重签名及非越狱手机安装多个应用 1.常识 我们 ...
- 偏执的iOS逆向研究员:收集全版本的macOS iOS+越狱+内核调试
Intro 虽然“只有偏执狂才能够生存”这句话已经被假药停给毁了,但是作为一只有逼格的高大上的iOS逆向分析研究员,难道如果有现成的macOS/iOS全版本镜像可以下载并且无限“漫游”,难道你就不想来 ...
- iOS逆向实战与工具使用(微信添加好友自动确认)
iOS逆向实战与工具使用(微信添加好友自动确认) 原文链接 源码地址 WeChatPlugin-iOS Mac OS 版微信小助手(远程控制.消息防撤回.自动回复.微信多开) 一.前言 本篇主要实现在 ...
- iOS逆向(五)-ipa包重签名
为什么要重签名? 1.在没有源代码的情况下,你已经对某个应用进行了资源修改(比如修改了启动图或图标等).修改完成以后,如果想要让APP可以正常使用,该APP一定要重新签名然后压缩成IPA文件. 2.如 ...
- iOS逆向系列-脱壳
概述 通过iOS逆向系列-逆向App中使用class-dump工具导出App的Mach-O文件所有头文件.Hopper工具分析App的Mach-O文件代码大概实现.但是这些前体是App的Mach-O没 ...
随机推荐
- Mac平台下部署UE4工程到iOS设备的流程
1.开发环境 UE4.Xcode.iOS版本情况如下: 1.UE4:当前最新版本Unreal Engine 4.17.2. 2.Xcode:当前最新版本Xcode9.0. 3.iOS:当前最新版本iO ...
- django session 的简单操作
#!SESSION_SAVE_EVERY_REQUEST = True 设置根据最后一次操作设置登录超时时间#!SESSION_EXPIRE_AT_BROWSER_CLOSE = True 设置是否关 ...
- leetcode494
public class Solution { public int FindTargetSumWays(int[] nums, int S) { Queue<int> Q = new Q ...
- Zabbix Agent 源码编译安装
简介: 单独整理一下 Zabbix Agent . 1.安装包选择 下载地址:http://www.zabbix.com/download.php 这里有两种源码包,一种是安装 Zabbix Serv ...
- [phvia/firman] PHP多进程服务器模型中的惊群
[ 典型场景 ] 典型的多进程服务器模型是这样的,主进程绑定ip,监听port,fork几个子进程,子进程安装信号处理器,随后轮询资源描述符检查是否可读可写: 子进程的轮询又涉及到 IO复用,acce ...
- Eclipse 如何查看源代码
Eclipse 关联源代码:
- CSS 盒子投影
box-shadow 属性可以设置盒子的投影效果.它的原理同文本投影一样.字体风格一节有介绍. 它有4个值,同时使用,也可以有选择地使用: 第一个值 设置阴影左右延伸长度,负值向左,正值向右 第二个值 ...
- JS 操作样式 style
1. 任何支持 style 特性的 HTML 元素在 JavaScript 中都对应着有一个 style 属性,指向一个 CSSStyleDeclaration 的一个实例对象,包含该元素的内嵌sty ...
- Python设计模式 - UML - 包图(Package Diagram)
简介 包图是对各个包及包之间关系的描述,展现系统中模块与模块之间的依赖关系.一个包图可以由任何一种UML图组成,可容纳的元素有类.接口.组件.用例和其他包等.包是UML中非常常用的元素,主要作用是分类 ...
- 手游开发之lua的table 元表的运用
元表在项目中的运用,其中就包括元方法这点.元方法是指__index和__newIndex,下面我总结下,更详细的例子讲解可以参考<lua程序设计 第2版>的第13章内容.长h短说,简言之有 ...