前言

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. 基于SkyWalking的分布式跟踪系统 - 异常告警

    通过前面2篇文章我们搭建了SW的基础环境,监控了微服务,能了解所有服务的运行情况.但是当出现服务响应慢,接口耗时严重时我们需要立即定位到问题,这就需要我们今天的主角--监控告警,同时此篇也是SW系列的 ...

  2. MinIO 搭建

    MinIO 搭建 MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务.它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文 ...

  3. ApplicationContext refresh 过程及一些重要的 processor 解析

    回顾 上文 其实我们已经实现了一个简单的 BeanFactory 它具的功能有 注册 Bean 到容器,通过限定名获取 Bean 可以拦截 Bean 初始化前后的处理 可以在 Bean 属性注入后和即 ...

  4. Docker实战总结

    >>> 目录 <<< Docker简介 Docker优势 Docker基本概念 Docker安装使用 Docker常用命令 Docker镜像构建 Docker本地仓 ...

  5. 【Canvas真好玩】从黑客帝国开始

    前言 笔者之前有一段时间一直在学习Canvas相关的技术知识点,通过参考网上的一些资料文章,学着利用简单的数学和物理知识点实现了一些比较有趣的动画效果,最近刚好翻看到以前的代码,所以这次将这些代码实践 ...

  6. 中文企业云操作系统 CecOS

    CecOS介绍 CecOS(原中文企业云操作系统.第一个版本基于oVirt 3.0,后续在此基础上不断升级迭代拓展至今,已形成基于基础底层和应用功能拓展集成在内的10款产品和四大平台),旨在通过先进的 ...

  7. nuxt.js 部署静态页面[dist]到gh-pages

    一. 1.添加package.json { "name": "nuxtweb001", "version": "1.0.0&quo ...

  8. unittest使用总结

    unittest简介 Unittest是python内置的一个单元测试框架,主要用于自动化测试用例的开发与执行 简单的使用如下 import unittest class TestStringMeth ...

  9. linux写系统服务的方法

    linux写系统服务的方法 2.1 首先编写demo程序:hello.c<pre>#include <stdio.h> # chkconfig: 2345 10 90 main ...

  10. 使用火狐浏览器模仿手机浏览器,附浏览器HTTP_USER_AGENT汇总

    HTTP_USER_AGENT用来获取浏览页面的访问者在用什么操作系统(包括版本号)浏览器(包括版本号)和用户个人偏好. 改变浏览器的这个参数就可以伪装成相应的浏览器. User Agent Swit ...