一直在使用某娱乐软件,但是这个软件的会员费贵的离谱,实在是买不起。所以就想着怎么搞一下,绕过会员检测机制。其实就是针对这款软件做一个注册机。
前期准备根据抓包还有查看源码,初步确定了软件的鉴权机制,详细过程不谈,只说结论:鉴权部分由单独的服务器负责,通过 HTTPS 进行设备注册,密钥鉴权等操作。
通过代码逆向已经确认鉴权的具体协议。
制定方案了解软件的鉴权机制后,就可以制定方案了。两个方案:
中间人攻击,建立中间人服务器,篡改鉴权会话
DNS 劫持,伪造鉴权网站,无脑返回鉴权成功。
由于该软件的鉴权部分为单独服务器,所以采用方案二会简单很多。
开始实施伪造服务随便写一个 Web 服务,实现所有的鉴权接口,并无脑返回成功。
然后在该机器上运行 nginx,配置监听鉴权服务器域名并转发给冒牌 Web 服务。
劫持 DNS直接在路由器上使用 DNS 工具修改,或者直接更改 hosts 文件,将鉴权服务器域名指向冒牌服务的 ip。
伪造域名证书事情到这里仅仅走过一半,剩下的才是重要的部分。
虽然我们已经拥有了冒牌鉴权服务,也可以将请求劫持到冒牌服务上,但是因为我们没有证书,不知道交接的暗 ...
想写这款 App 很久了,因为工作的原因一直拖着。今年狠下心来,逼了自己一把,终于写出来了。
软件名字叫做 Timez,寓意是 Time Easy,诞生的使命是让记录时间变得容易。
关于时间记录早在学生时代我就开始践行时间记录,那会还是用 aTimeLogger 记录,用 Excel 汇总分析。放一下学生时代和刚工作时的统计:
那段时期真真切切的体会到了时间记录带来的好处。时间的具象化让我以前的自我欺骗不攻自破,每天就是牟足了劲儿去充分利用每一分钟。结果也是显而易见的,不论是学习还是工作,我都进步飞速。
遗憾的开始不过最后还是没能继续坚持下来记录时间。
原因是有几个月被借调到另一个部门,工作十分繁忙,每天起床就工作,下班就睡觉。
刚开始的时候,我还在坚持记录。但是睡前回顾的时候,全天基本都是一个:工作。不论是记日记,还是统计时间,都显得没有意义了。
坚持了大概一周后,我就放弃了记录时间和写日记,至今都没有再捡起来过。自那以后我就意识到了这种时间记录方法的缺陷:在高强度工作时(或者其他任何时间较密集的活动),这种记录方式就会变得没有意义。
而我也开始寻找新的时间记录方法,试图突破困境 ...
什么是位向量/位图?位向量/位图是一个数据结构,可以利用小空间存储大量数据。
通俗概括一下:位向量是一个二进制数,我们要存储的数字是几,就让位向量的第几位为 1。这样就能使用一个数,存储大量的数了。
位向量有什么用?看了上面的概括,大家可能不太明白这种数据结构到底有什么用。这里我举一个非常常见的场景:进程 pid 的分配。
如果不使用位向量,你想一想要怎么保存那么多进程的 pid?需要用一个 int 数组来保存吗?这样势必会造成大量的空间浪费,我们平时使用的电脑、手机等设备可能不在乎这点空间,但是在一些嵌入式设备中,这点空间就弥足珍贵了。
接下来让我们一起看看用位向量怎么实现 pid 分配的逻辑。
pid 分配代码实现直接上代码:
需要注意的是,这个程序只是模拟了 pid 的分配逻辑,并没有兼顾实际的业务逻辑(比如 0~299 的 pid 保留给 daemon 进程)。
12345678910111213141516171819202122232425// 保存上一个 pidstatic int last = -1;// 用来保存使用中的 pid 的位向量stati ...
最近在学习 SwiftUI ,写了一个计算器的 Demo。写完后学习并理解到一种代码设计,感觉很有收获,在此记录一下。
一句话概括我们将 App 当作一个状态机,状态机的状态决定 App 的界面。首先我们理出 App 都有什么状态?每个状态需要什么样的条件会触发什么样的 Action?Action 执行后状态机会进入什么样的次态?理清这些后,根据设计,随着状态机状态的改变,,App 的界面自然会跟着更新。
以计算器为例在这里我用我写的计算器 Demo 为例讲解下这种方式。
找出状态计算器的业务逻辑就是接受用户的输入的算式,然后计算并输出算式的结果。那么计算器的状态就是由算式的状态来决定。
首先看看算式的组成:
“左侧数字 + 计算符号 + 右侧数字 + 计算符号或者等号”
看着算式的结构,我们就能捋出计算器都有什么状态:
计算器正在输入左侧数字,这个状态下用户按了计算符号按钮后会进入下一个状态。
计算器已经输入了左侧数字和计算符号,开始等待右侧符号
计算器已经输入了左侧数字和计算符号,正在接收右侧数字(注意和 2 的区别,一个是符号,一个是数字)
计算器已经计算出结果,开始等待符号( ...
前段时间写了篇架构设计文档,一直想就这件事聊点什么,结果一拖就拖到现在了。算起来这是我第二次写架构设计文档了。一路摸爬滚打,算是有一点点领悟,也不知道对不对,就随便说说。
很多人觉得架构文档没有什么写的,或者说不知道要怎么写。其实我觉得这是因为自己对架构、或者对业务需求并不是那么理解。如果真的理解了,再来写这个文档,会发现真的有很多可以写的地方。因为你在明白架构设计文档的目的、作用后,就知道这个东西不仅仅是拿来糊弄公司的,而是真的有指导意义的。
首先要理解架构设计文档的作用,架构设计文档其实对项目开发是有很大帮助的,而且在写架构设计文档的过程中,也能让设计师认真的重新梳理一遍业务需求,从而有针对性的去设计,而不是在写代码过程中临时决定要用什么方法去写。
突然想起之前面试的时候问面试者,架构是什么? 听到的回答五花八门,什么都有。有的人干脆就说架构就是 MVC,MVP 等等,让人有点无奈。我在这里简单聊一下我的理解。
什么是架构?架构这个词其实并不是软件领域专有的。它甚至可以追溯到人类起源的时候。
刚开始人类只有很简单的需求:有东西吃、有地方睡。一个人就能做完所有的事情。但是随着需求变得 ...
众所周知,Apple Watch 从 Series 4 版本开始就支持测量 心电图 了,但是在大陆的我,时至今日仍然没能用上这种功能,但是最近在网上冲浪的时候发现有位大佬观察出了如何在大陆开通(大佬地址),蹭大佬的光,我也终于如愿用上了 心电图 (不然心里总觉得花了钱享受不到应有的功能很难受啊),先附一张图以证明:
接下来是时候展示真正的技术了:
一句话解释: 开启 ECG 功能后会在手机中写入两个标记,所以通过修改手机的备份,再恢复进手机,即可将 ECG 功能置于开启状态,可以直接使用。
必备条件
任何支持 Apple Watch Series 4 及以上的 iPhone
支持 ECG 地区的 Apple Watch
iMazing 软件
ECG 激活文件
手机的 健康 App 必须要有记录
测试环境
国行 iPhone 11 pro iOS 13.1.2
港版 Apple Watch Series 4 WatchOS 6.0.1
大陆 iClound 账号
操作步骤
取消手表和手机的配对(为了手表读取我们导入的配置)
用 iMazing 对手机做一次加密备份
注意: ...
背景这两天遇到一个奇怪的问题:开开心心连上服务器,准备跑上自己的服务。为了方便部署,当然是先安装 Docker 了。开开心心的安装,写 Dockerfile,写完了跑起来!访问,懵逼了,无法访问,直接 ping 不通了。因为是突然发现这个问题,没有太怀疑 Docker 的问题,只是把 Docker 关了后发现依旧不行,就排除 Docker 了。
现象出问题后可以 ssh 登陆服务器,但是服务器 ping 不通,也不能访问。
后续贼心不死,再申请了个服务器,这次学聪明了,先 ping 一下,发现可以 ping 通,然后装上 Docker 再 ping 一下,凉了!问题定位,就是 Docker 的锅!那怎么办呢?
确定是 Docker 的锅就好办了,一番 Google,发现了有相似的问题。
一句话解释:原来是 Docker 和宿主机的网段冲突了,改了网段就好了。
Docker 容器网络默认使用的是 bridge 桥接模式,一般容器会使用 daemon.json 中定义的虚拟网桥来与宿主机进行通信。
下面分别是 Linux 和 Mac 修改 Docker 默认网段的方法。
修改方法Lin ...
此前低版本静默安装一般分为两种套路:
shell 调用 pm 命令
反射调用 PackageManager 的 install 方法
但是在 9.0 上都失效了
分析 PackageInstaller 的源码,和 PackageManager 的源码。发现 PackageManager 多了一个getPackageInstaller 的接口,返回了 PackageInstaller 对象,再来看一看 PackageInstaller的接口
初步猜测在 Android P 上采用类似 socket 的方式与 server 端通信完成安装。
PackageInstaller查阅官方文档后得知,PackageInstaller 提供了安装、更新以及卸载等功能,其中包括单 APK 和多 APK 安装。
具体的安装行为是通过 PackageInstaller 内部的 Session 完成的。所有的应用都有权限创建这个 Session,但是可能会需要用户的确认才能完成安装(权限不足)。
Session创建 Session 可以为其指定参数 SessionParams,其中一个作用就是要全部替 ...