前言

Logos是CydiaSubstruct框架中提供的一组宏定义。利于开发者使用宏进行Hook操作,其语法简单,功能是非常强大且稳定。

详细内容logos语法为http://iphonedevwiki.net/index.php/Logos

语法

1. 全局

Logos语法分为三大类:

  • Block level:这类型的指令会开辟一个代码块,以%end结束。%group、%hook、%subclass、%end
  • Top level:TopLevel指令不放在BlockLevel中。%config、%hookf、%ctor、%dtor
  • Function level:这块指令放在方法中。%init、%class、%c、%orig、%log

2. 详解

2.1 %hook

指定需要hook住的class,必须要以%end结尾

%hook SpringBoard
- (void)_menuButtonDown:(id)down {
NSLog(@"你好");
%orig; // call the original __menuButtonDown
}
%end

意思是勾住(Hook)SpringBoard类中的_menuButtonDown,先打印下,再执行函数原本的操作。

2.2 %log

指令再%hook内部去使用,将函数的类名和参数等信息写入syslog。

%hoot SpringBoard
- (void)_menubuttonDown:(id)down
{
%log((NSString *)@"iOSRE",(NSString *)@"Debug");
%orig;//call the original _menuButtonDown;
}
%end

2.3 %orig

指令在%hook内部中使用,执行被hook住的函数原始代码

%hook SpringBoard
- (void)_menuButtonDown:(id)down
{
NSLog(@"你好");
%orig; //
}
%end

如果去掉了%orig,原始函数就不会被执行

hook SpringBoard
- (void)_menuButtonDown:(id)down
{
NSLog(@"你好");
}
%end

还可以利用%orig更改原始行数的参数。

%hook SBLockScreenDateViewController
- (void)setCustomSubtitleText:(id)arg1 withColor:(id)arg2
{
%orig(@"Red",arg2);
}
%end

2.4 %group

指令用于%hook分组,便于代码管理以及按条件初始化分组,也是必须要以%end结尾;%group中可以包含很多个%hook,所有不属于某一个自定义group中的%hook也将会被归类到%group_ungroupes中。

%group iOS11Hook
%hook iOS12Class
- (id)iOS11Method {
id result = %orig;
NSLog(@"This class & method only exist in iOS 11.");
return result;
} %end
%end // iOS11Hook %group iOS12Hook
%hook iOS12Class
- (id)iOS8Method {
id result = %orig;
NSLog(@"This class & method only exist in iOS 12."); return result;
}
%end
%end // iOS12Hook

2.5 %init

指令用于初始化某个%group,必须在%hook或者%ctor内调用;如果需要带参数,则初始化指定的group,如果不带参数时,就会初始化_ungrouped。只有调用了%init,其对应的%group才能够起到作用。

#ifndef kCFCoreFoundationVersionNumber_iOS_11_0
#define kCFCoreFoundationVersionNumber_iOS_11_0 1140.10 #endif
%hook SpringBoard
- (void)applicationDidFinishLaunching:(id)application {
%orig;
%init; // Equals to %init(_ungrouped)
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_12_0 && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_11_0)
%init(iOS12Hook);
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_11_0)
%init(iOS11Hook);
}
%end

2.6 %ctor

该指令完成初始化工作,如果不显示其定义,theos自动会生成%ctor,也会调用%init

%hook SpringBoard
- (void)reboot {
NSLog(@"If rebooting doesn't work then I'm screwed.");
%orig;
}
%end

成功生效,Theos隐式调用了内容如下

%ctor
{
%init(_ungrouped);
}

而

%hook SpringBoard
- (void)reboot{
NSLog(@"If rebooting doesn't work then I'm screwed.");
%orig;
}
%end %ctor
{
// Need to call %init explicitly!
}

其中的%hook无法生效,因显示定义了%ctor,却没有定义%ctor,不需要以%end结尾。一般用于初始化%group。

2.7 %new

在%hook内部中使用,给现有class增新函数,功能与class_addMethod意义相同。

%hook SpringBoard
%new
- (void)namespaceNewMethod {
NSLog(@"We've added a new method to SpringBoard.");
}
%end

%c

指令和objc_getClass或者NSClassFromString,动态获取一个类的定义。用于%hook和%ctor中使用。

总结如下

Demo

3.1 新建Logos工程

3.2 用class-dump来导出头文件

$class-dump -H -LogosDemo -o /Users/yaoqi/Desktop/LogosHeaders

3.3 新建MonkeyDev工程,将LogosDemo重签名

此时MonkeyDev工程将libsubstrate.dylib和RevealServer.framework注入了工程,里面有libsubstrate.dylib就可以利用logos语法了。

3.4 MonkeyDev中logos文件夹中的.xm写入Logos语法

_02_loginHookDemoDylib.xm

// See http://iphonedevwiki.net/index.php/Logos

#import <UIKit/UIKit.h>

@interface ViewController: UIViewController

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);
+ (void)CL_classMethod; @end %hook ViewController - (void)loginBtnClicked:(id)arg1 {
%log;
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Hook成功了!!!" message:nil preferredStyle:(UIAlertControllerStyleAlert)];
[alertVC addAction:[UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleCancel) handler:nil]];
[self presentViewController:alertVC animated:YES completion:nil];
} %new
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
[self.class CL_classMethod];
} %new
+ (void)CL_classMethod {
NSLog(@"这是一个类方法!!!");
} %end

3.5 运行,MonkeyDev工程能Hook到LogosDemo的loginBtnClicked

FLEX库

4.1 在MonkeyDev的Dylib动态库注入Flex库

在MonkeyDev根目录添加Podfile文件,Target为Monkey动态库的Target

platform :ios, '9.0'

target '002-loginHookDemoDylib' do
use_frameworks!
pod 'FLEX'
end

4.2 界面展示

FlEX可以查看App的文件、数据库、界面层级以及沙盒

实例练习

要求:微信首页加个“+”按钮,左边按钮和右边的效果一样。

5.1 新建MonkeyDev工程,重签名韦小宝,将FLEX加入到动态库

5.2 Xcode界面调试,Class-dump,找到界面NewMainFrameViewController控制器

5.3 Xcode界面调试,找到右边按钮的showRightTopMenuBtn方法

Target <NewMainFrameRightTopMenuBtn: 0x104dd99d0>
Action showRightTopMenuBtn

5.4 内存中查找导航栏右边按钮的视图

5.5 代码实现需求

#import <UIKit/UIKit.h>

@interface NewMainFrameViewController :UIViewController
@end @interface NewMainFrameRightTopMenuBtn: UIView
- (void)showRightTopMenuBtn;
@end @interface MMBarButtonItem: UIBarButtonItem
@property(nonatomic,weak)NewMainFrameRightTopMenuBtn *view;
@end %hook NewMainFrameViewController -(UINavigationItem *)navigationItem{
// NSLog(@"\n\n\n-------------navigationItem-----");
//方法交换! 调用自己!
return %orig;
} - (void)viewDidAppear:(_Bool)arg1{
%orig;
UIButton * leftBtn = [UIButton buttonWithType:(UIButtonTypeContactAdd)];
[leftBtn addTarget:self action:@selector(CL_leftClick) forControlEvents:(UIControlEventTouchUpInside)];
[self.navigationItem setLeftBarButtonItem: [[UIBarButtonItem alloc] initWithCustomView:leftBtn]];
} - (void)viewDidLoad{
%orig;
// NSLog(@"\n\n\n-----viewDidLoad-----------");
} %new
-(void)CL_leftClick
{
/**
从内存中能查到调用该方法:[self.navigationItem.rightBarButtonItem.view showRightTopMenuBtn]
self:代表NewMainFrameViewController控制器 */
MMBarButtonItem *btn = self.navigationItem.rightBarButtonItem;
[btn.view showRightTopMenuBtn];
} %end

5.6 实现结果

总结

上面就是Logos语法及讲解,如果对大家有所帮助,希望大家关注,也可以点个喜欢,下一篇我们将讲解越狱的相关知识,请大家准备好越狱手机和PP助手!!!

Logos讲解--逆向开发的更多相关文章

  1. Hook原理--逆向开发

    今天我们将继续讲解逆向开发工程另一个重要内容--Hook原理讲解.Hook,可以中文译为“挂钩”或者“钩子”,逆向开发中改变程序运行的一种技术.按照如下过程进行讲解 Hook概述 Hook技术方式 f ...

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

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

  3. MachO文件详解--逆向开发

    今天是逆向开发的第5天内容--MachO文件(Mac 和 iOS 平台可执行的文件),在逆向开发中是比较重要的,下面我们着重讲解一下MachO文件的基本内容和使用. 一.MachO概述 1. 概述 M ...

  4. OAuth的机制原理讲解及开发流程

    本想前段时间就把自己通过QQ OAuth1.0.OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oaut ...

  5. iOS逆向开发(1):基础工具 | ssh | scp | socat

    小白:小程,我一直想问,什么是逆向来着?是逆向行驶吗? 小程:理解为逆向行驶也没错.一般的项目是从无到有,而逆向是从已有的状态入手,分析出已有的流程与结构的手段. iOS上的逆向开发,是一件有趣的事情 ...

  6. PHP服务器端API原理及示例讲解(接口开发)

    http://www.jb51.net/article/136816.htm 下面小编就为大家分享一篇PHP服务器端API原理及示例讲解(接口开发),具有很好的参考价值,希望对大家有所帮助 相信大家都 ...

  7. 2021年正确的Android逆向开发学习之路

    2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...

  8. 免越狱tweak应用逆向开发

    对于已越狱的设备,系统默认安装了mobilesubstrate动态库,提供一个系统级的入侵管道,所有的tweak都可以依赖它来进行开发.而对于没有越狱的手机,我们需要向目标app注入libsubstr ...

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

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

随机推荐

  1. 修改tomcat默认使用的jdk版本

    1.windows平台 在csetclasspath.bat文件开头加上如下两句(指定JDK): set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_79  se ...

  2. CSPS模拟 100

    我又挂分了T_T 这么吉利的数字..本来想考的好一点的 T1 没加当前弧优化(其实也不会),若志了 各种低错连篇而且没想到点不联通..没有奇度点就直接从1开始搜了 于是喜提70(犯了这两个若志错误应该 ...

  3. PCA降维的原理、方法、以及python实现。

    PCA(主成分分析法) 1. PCA(最大化方差定义或者最小化投影误差定义)是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了.那么PCA的核心思想是什么呢? 例如D ...

  4. What's your name?

    Hello. My name is james. What's your name? Hi, I'm Jessica. Nice to meet you. Nice to meet you, too. ...

  5. 因为 GitHub Actions 我发现了 Jake Wharton 的一个仓库

    本文微信公众号「AndroidTraveler」首发. 背景 昨天(2019-11-14)上去 GitHub 上面一看,结果来了个下面的提示: 点进去一看: 看来是自动化构建相关的. 那就试一下,选了 ...

  6. node.js评论列表和添加购物车数据库表创建

    2.1:评论列表--发表评论 用户点击新闻列表某一条新闻,看到新闻详细发表评论 -用户输入评论内容 -发表评论 [将用户评论内容保存数据库 xz_comment] 2.2:评论列表--发表评论-开发评 ...

  7. python基础-匿名函数和内置函数

    匿名函数和内置函数 匿名函数:没有名字,使用一次即被收回,加括号就可以运行的函数. 语法:lambda 参数:返回值 使用方式: 将匿名函数赋值给变量,给匿名函数一个名字,使用这个变量来调用(还不如用 ...

  8. 【原创】使用批处理脚本自动生成并上传NuGet包

    Hello 大家好,我是TANZAME,我们又见面了. NuGet 是什么这里就不再重复啰嗦,园子里一搜一大把.今天要跟大家分享的是,在日常开发过程中如何统一管理我们的包,如何通过批处理脚本生成包并自 ...

  9. linux系统LNMP环境部署

    源码安装 nginx# yum -y install gcc openssl-devel# useradd -s /sbin/nologin nginx# tar xf nginx-1.14.0.ta ...

  10. (C#)WPF:关于INotifyPropertyChanged接口的介绍

    注意:INotifyPropertyChanged接口位于System.CompenentModel名称空间中,想使用INotifyPropertyChanged接口时,头文件需添加“using Sy ...