谈一谈第三方软件授权管理平台

文中提及的逆向工程思路仅供学习参考,请支持正版软件。

付费授权模式在商业软件中十分常见,它也为公司提供了收回软件开发成本的可能,或是让个人开发者过上小资生活(想多了)。

在之前尝试绕开 iStat Menus 6(下称「ISM6」)的授权验证时,曾被授权验证函数间传递的 NSDictionary 中的 Keys ——「CPU」和「Memory」所迷惑,这样做也是在一定程度上降低了敏感字符串暴露的风险。正如上一篇文章所分析的一样,ISM6 并未使用第三方的授权管理 SDK,而是选择了自己在最终用户端使用 Security Framework 进行验证。

可以说,大部分工具软件都在使用这类相对简单但也能保留部分强壮性(Robustness)的验证模式。毕竟,实现一套完整的授权管理体系所需要操心的事情并不少,支付订单管理、授权发放和管理以及最终用户端的验证及反破解等,综合算下来可能要比开发一个工具类软件还复杂。

因此一些着手解决此类问题的第三方平台便开始提供软件授权管理服务,开发者只需要接入 SDK 便可以轻松地管理自己的软件授权,从此高枕无忧。

可是,事实真的如此吗?我们先分析,再来讨论这个问题。

Read More

iStat Menus 6 逆向分析实战

文内不含布丁下载,推荐购买正版或进行旧版升级。

前言

最近我的 iStat Menus 从第五版更新到了第六版,新版的确较旧版加入了很多很棒的功能,但因升级改动较大,需要付费进行升级(详见官方解答)。进入新版,还是熟悉的“试用——倒计时——到期要求输入授权码”的模式。闲着也是闲着,就研究了几天做了个破解布丁出来。

Read More

Goodnight 2017

转眼又到了 2017 年的最后一天。

从前每到这个时候我都会感叹时间过得实在太快,对这一年未能实现的小目标小计划感到遗憾。今年也如此,所有的愿望、想法都能得到实现的这种「幻想」是完全不现实的。不过让我欣慰的是今年一整年都充斥着「很忙」的感觉,并没有太多时间可以供我去浪费,也就是所谓的「充实感」。

今年是充满探索和新尝试的一年,年初的时候上了 Google 的贼船,终于如愿成为了一个正规的开发者。当时也在拼命地赶 Bilisound for Android 这个维护了好几年的软件的进度,第一次搞 FFmpeg 的交叉编译,虽然看起来比较恶心,但实际操作起来还是很 tricky 的,当时也记录下了很多容易踩坑的地方以及需要注意的地方,后来甚至写了为方便适配多个架构的批量编译 script。很多时候,灵感都是有一些小事情激发出来的,今年上线的 Android 应用 Clever Blanks 便是这样,突然想到是不是可以做一个自动产生填字游戏答案的小工具,然后用了几天把这个想法从雏形变成了现实。夏天的时候还做了一个可以生成更漂亮的二维码的 Awesome QR 系列工具,当时也是受到另一个很棒的开源项目的启发而作,借着这个机会,我也与这个开源项目的开发者相识。

同时,今年也是各种技术集中更新的一年,前端、机器学习、VR 和 AR 等,探索的脚步还是要继续,即便不能精通,接触一下、体验一下总是好事,说不定之后就产生了兴趣呢。

今年还认识了许多精通不同领域的新朋友,有专攻安全领域的、视频编解码的,还有很多 Android、iOS 应用开发者,以及一些本身就对技术很感兴趣的朋友,或是一起玩游戏的朋友,当然,也有和我的专业一样研究语言(语言文学)的朋友。他/她们都有着自己的故事,我很喜欢听每个人不同的故事。在和他/她们交流之后,我更是对他/她们的个人经历感到佩服。这一年在和他/她们的经验交流中,我成长了很多,也找到了很多需要改掉的问题。不过,除了正经(学术)的事情,他/她们也陪着我开心的走过了 2017 年,一起聊天,一起玩游戏,一起写代码,互相安慰、互相鼓励。

今年去考了作为英专必过的 TEM-4,也顺便考了 CET-6,成绩都比较满意,下半年还拿到了一次奖学金,我想它对我来说鼓励的作用应该多于它本身的价值。总之,还是要继续加油的。

12 月 31 日到 1 月 1 日,不过是新的一天而已。但是不可否认的是「跨年」存在的象征意义大于实际意义,它是一个特殊的分界点,就像是过完一个月之后就要把月历翻到下一页一样,过完一年,就该换新的年历了,好好地迎接新的一年。

明年要继续在自己感兴趣的领域上深入研究,更重要的是多多掌握技能和经验,多学一些,总是没错的。

生活本身怎么样是不会变的,不论是去年到今年也好,还是今年到明年也好。但怎么计划,还是掌握在自己手中的。

愿 2018 年一切安好,感谢所有朋友、家人在 2017 年的陪伴,我们明年见。

也祝正在阅读这篇文章的你:新年快乐。

B612

不得不说,Chouchou 中主唱 Juliet Heberle 的声线配合着 Arabesque Choche 的旋律,总能营造出一中漂浮于宇宙之间的感觉。

这首歌停留在我的网易云音乐收藏中很久了,最初听到的是 Chouchou 的 spira,后来又找到了这首歌,听了不下十遍左右,想为它的歌词加上翻译的冲动便突然涌上心头。

Read More

活版印字 · Typography

说在前面

在这之前,有一点我必须承认,那就是 —— 我更新博客的频率实在是太低了。

或许是因为平日比较忙,我很难抽空坐下来静静地写点自己的文章。因专业的原因,我经常有各种报告要写,需要翻译的文章也蛮多。其实,不论是讲故事,还是说说自己最近研究的东西,都是我一直向往的事情。正如新的博客名字一样,今后我会多抽些时间写写文章,在这里记录一下生活。

Read More

2016・もうすぐ終わり

Thousands of cities from home, wander into the unknow; chances are here I was told, crossing the footsteps of new and old.

十二月,又是一年。

刚过完秋天的我总喜欢在冬天回忆这一年的事情。

北方都已经飘下雪花的时候,身处江南的我只期望着少下些雨。

江南雨柔,只在于春夏秋,而没有冬。

江南冬天寒冷刺骨的雨若是不配合着狂风,反而让人有些不适应。

小时候以雪作为冬天来临的标志,没有雪的冬天是不能叫冬天的,现在这种错觉仍存在我体内。

不得不承认这一年经历了比以往多的事情,大概也是因为有空闲下来观察生活、观察自己。

一年到头总得停下来,回头看看,看看哪些事在变好、哪些在变坏。

我用照片记录下来了这一年的足迹,至少现在还能想起当时的场景。

这一年里,和喜欢的人表白过,依然单身;

住过医院,和好朋友吵过架;

后悔过,也穷游疯玩过,改变过。

仍旧在开发软件与探索技术的道路上越走越远。

希望 2017 年能把 TODO 清单上的愿望一一实现。

防止 Android 应用内截图

很多时候,用户需要在我们的应用中输入类似于身份证号、密码、银行卡号等敏感信息,此时如果在后台不怀好意的应用程序对这些敏感页面进行截图,将导致用户的个人信息泄露。
Android 为我们提供了一种可以防止 Activity 被截图的方案来保护用户的隐私。

Read More

配合 Travis CI,将 Hexo 博客自动部署到你的服务器上。

这篇教程将指导你如何将写好的文章通过 Git 提交至 GitHub 仓库,并使用 Travis CI 自动构建、部署到你的服务器上。

今年夏天的时候,为了多练习 Python,于是用就它写了一个简单的静态博客生成器,有模板有标签,不过与现有的静态博客相比还是相形见绌。即不易管理,也总出现 BUG。

博客是需要静下心来写的,程序总需要维护实在不是长计,于是,昨天我便把博客换成了 Hexo。终于可以安静的写博客了。

Hexo 是一个基于 Node.js 的博客框架,从模板、主题再到插件应有尽有,写好文章后可以得到一个静态整站,对于像个人博客这种更新需求不大的网站是再适合不过了。

网上给出的教程多是将博客托管于 GitHub Pages 上,然而 GitHub Pages 在国内部分地区以及部分运营商的网络下的表现有时并不完美,经常出现载入缓慢,CSS 及 JS 无法载入的问题,因此也有部分人选择将博客放在自己的服务器上。

但是在个人服务器上搭建博客又要考虑一个非常重要的问题——备份数据。 GitHub 提供的版本控制功能非常强大,但是个人服务器上大都没有使用版本控制系统,需要自行备份。

为什么不把 GitHub 的强大版本控制功能与个人服务器的访问速度结合在一起呢?

Read More

Openshift 下使用 NPM 时出现 EACCESS 错误的解决办法

Npm 是 Node.js 的包管理器,有时安装一些新模块都需要依靠 npm install 这个命令,但在 Openshift 这种限制多多的环境下,直接使用 npm install 这种命令安装模块可能会遇到各种错误,常见的就是本文所说的 EACCESS 错误。

这种错误通常是由权限不足导致的,在 Openshift 这种环境下也不难见到这种问题,因为 npm 在安装新模块时需要一个临时目录,而普通用户对环境变量中的临时目录是无权写入的,因此修改一下环境变量,把它指向我们有权限读写的文件夹就可以解决这个问题。

使用 SSH Shell 连接到你的服务器后使用以下命令(这里以安装 express 为例):

1
2
3
4
cd app-root/repo/
mkdir tmp
export OPENSHIFT_TMP_DIR="`pwd`/tmp/"
npm install express
Android 游戏开发中的几种绘图方式

在大部分 Android 游戏中,游戏画面的更新都是通过单独线程来完成的,若是直接在主线程上绘制,可能会造成无响应(ANR)等问题,因此需要在单独线程中完成绘图。

由于游戏场景有时会很复杂,可能需要分别绘制背景、控件、人物、文字等内容,部分 3D 游戏还需要渲染贴图,因此在单独线程中绘图也可能会发生卡顿或丢帧的问题。这个时候就需要想办法提高绘制效率、优化内存,尤其是频繁重绘且重绘物体较多的程序。

重绘一般分为以下两种方式:

  • 被动式: 一般这种方式常用于棋类游戏,只在监听到触摸后才进行重绘,在无触摸事件时便闲置下来,对系统资源的需求并不会太高。
  • 主动式: 这种方式就好像是在播放动画一样,画布在不停地重绘,在绘制大量物体时对系统资源的需求较大,因此性能低的设备可能因此发生卡顿或丢帧。
    一般情况下,2D 游戏使用 SurfaceView 并配合 Canvas 即可进行快速开发,对于被动式重绘来说这种搭配还是很好的,不仅响应迅速,还会减轻开发难度。

因此对于一般的开发来说,直接使用 Canvas 画图就可以满足需求。
关于 OpenGL 的绘图方式,将在以后的文章中提到。