SilverFruity

SilverFruity

Road is underfoot - 。-.

二进制补丁的主要目的是优化JSON补丁,所以先从JSON补丁说起。

# 前言

OCRunner 最初的时候是打算只使用 Json 补丁的,可当在我能力范围内对JSON补丁进行了压缩以后,发现 Json 补丁的大小仍不能接受的,太多的冗余字符了。在我思考了一段时间后,发现可以使用 Json 补丁的数据结构,以二进制数据的形式来消除这些冗余字符,大幅降低补丁的大小,所以二进制补丁的初衷是为了优化 Json 补丁的冗余字符,所以我们将先从 Json 补丁说起。

3/10/2021 hotfixiOS

在正文开始前,我们先看看给出的语法树解释执行.gif,OCRunner的核心解释执行部分也是如此。

本图出自: 虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩

如果你让我仅仅只靠文字就能给你解释清楚 OCRunner 是怎么运行起来的,你们可能是在为难我小蒋,肚子里墨水真的没那么多啊,太难了😂。所以在这一小节,我给大家准备了一个简单版 OCRunner,希望大家能从这个例子中,真正知道它是如何运行的。

希望你们看见项目中的 SingleEngine 类不要笑(哈哈哈),我只是想表达 单缸发动机 的意思 - _ -,我心爱的小摩托就是单缸拖拉机。

本节假设读者并不具备编译相关的知识。

本文对 lex 和 yacc 介绍有限,关于 flex 和 bison 的详细使用可以参照《flex与bison中文版》或者 《flex&bison》。

Demo源码,建议使用 git clone 的形式下载源码,每个小节的相应源码都对应在各自的 commit 里。通过边看文章边阅读源码的形式食用,更香哟。

3/10/2021 hotfixiOS

# 为什么要热修复

在软件开发过程中,很难避免 BUG 的存在,尤其是对于一些达到一定规模的 App 因为协作模式错综复杂,就很容易带着问题上线。

一旦问题上线之后,问题就麻烦了,不仅需要重新打包、测试,而且还需要重新提交审核,而这种修复问题的方式往往是低效且漫长的。

因此,在开发一个 App 的过程中,稳定性的就变成了一个难题,唯一的原因就是不希望带着问题上线导致用户对 App 失去信任。

热修复就可以很好的解决这类棘手的问题,因此带着好奇之心,研究了一下热修复在 iOS 端的可行性,实现 了一个较为完备的热修复框架,我把它叫做 OCRunner。

我也会在未来几个月,把我做 OCRunner 的一些经验总结成博文,在「老司机技术周报」的公众号上与大 家分享。

3/10/2021 hotfixiOS

# 简介

# OCRunner开发补丁的工作流

# 初衷

为了能够实现一篇文章的思路:Objective-C源码 -> 二进制补丁文件 ->热更新(具体是哪篇我忘了)。当时刚好开始了oc2mango翻译器的漫漫长路(顺带为了学习编译原理,嘻嘻),等基本完成以后,就开始肝OCRunner:完全兼容struct,enum,系统C函数调用,魔改libffi,生成补丁文件等,尽可能兼容Objective-C,为了做一个直接运行OC的快乐人。

9/4/2020 hotfixiOS

本系列主要以iOS的TypeEncode和libffi结合使用。

TypeEncode传送门

Github源码

7/18/2020 libffi

# 1. 不完美越狱

checkra1n只支持MacOS,连接上USB后,根据App提示,即可越狱。然后在iPhone上打开checkra1n App,安装Cydia即可。

我的手机为iPhone7 13.3.1

# 2. Cydia 安装OpenSSH

  1. 在Cydia中搜索安装OpenSSH

  2. 确保手机和电脑在同一局域网

    ssh -P 22 root@<iPhone局域网IP>
    # 默认密码为alpine
    
    1
    2
  3. 设置免密连接

    来源:MonkeyDev Wiki

    ssh-keygen -t rsa -P '' #如果已经有了id_rsa,跳过这一波
    ssh-copy-id -i /Users/username/.ssh/id_rsa root@ip #这里提示错误,添加sudo即可
    
    1
    2
2/15/2020 iOS逆向

# Cargo

cargo new {project_name}: 创建新项目

在{project_name}目录下执行:

cargo check: 调用编译器进行语法检查,速度比build更快

cargo build: 编译rust程序

cargo run: 编译并运行程序

安装第三方库

在cargo.toml的dependencies下添加第三方库名字和版本:rand = "0.7.0"

运行cargo build,会自动下载第三库进行下载以及编译

如 rand = "0.7.0",运行cargo update,更新版本的区间为 [0.7.0,0.8.0)

# 语法

# 声明变量:

let:不可变变量,和swift中的let一样,不同的在于,可变变量需要使用 let mut a = xx的形式

//rust shadow特点:
fn main(){
let a = 2;
let a = a + 1;
let a = a * 2;
println!("a = {}",a);  
}
// 输出: a = 6
// 在其他语言中,通常会有变量已经声明的错误
1
2
3
4
5
6
7
8
9
2/7/2020 Rust

UICornerShadowView

# 主要功能

  1. 圆角,可控圆角方向。

  2. 边框相关参数,可控边框方向。

  3. 阴影相关参数,可控阴影方向。

  4. 使用CoreGraphics生成图片,可异步执行。

  5. 超小的缓存占用。图片大小与视图大小无关,1000张随机值的圆角阴影边框图片,占用29MB。

1/15/2020 iOSCore Graphics

这几天被这个坑哭了。

先说说问题。

# 1.返回值莫名其妙的被release

做Router时,返回的ViewController,push显示了,结果Xcode给你说,self是nil。黑人问号.jpg
1

解决方式就是判断当前类是否是Swift的类(包含"."),如果是的话Retain一次

const char * returnType = [signature methodReturnType];
if (self.isSwift && returnValue && strcmp(returnType, @encode(id)) == 0){
    CFRetain((__bridge CFTypeRef)returnValue);
}
1
2
3
4

在10.3.1 11.4 12.4 13.3模拟器测试下,对象都能正常销毁。

# 2.执行时报EXC_BAD_INSTRUCTION ????

1/4/2020 iOSSwift
12/30/2019 iOSURL Scheme
12 Next Jump To Go
author-avatar

SilverFruity

13

Articles

12

Tags

Categories


Tags

AlliOSRunLoopRuntimePythonFlaskURL SchemeRustSwiftCore GraphicsiOS逆向hotfixlibffi