「你是什么样的friends呢」

IEEE 802.11 Denial-of-Service: Deauthentication Attack

使用 WPA / WPA2 能让你的数据有更好的安全保障,但是攻击者可以利用基于802.11设计上的缺陷来对你进行拒绝服务攻击,也就是 deauthentication 攻击。攻击者首先需要知道你的 Wi-Fi 的 MAC 地址,然后伪装成你的身份给 AP (或者说路由器) 发送 deauthencation 包。这样一来,AP 在收到了来自“你”的 deauthencation 包之后,就会断开和你的连接。虽然仅仅是用这种方法并不能窃取到你的数据(结合其他方法有可能能破解 AP 的密码,但是不在本文的讨论范围之内),并且这个方法的目的也不是要窃听数据,而是让你连不上自家的 AP。如此一来,你也不得不拿出网线。而且不管你使用什么加密方式、密码强度有多高,甚至隐藏你的 SSID (毕竟隐藏 SSID 正如字面意义上的,它只是藏了 SSID,并不是隐藏了你和 AP 之间的数据包)都不行。

802.11 - 2012 标准 8.2.4.1.3 Type and Subtype fields 下面,列举了所有有效的 MAC 帧的 type 与 subtype 的组合,这里我们关注的 deauthentication 是 type 为 management 的帧。

Type valueb3 b2 Typedescription Subtype valueb7 b6 b5 b4 Subtype description
00 Management ... ...
00 Management 1100 Deauthentication
00 Management ... ...
Captured deauthentication packet
Captured deauthentication packet

继续阅读IEEE 802.11 Denial-of-Service: Deauthentication Attack

codesign_allocate 的 bug 依旧是个谜

昨天写的 codesign --remove-signature 的 bug 解决 一文中,在最末尾猜测了可能是 LLVM 的 LTO (link time optimaliztion)的问题,然后今天把 LLVM 的头文件下下来了,打开了 LTO 支持,发现也是可行的。这个就让人摸不着头脑了。不过上面提到的解决方法是没问题的。

如果想要打开 LLVM 的 LTO 支持的话,可以去 LLVM 的官网下载 Pre-built Binaries。比如现在的 LLVM Release 是 4.0.0,那么就下载Clang for Mac OS X。然后加上对应的编译选项 -I/PATH/TO/YOUR/clang+llvm-4.0.0-x86_64-apple-darwin/include(指定头文件搜索 clang+llvm-4.0.0-x86_64-apple-darwin/include 目录)

codesign_allocate compiled with LTO support
codesign_allocate compiled with LTO support

所以我们什么都不用改,只需要把 Apple 开源的 cctools 中的 codesign_allocate 重新编译一下,问题就神奇的解决了。

不过 codesign_allocate 中的确是存在一处无符号整数溢出的问题,只不过几乎没有影响。

继续阅读codesign_allocate 的 bug 依旧是个谜

codesign --remove-signature 的 bug 解决

听说在 macOS 上使用自带的 codesign 来移除应用程序签名的话,会使得 MachO 文件变得不正常,于是就花了点时间来看看 codesign 相关的源代码。虽然有第三方的工具,自己也可以通过简单粗暴的改 MachO 文件来解决,但是探究问题具体出在哪里也很有趣。那么这里将以 Reeder 为例子(其实存在感不强233)讲述。

Malformed MachO After Removed Signature
Malformed MachO After Removed Signature

同样的,在前面我也列出目录,你可以直接跳到解决方案的部分。

继续阅读codesign --remove-signature 的 bug 解决

Yet Some Dyld Things To Play With

本来是想研究如何“简单”阻止 insert_dylib 注入的,但是好像并没有简单的方法,不过发现了一些 dyld 的东西,虽然目前来看似乎没有太大的意义,可是能拿到的东西肯定不是 dyld 想让应用拿到的。这篇 post 中的方法在 macOS 10.12.4 和 iOS 10.3.2 (14F5089a) 中均测试可行。

关于 iOS / macOS 中 dyld 如何初始化一个 MachO 的运行这里就不详细说了,在网上能找到这方面的一些资料。概要流程引用如下:

  1. 从 kernel 留下的原始调用栈引导和启动自己
  2. 将程序依赖的动态链接库递归加载进内存,当然这里有缓存机制
  3. non-lazy 符号立即 link 到可执行文件,lazy 的存表里
  4. Runs static initializers for the executable
  5. 找到可执行文件的 main 函数,准备参数并调用
  6. 程序执行中负责绑定 lazy 符号、提供 runtime dynamic loading services、提供调试器接口
  7. 程序main函数 return 后执行 static terminator
  8. 某些场景下 main 函数结束后调 libSystem 的 _exit 函数

——iOS 程序 main 函数之前发生了什么

那么在这篇 post 中,我们关注点是 2 和 4,并且主要在 4 上。

继续阅读Yet Some Dyld Things To Play With

绕过某软件防篡改保护

在看雪论坛上看到了某软件防篡改分析,不过我看到的时候那篇帖子已经删掉了内容。在写这篇 post 的时候发现有人贴上了原始的文章,某软件防篡改分析

一开始自己在做绕过的时候,只是大概猜到有防注入的措施,但是没有细研究,而是选择了另一个方式,同样实现了 dylib 的注入,并且不需要修改主程序。

Bypass Tamper Proofing
Bypass Tamper Proofing

继续阅读绕过某软件防篡改保护

Theos Hook Objective-C classes / methods with Unicode Characters

于是今天看到有人在问使用 THEOS 来 hook 带有汉字的 Objective-C 的方法时会有类似如下的报错。

$ make
> Making all for tweak UnicodeHook…
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (armv7)…
Tweak.xm:3:1: error: missing context for method declaration
- (id)中文方法名 {
^
1 error generated.
THEOS complaints about unicode characters
THEOS complaints about unicode characters

于是研究了 THEOS 的源代码,给出了一个简单的解决办法,不仅可以 Hook 带有汉字的方法,带有日文、阿拉伯文等等的方法 / Objective-C 类,只要这些 identifier 在 Objective-C 的语法规则中被认可,那就都可以被 Hook。而且在写 %group 的时候也可以使用除 ACSII 以外的文字了。

继续阅读Theos Hook Objective-C classes / methods with Unicode Characters

Mastodon——What's the form of social network in the future?

最近我所在的一个 GitHub Organization 的网站上搭起了 Mastodon 实例,于是花这几天的时候从一个较为高层的角度分析了 Mastodon,这里并没有深入到最底层的代码。大概还有不少人不了解 Mastodon 这个项目,于是结合 Mastodon 官方的介绍,这里将分析 Mastodon 项目的现状以及对 Mastodon 未来的预测。

继续阅读Mastodon——What's the form of social network in the future?

Scaling Mastodon——What it takes to house 43,000 users

我的实例 mastodon.social 最近已经超过了 43,000 位用户。我不得不关掉注册以确保有足够的时间来审查 Mastodon 的基础架构,并且也是保证给已经注册的用户提供一个良好的体验(这个举动带来的更奇妙的结果是——Mastodon联邦为分布在500个以上的独立实例上、总计超过161,000人提供服务!

但是要运营一个为 43,000 位用户提供流畅且快速响应的服务是需要下点功夫的,而且其他的一些实例上的用户群体也在不断扩大,是时候分享一些提示和我在运营自己的实例时学习到的技巧了。

继续阅读Scaling Mastodon——What it takes to house 43,000 users

macOS中QQ防消息撤回

macOS下的QQ还是增加了消息撤回功能,稍微研究了一下,只需要Hook一个函数即可。

可以考虑写一个dylib然后附上去,代码如下。然后至于说是用DYLD_INSERT_LIBRARIES这个环境变量,还是说直接改load_commands就看个人喜好了,这里不展开写。

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

void handleRecallNotifyIsOnline(id, SEL, void *, BOOL) {}

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"

static void __attribute__((constructor)) initialize(void) {
    method_setImplementation(class_getInstanceMethod(NSClassFromString(@"QQMessageRevokeEngine"), @selector(handleRecallNotify:isOnline:)), (IMP)&handleRecallNotifyIsOnline);
}

#pragma clang diagnostic pop

There is only one problem to solve——汉诺塔问题

汉诺塔问题的描述如下,汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘,只能移动在最顶端的圆盘。

那么这里我们也先来思考最简单的情况(变量当然是盘子的个数\(n\)啦),那么最简单的就是\(n=1\)了(当然,\(n=0\)也可以算是一种情况,不过没必要分析了)

不妨假设原始的柱子为\(A\),目标柱子为\(C\),

hanoi-tower-1

此时直接将盘子从\(A\)柱移动到\(C\)柱即可。

继续阅读There is only one problem to solve——汉诺塔问题

すごーい!たーのしー!