Logos讲解--逆向开发
前言
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讲解--逆向开发的更多相关文章
- Hook原理--逆向开发
今天我们将继续讲解逆向开发工程另一个重要内容--Hook原理讲解.Hook,可以中文译为“挂钩”或者“钩子”,逆向开发中改变程序运行的一种技术.按照如下过程进行讲解 Hook概述 Hook技术方式 f ...
- iOS逆向开发(8):微信自动添加好友
这一次,小程演示怎么让一个APP自动地运行,从而代替手工的操作.同样以"微信"以例,实现在一个微信群里面,对所有的成员,自动地一个一个地发出添加好友的请求. 知识点还是之前介绍的东 ...
- MachO文件详解--逆向开发
今天是逆向开发的第5天内容--MachO文件(Mac 和 iOS 平台可执行的文件),在逆向开发中是比较重要的,下面我们着重讲解一下MachO文件的基本内容和使用. 一.MachO概述 1. 概述 M ...
- OAuth的机制原理讲解及开发流程
本想前段时间就把自己通过QQ OAuth1.0.OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oaut ...
- iOS逆向开发(1):基础工具 | ssh | scp | socat
小白:小程,我一直想问,什么是逆向来着?是逆向行驶吗? 小程:理解为逆向行驶也没错.一般的项目是从无到有,而逆向是从已有的状态入手,分析出已有的流程与结构的手段. iOS上的逆向开发,是一件有趣的事情 ...
- PHP服务器端API原理及示例讲解(接口开发)
http://www.jb51.net/article/136816.htm 下面小编就为大家分享一篇PHP服务器端API原理及示例讲解(接口开发),具有很好的参考价值,希望对大家有所帮助 相信大家都 ...
- 2021年正确的Android逆向开发学习之路
2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...
- 免越狱tweak应用逆向开发
对于已越狱的设备,系统默认安装了mobilesubstrate动态库,提供一个系统级的入侵管道,所有的tweak都可以依赖它来进行开发.而对于没有越狱的手机,我们需要向目标app注入libsubstr ...
- iOS逆向开发(4):注入目标函数 | fishhook | MobileSubstrate | MSHookFunction | iOSOpenDev
从获得APP的所有类声明,到锁定目标类与函数,现在是时候注入函数了. 所谓"注入函数",小程的意思是让APP执行到小程写的代码中,跟"钩子"的概念一致.小程把个 ...
随机推荐
- CSP2019知识点整理
也算是接下来二十天的复习计划吧 仅止于联赛难度左右 基础算法 字符串 char[] cstring memset() 输入无& gets(), fgets(stdin, ,); strcmp, ...
- SCOI2005 繁忙的都市 [Luogu P2330]
题目描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条 ...
- 使用float设置经典的网站前端结构
float浮动是能使得标签脱离文档流,此处脱离文档流,是指此便签后面的,没有脱离文档流的标签将此标签当作透明,按正常来布局. float脱离文档流,是受到父级范围限制的,在父级范围内脱离文档流,脱离文 ...
- [考试反思]0825NOIP模拟测试30:没落
AB卷,15人. Lrefrain rank#1 179 skyh rank#2 122 116 108 54 42虽说还是不怎么样,但是有好转的迹象. 开卷审题,T1是个(假)期望,感觉也许还可做. ...
- 【并发编程】ThreadLocal其实很简单
什么是ThreadLocal ThreadLocal有点类似于Map类型的数据变量.ThreadLocal类型的变量每个线程都有自己的一个副本,某个线程对这个变量的修改不会影响其他线程副本的值.需要注 ...
- 使用Typescript重构axios(六)——实现基础功能:获取响应数据
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- layui多级弹框去掉遮罩
var index = layer.open({ type:1, title:'请选择费用代码', area:['1050px','650px'], content:$('#selectFee'), ...
- 创建linux系统下的虚拟机
1.打开VMware软件 2.创建新的虚拟机 3.下一步 4.点击 稍后安装操作系统——下一步 5.选择 其中版本 我的镜像是这个版本所以选择这个 6.下一步 设置虚拟机名称 要保存的位置 7 ...
- mysql数据库基本操作语句
1 更改字段名:change alter table student change column gradenews grade int(11); 2 增加字段和删除字段 alter table s ...
- leetcode算法笔记:二叉树,动态规划和回溯法
在二叉树中增加一行 题目描述 给定一个二叉树,根节点为第1层,深度为 1.在其第 d 层追加一行值为 v 的节点. 添加规则:给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N, ...