奇怪的梦

中午所梦,内容天马行空,我仍不知道它在暗示什么。

尽快、尽量地记录细节。语言就随便了,读得懂就行。

查看更多

分享到 评论

JSON 校验

首先,天国的 Bulletproof。

这次讲一讲 JSON 的校验(validation)。本文水分充足。

查看更多

分享到 评论

TypeScript 中的装饰器

玩了一下装饰器(decorator)。这是个好东西,但我还是没法实现 @Sealed 啊。

查看更多

分享到 评论

大概算一个简单的回顾

回想了一下 JavaScript 的入门,觉得经历挺神奇的。可以作为实用主义的体现。

查看更多

分享到 评论

这大概是最能绕过自我意识审查的东西了。虽然我记住了大部分内容,但是不清楚它是什么意思。

查看更多

分享到 评论

布鲁塞尔的小毛贼

在布鲁塞尔发生的一件不愉快的事。

查看更多

分享到 评论

杂记

2017年7月26日,爱马仕12周年!

查看更多

分享到 评论

WCF 真乃神器也

受到 uTorrentAPI 的影响,我尝试使用了一下 WCF。之前在老周的一系列文章中读到过一点,不过由于讲的是比较深层的东西,所以感觉云里雾里。这次试用了一下,真是不错。

查看更多

分享到 评论

Reverse Engineering on MLTD: HCA Key Extraction

中文版见这里

THE iDOLM@STER Million Live Theater Days (abbreviation: MLTD) went online on June 28 (UTC +01:00). Similar to its sister app CGSS, it uses CRI Middleware’s audio solution. More specifically, encrypted HCA audio. We must obtain the decryption key to reveal the contents of those audio files. In this article, we discuss the concept and procedure of obtaining the key.

Beware, MLTD does not have a game library for X86 processors, and it requires OpenGL ES 3.0. Don’t be surprised. So we cannot run it on normal Android emulators (there is one but it brings other restrictions), and we have to face ARM assembly language instead of usual X86 assembly language.

I wrote this article to share the thoughts and the method I used. I appreciate the way of hackers in 1960s-1970s. Challenging and sharing. Exciting. Hope this article lights up more inspirations.

查看更多

分享到 评论

MLTD 逆向实录:提取 HCA 密钥

Click here to view the English version.

MLTD(THE iDOLM@STER Million Live Theater Days,偶像大师百万演唱会剧场时光,俗称“麻辣土豆”)在6月28日(欧洲时间)正式上线了。在音频上,它使用的还是 CGSS 那一套 CRI Middleware 的技术,音频编码为 HCA。自然,这个 HCA 也是加密的,需要密钥解密。在昨天下午(欧洲时间,国内时间为6月30日凌晨),我成为了世界上第一个取得其密钥的人,然后这个密钥扩散到了日本和美国(似乎吧;我忘了triangle是在哪里的了)加拿大(感谢caimiao说明)的开发者手中。嗯,“第一个攻破”,这个感觉不错。上世纪六七十时代的先锋黑客们感受到的应该就是这种心情吧。

在这篇文章里,我就讲一下这次我是怎么取得密钥的。

查看更多

分享到 评论

微吐槽

CGSS 的master数据库的 live_detail 表里,有几个带“guerrilla”字样的列。研究数据结构的时候,第一眼看上去并不知道这是什么——一个萌妹子音游,和游击队有什么关系?转了好大个弯之后才明白过来,原来这是日替(每隔一段时间轮换的曲目)的意思……这么一想,大概就是取其中的“运动”义吧。

这一条可能需要先了解 CGSS 的玩法,才知道我说的都是什么东西。服务器 API 里有一个 /live/supporter,这个是对应在选歌之后选嘉宾(guest)的。这次通信在对应的通信实体类为 LiveFriendListTask(响应体,主要是其对 Parse() 方法的重载)和 LiveFriendListTaskParam(请求体)。在 UI 中,对应的是 LiveSelectGuestSelectList 类。而“supporter”,也就是“支援”,在游戏中是有其他意义的,就是那10个不上场、用援力加分的爱抖露,相关方法如 WorkDataUtil.GetSupporterList()。你看,有意思吧?三种称呼。我不知道这是否是一种人肉混淆法,反正它在反向的时候对我的精神造成了极大的损害。Cygames 的家伙们对这乱七八糟的分布,估计看着文档也够呛。

CGSS 目前有5种活动类型:传统活动、大篷车(caravan)、3+1(live groove)、协力(little party)、公演(live parade)。它们在代码中的名称分别为 atapon、caravan、medley、multiparty 和 tour。转晕了没?虽说我一开始并不需要知道哪个是哪个,但后来因需求,得分清了,所以琢磨了一下。问我为什么传统活动叫做 atapon?我认为是这样的:atapon 是“アタポンコツアンドロイド”(Atashi Ponkotsu Android)的简称,而根据百科这是第一期传统活动的活动曲,写的人绞尽脑汁想不出合适的词,因此代码命名就这么定下来了。虽然现在你们看不到了,但是以前 atapon 可是曾经骄傲地拥有一整个命名空间的,非常抢镜。

不是我黑,但是上面的例子看起来都像是临时工的大作。真的。

当然,这不影响万代躺着数钱。

分享到 评论

Git 在远程创建孤儿分支并推送

今天有一个需求。本地有一个代码库,我希望推送到自己的远程代码库的master(A/proj.git)作为存储;同时还要发布到另一个人的远程代码库,作为一个全新的、不带他的提交历史的分支(B/proj2.git),因为二者文件完全不相关。不过,B/proj2的feat分支现在并不存在。首先想到的方案就是,在B上创建一个孤儿(orphan)分支 feat,然后本地master直接 git push B feat 不就好了?嘛,被 Git 的各种机制坑了。

PS. 2016年8月到今年1月的文章,以后会放上来……

查看更多

分享到 评论

NuGet 依赖管理的一个陷阱

就在刚才,在重新组织项目结构的时候,见识到了一个 NuGet 依赖管理造成的bug。这个bug很隐蔽,症状让人莫明其妙,初见成功让我乱了阵脚。

查看更多

分享到 评论

博客迁移到新的域名下

我申请了新的域名 mottomo.moe,打算以后就将此作为包括博客在内的杂物的存放地。这个博客所使用的 DNS 已经设置将对 http://uiharu.moe/ 的访问自动跳转到 http://blog.mottomo.moe/。(DNS 免费账户的配额满了……所以只好忍痛弄了个 VPS,配置 httpd 来跳转。)

为什么要从 uiharu.moe 迁走呢?uiharu.moe 是我刚入宅不久还处于初春饰利狂热的时候注册的。后来我发现,将自己绑在一个角色上是不可能的。并不是说让大家都成为我的翅膀,而是因为他们都有着不同的闪光点,让人高度肯定。


说起来有点意思,“一番萌え”(ichiban.moe) 是在lan姐手上的。他(再一次指明,没写错)非常喜欢这个域名的 domain hack。当初是丧丝提出 ichiban.moe 的想法,好像是在一年以前吧,我记得。lan查到这个域名没注册,劝他赶紧买下来;丧丝说好贵不买,于是lan就将其收入囊中了。

分享到 评论

微信的两个反人类操作设计

为什么六月下旬到七月这段时间基本上没文章呢?因为储备不够啦!没有做出值得写的东西啦!六月毕业后游戏颓废了半个月,回家后也不知怎的效率低了许多,多个方面碰壁。

两个月前写的,吐槽一下微信的两个毛病。

2017-02: 好多积压的文章……

查看更多

分享到 评论

毕业

本科毕业典礼在今天举行。经过四年的学习生活,我毕业啦!

查看更多

分享到 评论

荷兰反签签证和出生证明的双认证办理指南

2019年了!不要再问我这些手续问题了!自己了解清楚!

  • 现在离写本文的时间已经快三年了,手续可能发生变化。
  • 我不是负责这些事务的工作人员,我并不会去了解最新消息。
  • 我不是专家,一切回答都是基于经验、记忆和推论。
  • 每次回答这些问题,我都得重新回忆整个过程,很烦,要推敲,还未必准确(只能尽量);而且我有时候会很忙,对于职责之外的事情会直接放鸽子,直到有空的时候。
  • 一旦因为我的回答(或者未回答)而使得某人的人生有了重大损失,这个我绝对担不起。

所以以后再收到关于本文的问询邮件,恕不回复。


如果没有什么意外的话(别给自己插旗啊),我八月就要到 TU/e 开始研究生生涯了。在此特别感谢村长。

本日志记录了在拿到 conditional acceptance 之后,剩余的手续(主要是签证和双认证)的办理过程。注意今年是2016年,我在北京的荷兰大使馆办理,其余地区(广州、重庆、上海领区在对应领事馆)也应该差不多。

办理时参考了这篇帖子和村长给的3+2后续手续攻略,不过我碰到的情况和二者都不一样(时间不同、所需材料不同),所以在此记录我自己的版本。

查看更多

分享到 评论

CGSS 核心反向过程实录 | 八、成果应用

索引

毕业设计完成,在毕业典礼之前的小假期有点时间写写文章。本系列主线终于结束了,接下来要做的就是周边开发内容和……荒废了半年的 Bulletproof。顺带说一句,第6篇已经解禁。

2017年5月追记:

我探索这些的目的,是以一个玩家的身份,让 CGSS 变得更好玩。私下里我类比过普罗米修斯,将天火——谱面的制作和玩的能力从“天上”分一点出来。其实,修改 CGSS 去作弊是很简单的,无论是客户端还是 MITM。但是我不会去作弊,也不希望这系列文章的读者们将文章内容用在歪门邪道上,不希望去作弊、破坏平衡性。玩过 LLSIFSB69GF(note)Arcaea 之后,我仍然认为 CGSS 的综合指标(游戏性、操作体验、曲目等等)是行业内翘楚,Cy这次比较用心。那么作弊还有什么意思嘛!对了,我不氪金,不冲分,只是闲暇时间来两局,玩得舒心。

当然,まゆさまが見ています。

查看更多

分享到 评论

自动引用计数的实现

在帮同学调 Qt 的程序的时候,发现了很好用的 QString,和 MFC 的 CString 一样是对字符串的封装,提供了许多实用函数。不过 QString 给我感觉最实用的是自动的资源生命周期管理机制,而且很明显是基于引用计数的。由于新语言瘾又上来了,再加上想到了 TJS,我就想实现自己的用引用计数管理的类。原理很简单,不过由于我没有亲自写过,所以在实现的时候遇到了困难,幸好都分析解决了。

其实 C++ 新标准中有 std::shared_ptr<T> 类,但是我不喜欢 shared_ptr<int> p = new int[10]; 这样强制要用指针的写法,而且每次都要带一个 shared_ptr 太费劲。如果我需要一个自动数据类(例如字符串),如下写法哪个更简单:

1
2
shared_ptr<String> pStr = new String(); // 写法1
String str; // 写法2

在用的时候,我关注的重点是 String 内的数据而不是 shared_ptr 的实现方式,所以 shared_ptr 能省就省。而且不是有人说过吗,要会用 Boost(shared_ptr 这个标准来自 Boost),更要理解它所使用的“奇技淫巧”的原理。所以为了掌握自主知识产权,还是有必要自己动手写一个引用计数管理的。

查看更多

分享到 评论

CGSS 核心反向过程实录 | 七、重新打包

索引

这文章一直了拖到6月2日啦!

2017年5月追记:

我探索这些的目的,是以一个玩家的身份,让 CGSS 变得更好玩。私下里我类比过普罗米修斯,将天火——谱面的制作和玩的能力从“天上”分一点出来。其实,修改 CGSS 去作弊是很简单的,无论是客户端还是 MITM。但是我不会去作弊,也不希望这系列文章的读者们将文章内容用在歪门邪道上,不希望去作弊、破坏平衡性。玩过 LLSIFSB69GF(note)Arcaea 之后,我仍然认为 CGSS 的综合指标(游戏性、操作体验、曲目等等)是行业内翘楚,Cy这次比较用心。那么作弊还有什么意思嘛!对了,我不氪金,不冲分,只是闲暇时间来两局,玩得舒心。

当然,まゆさまが見ています。

查看更多

分享到 评论