diff --git a/content/generated/friends/friends.json b/content/generated/friends/friends.json index 7d8c0cd..fbbe2d6 100644 --- a/content/generated/friends/friends.json +++ b/content/generated/friends/friends.json @@ -1 +1 @@ -[{"name": "Shu Lin", "twitter_uid": 1459453832, "twitter": "https://twitter.com/sauricat", "github": "https://github.com/sauricat", "blog": "https://shu-l.in/", "mastodon": "https://m.cmx.im/@sauricat", "avatar": "content/generated/friends/img/Shu Lin-avatar.jpg", "banner": "content/generated/friends/img/Shu Lin-banner.jpg"}, {"name": "\u804a\u804a", "twitter_uid": 2289619658, "twitter": "https://twitter.com/youquzhiji", "github": "https://github.com/youquzhiji", "avatar": "content/generated/friends/img/\u804a\u804a-avatar.jpg", "banner": "content/generated/friends/img/\u804a\u804a-banner.jpg"}, {"name": "Jun", "twitter_uid": 1191955056700076032, "twitter": "https://twitter.com/kevera_chan", "github": "https://github.com/gaojunxuan", "blog": "https://terra-incognita.dev/", "avatar": "content/generated/friends/img/Jun-avatar.jpg", "banner": "content/generated/friends/img/Jun-banner.jpg"}, {"name": "Yuuta", "twitter_uid": 1249818855712538624, "twitter": "https://twitter.com/NeoTrumeet", "github": "https://github.com/Trumeet", "blog": "https://blog.yuuta.moe/", "mastodon": "https://mastodon.yuuta.moe/@yuuta", "avatar": "content/generated/friends/img/Yuuta-avatar.jpg", "banner": "content/generated/friends/img/Yuuta-banner.jpg"}, {"name": "Patchy", "twitter_uid": 856037977893490688, "twitter": "https://twitter.com/PatchouliTDF", "github": "https://github.com/PatchyChan", "blog": "https://loft.mukiyu.moe/", "avatar": "content/generated/friends/img/Patchy-avatar.jpg", "banner": "content/generated/friends/img/Patchy-banner.jpg"}, {"name": "Menci", "twitter_uid": 1511944029440671746, "twitter": "https://twitter.com/lcMenci", "github": "https://github.com/Menci", "blog": "https://men.ci/", "avatar": "content/generated/friends/img/Menci-avatar.jpg", "banner": "content/generated/friends/img/Menci-banner.jpg"}, {"name": "\u84dd\u82e5\u9ece", "twitter_uid": 1146653748405522432, "twitter": "https://twitter.com/lanruoliowo", "mastodon": "https://mastodon.social/@lanruoli", "avatar": "content/generated/friends/img/\u84dd\u82e5\u9ece-avatar.jpg", "banner": "content/generated/friends/img/\u84dd\u82e5\u9ece-banner.jpg"}, {"name": "\u9727\u96e8\u6842\u5b50", "twitter_uid": 1419580851587665922, "twitter": "https://twitter.com/kirisamelev", "avatar": "content/generated/friends/img/\u9727\u96e8\u6842\u5b50-avatar.jpg", "banner": "content/generated/friends/img/\u9727\u96e8\u6842\u5b50-banner.jpg"}, {"name": "\u8c46\u8150\u7403", "blog": "https://tofuball.moe", "avatar": "content/generated/friends/img/\u8c46\u8150\u7403-avatar.jpg", "banner": "content/generated/friends/img/\u8c46\u8150\u7403-banner.jpg"}, {"name": "Ayu \u751c\u9c7c", "github": "https://github.com/ayuusweetfish", "blog": "https://ayu.land/", "avatar": "content/generated/friends/img/Ayu \u751c\u9c7c-avatar.jpg", "banner": "content/generated/friends/img/Ayu \u751c\u9c7c-banner.jpg"}, {"name": "\u3057\u3083\u307e \u306d\u3053", "sekai": "http://25-ji.com/", "avatar": "content/generated/friends/img/\u3057\u3083\u307e \u306d\u3053-avatar.jpg", "banner": "content/generated/friends/img/\u3057\u3083\u307e \u306d\u3053-banner.jpg"}, {"name": "Clansty \u51cc\u839e", "avatar": "content/generated/friends/img/Clansty \u51cc\u839e-avatar.jpg", "banner": "content/generated/friends/img/Clansty \u51cc\u839e-banner.jpg", "twitter": "https://twitter.com/", "mastodon": "https://nya.one/@Clansty", "github": "https://github.com/Clansty", "blog": "https://nyac.at/"}, {"name": "Billchenchina", "twitter_uid": 1237960533694799872, "twitter": "https://twitter.com/BillChen2001", "github": "https://github.com/billchenchina", "blog": "https://billchen.bid/", "avatar": "content/generated/friends/img/Billchenchina-avatar.jpg", "banner": "content/generated/friends/img/Billchenchina-banner.jpg"}, {"name": "\u828b\u5934 Leohearts", "twitter_uid": 3692606353, "twitter": "https://twitter.com/TaroLeohearts", "github": "https://github.com/leohearts", "blog": "https://leohearts.com/", "avatar": "content/generated/friends/img/\u828b\u5934 Leohearts-avatar.jpg", "banner": "content/generated/friends/img/\u828b\u5934 Leohearts-banner.jpg"}, {"name": "Sez", "twitter_uid": 1085791168040861696, "twitter": "https://twitter.com/fiberate_Sez", "github": "https://github.com/Sezriv", "avatar": "content/generated/friends/img/Sez-avatar.jpg", "banner": "content/generated/friends/img/Sez-banner.jpg"}, {"name": "\u706f\u82b1", "github": "https://github.com/yisuidenghua", "blog": "https://\u8bfa\u827e\u5c14.\u6211\u7231\u4f60/", "avatar": "content/generated/friends/img/\u706f\u82b1-avatar.jpg", "banner": "content/generated/friends/img/\u706f\u82b1-banner.jpg"}, {"name": "\u7720\u6d32", "twitter_uid": 744600383767478273, "twitter": "https://twitter.com/usagiByTheShore", "avatar": "content/generated/friends/img/\u7720\u6d32-avatar.jpg", "banner": "content/generated/friends/img/\u7720\u6d32-banner.jpg"}, {"name": "Kiritake Kumi", "twitter_uid": 1487954996117131264, "twitter": "https://twitter.com/kiritakekumi", "github": "https://github.com/KiritakeKumi", "blog": "https://niconiconi.us/", "avatar": "content/generated/friends/img/Kiritake Kumi-avatar.jpg", "banner": "content/generated/friends/img/Kiritake Kumi-banner.jpg"}, {"name": "Saukiya", "twitter_uid": 1280384632748257282, "twitter": "https://twitter.com/SaukiyaSX", "github": "https://github.com/Saukiya", "avatar": "content/generated/friends/img/Saukiya-avatar.jpg", "banner": "content/generated/friends/img/Saukiya-banner.jpg"}, {"name": "kunihiro", "avatar": "content/generated/friends/img/kunihiro-avatar.jpg", "banner": "content/generated/friends/img/kunihiro-banner.jpg", "twitter_uid": "https://twitter_uid.com/krypterad_", "github": "https://github.com/Linoleum2609", "blog": "https://kunihi.ro/"}, {"name": "Vanilla", "twitter_uid": 1152026009836777472, "twitter": "https://twitter.com/osu_Vanilla", "github": "https://github.com/VergeDX", "avatar": "content/generated/friends/img/Vanilla-avatar.jpg", "banner": "content/generated/friends/img/Vanilla-banner.jpg"}, {"name": "\u9ebb\u85af", "twitter_uid": 3029159570, "twitter": "https://twitter.com/Origamitamaran", "avatar": "content/generated/friends/img/\u9ebb\u85af-avatar.jpg", "banner": "content/generated/friends/img/\u9ebb\u85af-banner.jpg"}, {"name": "\u5b8c\u989c\u6f84", "twitter_uid": 711888363423272960, "twitter": "https://twitter.com/zsy123515", "avatar": "content/generated/friends/img/\u5b8c\u989c\u6f84-avatar.jpg", "banner": "content/generated/friends/img/\u5b8c\u989c\u6f84-banner.jpg"}] \ No newline at end of file +[{"name": "Shu Lin", "twitter_uid": 1459453832, "twitter": "https://twitter.com/sauricat", "github": "https://github.com/sauricat", "blog": "https://shu-l.in/", "mastodon": "https://m.cmx.im/@sauricat", "avatar": "content/generated/friends/img/Shu Lin-avatar.jpg", "banner": "content/generated/friends/img/Shu Lin-banner.jpg"}, {"name": "\u804a\u804a", "twitter_uid": 2289619658, "twitter": "https://twitter.com/youquzhiji", "github": "https://github.com/youquzhiji", "avatar": "content/generated/friends/img/\u804a\u804a-avatar.jpg", "banner": "content/generated/friends/img/\u804a\u804a-banner.jpg"}, {"name": "Jun", "twitter_uid": 1191955056700076032, "twitter": "https://twitter.com/kevera_chan", "github": "https://github.com/gaojunxuan", "blog": "https://terra-incognita.dev/", "avatar": "content/generated/friends/img/Jun-avatar.jpg", "banner": "content/generated/friends/img/Jun-banner.jpg"}, {"name": "Yuuta", "twitter_uid": 1249818855712538624, "twitter": "https://twitter.com/NeoTrumeet", "github": "https://github.com/Trumeet", "blog": "https://blog.yuuta.moe/", "mastodon": "https://mastodon.yuuta.moe/@yuuta", "avatar": "content/generated/friends/img/Yuuta-avatar.jpg", "banner": "content/generated/friends/img/Yuuta-banner.jpg"}, {"name": "Patchy", "twitter_uid": 856037977893490688, "twitter": "https://twitter.com/PatchouliTDF", "github": "https://github.com/PatchyChan", "blog": "https://loft.mukiyu.moe/", "avatar": "content/generated/friends/img/Patchy-avatar.jpg", "banner": "content/generated/friends/img/Patchy-banner.jpg"}, {"name": "Menci", "twitter_uid": 1511944029440671746, "twitter": "https://twitter.com/lcMenci", "github": "https://github.com/Menci", "blog": "https://men.ci/", "avatar": "content/generated/friends/img/Menci-avatar.jpg", "banner": "content/generated/friends/img/Menci-banner.jpg"}, {"name": "\u84dd\u82e5\u9ece", "twitter_uid": 1146653748405522432, "twitter": "https://twitter.com/lanruoliowo", "mastodon": "https://mastodon.social/@lanruoli", "avatar": "content/generated/friends/img/\u84dd\u82e5\u9ece-avatar.jpg", "banner": "content/generated/friends/img/\u84dd\u82e5\u9ece-banner.jpg"}, {"name": "\u9727\u96e8\u6842\u5b50", "twitter_uid": 1419580851587665922, "twitter": "https://twitter.com/kirisamelev", "avatar": "content/generated/friends/img/\u9727\u96e8\u6842\u5b50-avatar.jpg", "banner": "content/generated/friends/img/\u9727\u96e8\u6842\u5b50-banner.jpg"}, {"name": "\u8c46\u8150\u7403", "blog": "https://tofuball.moe", "avatar": "content/generated/friends/img/\u8c46\u8150\u7403-avatar.jpg", "banner": "content/generated/friends/img/\u8c46\u8150\u7403-banner.jpg"}, {"name": "Ayu \u751c\u9c7c", "github": "https://github.com/ayuusweetfish", "blog": "https://ayu.land/", "avatar": "content/generated/friends/img/Ayu \u751c\u9c7c-avatar.jpg", "banner": "content/generated/friends/img/Ayu \u751c\u9c7c-banner.jpg"}, {"name": "\u3057\u3083\u307e \u306d\u3053", "sekai": "http://25-ji.com/", "avatar": "content/generated/friends/img/\u3057\u3083\u307e \u306d\u3053-avatar.jpg", "banner": "content/generated/friends/img/\u3057\u3083\u307e \u306d\u3053-banner.jpg"}, {"name": "Clansty \u51cc\u839e", "avatar": "content/generated/friends/img/Clansty \u51cc\u839e-avatar.jpg", "banner": "content/generated/friends/img/Clansty \u51cc\u839e-banner.jpg", "twitter": "https://twitter.com/", "mastodon": "https://nya.one/@Clansty", "github": "https://github.com/Clansty", "blog": "https://nyac.at/"}, {"name": "Billchenchina", "twitter_uid": 1237960533694799872, "twitter": "https://twitter.com/BillChen2001", "github": "https://github.com/billchenchina", "blog": "https://billchen.bid/", "avatar": "content/generated/friends/img/Billchenchina-avatar.jpg", "banner": "content/generated/friends/img/Billchenchina-banner.jpg"}, {"name": "\u828b\u5934 Leohearts", "twitter_uid": 3692606353, "twitter": "https://twitter.com/TaroLeohearts", "github": "https://github.com/leohearts", "blog": "https://leohearts.com/", "avatar": "content/generated/friends/img/\u828b\u5934 Leohearts-avatar.jpg", "banner": "content/generated/friends/img/\u828b\u5934 Leohearts-banner.jpg"}, {"name": "Sez", "twitter_uid": 1085791168040861696, "twitter": "https://twitter.com/fiberate_Sez", "github": "https://github.com/Sezriv", "avatar": "content/generated/friends/img/Sez-avatar.jpg", "banner": "content/generated/friends/img/Sez-banner.jpg"}, {"name": "\u706f\u82b1", "github": "https://github.com/yisuidenghua", "blog": "https://\u8bfa\u827e\u5c14.\u6211\u7231\u4f60/", "avatar": "content/generated/friends/img/\u706f\u82b1-avatar.jpg", "banner": "content/generated/friends/img/\u706f\u82b1-banner.jpg"}, {"name": "\u7720\u6d32", "twitter_uid": 744600383767478273, "twitter": "https://twitter.com/usagiByTheShore", "avatar": "content/generated/friends/img/\u7720\u6d32-avatar.jpg", "banner": "content/generated/friends/img/\u7720\u6d32-banner.jpg"}, {"name": "Kiritake Kumi", "twitter_uid": 1487954996117131264, "twitter": "https://twitter.com/kiritakekumi", "github": "https://github.com/KiritakeKumi", "blog": "https://niconiconi.us/", "avatar": "content/generated/friends/img/Kiritake Kumi-avatar.jpg", "banner": "content/generated/friends/img/Kiritake Kumi-banner.jpg"}, {"name": "Saukiya", "twitter_uid": 1280384632748257282, "twitter": "https://twitter.com/SaukiyaSX", "github": "https://github.com/Saukiya", "avatar": "content/generated/friends/img/Saukiya-avatar.jpg", "banner": "content/generated/friends/img/Saukiya-banner.jpg"}, {"name": "kunihiro", "avatar": "content/generated/friends/img/kunihiro-avatar.jpg", "banner": "content/generated/friends/img/kunihiro-banner.jpg", "twitter_uid": "https://twitter_uid.com/krypterad_", "github": "https://github.com/Linoleum2609", "blog": "https://kunihi.ro/"}, {"name": "Vanilla", "twitter_uid": 1152026009836777472, "twitter": "https://twitter.com/osu_Vanilla", "github": "https://github.com/VergeDX", "avatar": "content/generated/friends/img/Vanilla-avatar.jpg", "banner": "content/generated/friends/img/Vanilla-banner.jpg"}, {"name": "\u9ebb\u85af", "twitter_uid": 3029159570, "twitter": "https://twitter.com/Origamitamaran", "avatar": "content/generated/friends/img/\u9ebb\u85af-avatar.jpg", "banner": "content/generated/friends/img/\u9ebb\u85af-banner.jpg"}, {"name": "\u5b8c\u989c\u6f84", "twitter_uid": 711888363423272960, "twitter": "https://twitter.com/zsy123515", "avatar": "content/generated/friends/img/\u5b8c\u989c\u6f84-avatar.jpg", "banner": "content/generated/friends/img/\u5b8c\u989c\u6f84-banner.jpg"}, {"name": "\u9759\u9759", "blog": "https://leak.moe/", "avatar": "content/generated/friends/img/\u9759\u9759-avatar.jpg", "banner": "content/generated/friends/img/\u9759\u9759-banner.jpg"}] \ No newline at end of file diff --git a/content/generated/metas.json b/content/generated/metas.json index d5404e7..eb0fec1 100644 --- a/content/generated/metas.json +++ b/content/generated/metas.json @@ -3,7 +3,7 @@ "categories": [["置顶", 1], ["电影", 3], ["技术", 1], ["日记", 2], ["梦", 1], ["想想想", 1]], "pins": [15], "posts": [ - {"id": 15, "title": "部落格索引", "subtitle": "按分类、标签检索", "category": "置顶", "pinned": 1, "file": "content/posts/Index.md", "tags": [], "date": "2025-04-29T07:14:23.655421", "url_name": "Index", "content": "按分类检索:\n\n\n\n按主题检索:\n\n"}, + {"id": 15, "title": "部落格索引", "subtitle": "按分类、标签检索", "category": "置顶", "pinned": 1, "file": "content/posts/Index.md", "tags": [], "date": "2025-04-30T11:15:20.197209", "url_name": "Index", "content": "按分类检索:\n\n\n\n按主题检索:\n\n"}, {"id": 14, "title": "《欢迎来到駒田蒸馏所》感想", "subtitle": "关于威士忌蒸馏所、以及在平凡工作中找到热情的故事", "title_image": "https://profile-content.hydev.org/content/posts/Assets/2025-04-18%20Komada%20Whiskey%20Family/title.png", "tags": ["电影", "剧透警告"], "category": "电影", "file": "content/posts/2025-04-18 Komada Whiskey Family.md", "date": "2025-04-18T00:00:00", "url_name": "2025-04-18-Komada-Whiskey-Family", "content": "昨天看了电影《駒田蒸馏所へようこそ》,原来威士忌是这样做出来的,好奇妙\n\n除了威士忌以外,我好喜欢这部电影对理想的呈现——不是追求一个目标的过程,而是这个目标最初的形成,是从一份无聊的工作中找到意义的过程。\n\n男主刚开始很迷茫的样子,在新闻社工作却并不喜欢新闻,觉得是被分配了麻烦的活赶快做完算了,结果去采访甚至搞错了采访对象是哪家蒸馏所。他羡慕别人一开始就知道自己想做什么,可是并不是这样...\n\n
用平假名查谷歌不太聪明喵
\n\n女主年纪轻轻就继承了家业并不是她最初想做的事情。她原本在艺校想做画师,但是蒸馏所地震让热销的威士忌「独楽」无法再产,她父亲因此过劳去世,计划继承家业的哥哥也离开了。原本已经准备停业了,但是她看着母亲的坚持很不甘心、想要让蒸馏所的大家回到以前的气氛,决定退学用剩下的原酒放手一搏,在大家的帮助下从零开始了解威士忌...\n\n
有些羡慕女主妈妈能允许她退学这样拼
\n\n随着男主逐渐了解女主这段经历,也许是被她复活独楽的执着打动,才找到了继续做新闻工作的动力——为了让更多人听到女主的执着和独楽的进展、为了请求群众帮忙找到合适的原酒——最终让一件不得不做的麻烦任务成为了自己的热情。\n\n## 理想的诅咒\n\n回到我的生活,原本以为自己想做什么已经非常明确了,但是现在快毕业了才发现自己比身边的人更迷茫,因为我真的好害怕自己会变成最开始男主的那个样子,只是为了生存做着自己不喜欢的事情...\n\n想过申课程型硕士觉得肯定考完试就会把课程内容全忘掉,想过申研究型硕士又害怕导师给的研究题目我会不感兴趣,想过去大厂工作又担心自己对项目的想法和坚持会被上层忽视,创业小厂联系过我我又觉得像是痴人说梦,继续做自己在做的小众项目也赚不到钱。\n\n但是看完这部电影之后,感觉我对未来没那么害怕了,因为也许那些一开始觉得麻烦无聊的工作,只要用心理解,也能在某个特别的方向上找到自己的热情和意义吧——也许课程型硕士的小组作业会成为把代办里一个人做不到的想法实现出来的契机,也许无聊的研究题目也能加些私货向喜欢的方向靠拢,也许去大厂即使想法被无视也能很快攒够资金去开现在开不起的大坑——感谢駒田蒸馏所解除了理想对我的诅咒。"}, {"id": 13, "title": "《A Minecraft Movie》影评", "subtitle": "桂桂评分:★★☆☆☆ 2/5", "title_image": "https://profile-content.hydev.org/content/posts/Assets/2025-04-04%20Minecraft%20Movie/title.png", "tags": ["电影"], "category": "电影", "file": "content/posts/2025-04-04 Minecraft Movie.md", "date": "2025-04-04T00:00:00", "url_name": "2025-04-04-Minecraft-Movie", "content": "Minecraft 电影刚上映,虽然已经知道了评价不太好,但是毕竟是陪伴了我 12 年的游戏还是第一天去看了,结果不出意料让我有些失望。\n\n首先说优点,我觉得对游戏机制还原得还不错——水桶速降、鞘翅烟花加速、末影人的视线仇恨、铁傀儡仇恨、喂两个动物吃食物会迷之冒出小动物(?)把原本游戏里这些不合逻辑的奇妙机制都展现出来了。\n\n缺点的话,可能就是「演出感」太浓了,感觉主角团智商完全没上线。很多困境都是只要留心就不会遇到的,也有很多次绕了大圈去解决很琐碎的事情。比起「遇到困境之后想出了解决方案」更像是「为了展示一个特定的解决方案而创造了困境」... 很多解决方案都是比起实用性更在意演出效果和 meme 程度。\n\n作为一个 Minecraft 电影我可以说它既没有 Mine 也没有 Craft... 就比如,整个电影结束没有一个人造出工作台或者把摆在那里的工作台带走就好过分啊?离开村子起飞的时候还把武器掉下了,真的没有一个人想到之后可能会用到?之后果然就遇到了需要打架但是没有武器的场面,然后大家还完全没对武器丢了感到惊讶,就像从来就没有造过武器一样?然后主角 Henry 去翻宝箱找 Earth Crystal 的时候翻到了两把武器,却只拿了自己的,多余的也没给朋友拿上...\n\n感觉就像是一个解谜地图的作者在直播玩自己的解谜,如果已经知道了接下来要怎么解为什么要动脑子?但是不动脑子的话,预先设想好的解法在观众眼里就变成了最繁琐最莫名其妙的。\n\n还有就是剧情实在太平淡了,超耿直毫无转折完全可以预测接下来会发生什么,也几乎没有人物塑造。感觉导演的优先级是 玩梗 > 展示游戏机制 >>> 角色成长 > 冒险解谜。\n\n不过看到结尾还是有些感动。结尾主角团拯救了 Minecraft 世界之后把从这里获得的成长和知识带到了现实中,解决了现实中各自的困境... 我觉得这部电影最真实的一幕可能就在这里。\n\n我也是从搭建建筑,到设计起红石电路,再到写起自己的插件和模组,最后像电影里一样走出 Minecraft 把这些技能带到现实,给我了有想法就自己去创造的勇气和能力——这才是我最喜欢 Minecraft 的原因,也是这个电影试图表达的,即使表达得不是很好。\n\n总之我给 2/5 星,也许适合关掉脑子看"}, {"id": 12, "title": "世界计划 缤纷舞台!feat. IL2Cpp", "title_image": "https://profile-content.hydev.org/content/posts/Assets/2024-10-24%20PJSK%20Reversing/crop.png", "subtitle": "从零开始解密 pjsk 的网络请求", "tags": ["ctf", "教程"], "file": "content/posts/2024-10-24 PJSK Reversing.md", "date": "2024-10-24T00:00:00", "url_name": "2024-10-24-PJSK-Reversing", "content": "玩了这么久プロセカ,有点想分析一下游戏的排行数据,做一些自动化,比如让自己一直停留在整两百名之类的。这种手游抓抓包模仿请求一定不会很难吧——装上 Reqable 连上模拟器抓抓包偷吃几块饼干之后发现,请求负载和返回内容都依然是乱码...\n\n
只偷吃到了饼干渣
\n\n看到乱码的第一反应是编码不对,或者过了某种基础混淆,总之先丢给 CyberChef 看看魔法糊糊器能不能把答案糊出来,发现不行。去群里问问之后 Menci 和我说是 AES 加密过的,还告诉我了加密密钥在 APIManager 里面,那就试着找找吧\n\n## 1 从拆开 APK 开始\n\n因为プロセカ的客户端能够解密,那么解密密钥一定就在客户端里。首先下载了プロセカ 4.0.0 的 XAPK 包。所谓的 XAPK 其实就是把多个 APK 压缩在一起啦,其中一个包含了所有架构共享的文件,另一个包里放了 arm64 平台专属的二进制(虽然这个游戏好像还没有编译过除了 arm64 以外的平台,不知道为什么还要这样分包)\n\n解压缩之后单独用 apktool 把两个安装包的文件拆出来看一看吧。目录结构看上去就是一个一般的 IL2Cpp Unity 项目,没有什么特别的。编译过的游戏二进制在 lib/arm64-v8a/libil2cpp.so 里面,然后运行它、让它能够和 C# 那边的程序对接需要的元信息在 assets/bin/Data/Managed/Metadata/global-metadata.dat 里面。\n\n
两个重要的文件
\n\n如果想要快速找到代码的话,只看 IL2Cpp 编译好的的二进制肯定不行。这个文件里一共有 44 万个没有名字的函数指针,IDA 把这些分析出来都花了快一个小时,从这里一个一个找肯定是不行的。所以我搜索了一下 IL2Cpp 反编译,找到了 Perfare/IL2CppDumper 这个工具,试了一下发现报错说 \"Metadata file supplied is not valid metadata file\"\n\n
正常的元文件的文件头
\n\n为什么呢?看了一下,一般的 global-metadata 的文件头是 0xAF1BB1FA,而我拿到的这个不是,也就说明它很可能被加了壳。\n\n## 2. 脱壳元文件\n\n怎样解密呢?首先试了同一个作者的另一个工具 Zygisk-IL2CppDumper,是一个据说可以自动解密元文件的 Magisk 模块,但是构建好装上之后打开游戏发现什么都没有发生,说会解包到 /data/data 里面但是也没有,还是试试别的方法吧。\n\n既然上次用 Cheat Engine 在电脑上从内存中脱壳了 maimai 的 Assembly-CSharp,我觉得应该也可以用同样的方式脱壳プロセカ的元文件,所以就下载了一份 Game Guardian 试了一下。打开游戏,挂载上 GG,内存搜索 \"H AF1BB1FA\" 之后马上就找到了!\n\n
搜索到了内存
\n\n把地址复制下来,去第四个 Tab 把地址粘贴进去之后点旁边的选择器选中这个区域的头到尾,导出成文件之后重命名成新的 global-metadata.dat 就可以了。之后重新试了一下用 IL2CppDumper 反编译就没有报错了!\n\n
反编译成功了!
\n\n虽然还是有 \"This file may be protected\" 的报错,原本还以为 libil2cpp.so 也被套了壳,结果发现并没有,只是识别到了 JNI_OnLoad 预警性地报了一个错而已,也就是说已经成功啦。看了一眼 Dumper 输出的 `dump.cs`,里面确实有 APIManager,里面也确实用到了 AES 加密,但是因为实现的部分被转成二进制了,这里只能看到定义。\n\n## 3. 找钥匙!\n\n接下来就是找钥匙的环节,但是怎么找呢?如果要找到钥匙的话,大概需要看一下 APIManager 的代码实现,可是 `dump.cs` 里面只有空壳没有实现,可是只看 libil2cpp.so 又没办法知道 APIManager 在哪... 怎么办呢?看了一下 Dumper 仓库里面写的文档,看起来像是能和 IDA 联动让实现和空壳结合在一起的样子,那就下载一个 IDA 试试吧。\n\n下载了 IDA 9.0,其实不太会用,我只懂得基础操作比如用 F5 切换反编译代码和汇编之类的,但是总之先打开二进制 libil2cpp.so 看看吧。刚打开的时候什么都没有,只有不到一百个函数,我还在怀疑是不是打开错文件了,但是等了十分钟又出现了很多函数,发现原来它只是还没有分析完... 可能 150MB 大的二进制对于 IDA 来说也太大了吧,完整分析完花了差不多一个小时,存的数据库有 2 GB 大 (╯’ – ‘)╯︵ ┻━┻\n\n
好大文件
\n\n分析完之后依然没有函数名,全部都是 sub_1234567 这样的数字编号。看着 Dumper 的文档试着用 File > Script file 跑了一下那个 ida_py3 的脚本,选中了 script.json 之后函数名确实出现了!不过这只是第一步。\n\n看了 `dump.cs` 里面的函数定义之后,我觉得 CreateCrypt 这个函数比较像是我们要找的,因为是一个静态函数,调用了之后会凭空造出来一个 FastAES 的实例,而 FastAES 需要传入两个钥匙才能创建实例,所以无论怎样这里都会用到钥匙吧?\n\n
APIManager 的函数定义
\n\n看看反汇编的二进制代码发现确实用到了密钥。虽然变量全都被打乱了,但是从 FastAES 的构造器参数可以看出来 v3 v4 是 AES128 的两个钥匙 (key, iv),然后规格是 AES128,密文模式 1 (CBC),补格模式 2 (PKCS7)。那么这两个变量是从哪里来的呢?从代码里也能看到,v2 是从 v1 + 184 的指针地址读过来的,v3 是 v2 的值,v4 是 v2 的下一个值也就是 v1 + 192,而 v1 是 APIManager_TypeInfo 的地址。\n\n\n\n从 C# 的逻辑上想的话,TypeInfo 应该是一个类附带的常量或者变量类型的地方,从 `dump.cs` 里面可以看到它定义的变量指针偏差从 0 加到 8 加到 0x20, 0x28... 可是这里面没有 +184 = 0xb8 这个位置,为什么呢?\n\n
APIManager 类的变量偏差最高到了 0x38
\n\n我在这里卡了超级久,然后看了一下构造器发现 +184 这个偏差原来是在调用构造器的时候动态写进去的,是代码里面没有定义的,也许是某种编译器优化吧。打开 `APIManager$$.cctor` 构造器首先发现的是它写入了指向 +184 的地方 (L23 行),写入的是 v3 的值。向前读可以看到 v3 就是 v1,是一个空的 16 字节数组,然后把 v2 的数据复制到了 v1,而 v2 是 `Field__` 开头的这一长串。\n\n
cctor 构造器的反编译代码
\n\n回到 `dump.cs` 里面查找这个字段,发现它是一个编译器生成的只读项,上面下面也有类似的东西,看这个 \"Static Array Init Type Size\" 的话这些应该就是代码里用到的数组常量被转移到的位置了。但是这一长串的十六进制似乎只是某种指针,数值似乎不在这里——因为如果是数值的话,数组的长度对不上——我们要找的 AES128 密钥是 128 位也就是 16 字节,但是这一长串每个都有 32 字节,和前面的 Array Size 也对不上。那么数值在哪呢?\n\n
十六进制 offset 在编辑器里五颜六色
\n\n看到后面五颜六色的 offset 那里写了注释 \"Metadata offset\",我就在想难道它会在 global-metadata 里面吗?用 hexed.it 打开了这个文件然后把 offset 复制到 Go to 栏里面转向,发现那里真的有一个 16 位的钥匙!接下来又按同样的方式找到了 16 位的 iv,整个 AES 加密就被破解啦(在这里打一下码,需要的话看完这篇肯定就能够自己找到了 quq)\n\n
找到了 16 位的钥匙
\n\n## 4. 可以解密了!\n\n接下来就是解密的过程了,把请求内容和返回内容都导出成文件,再随手用搓两行 python 脚本就可以解密啦:\n\n```python\nimport sys\nfrom Crypto.Cipher import AES\nfrom Crypto.Util.Padding import unpad\nfrom pathlib import Path\n\naes = AES.new(b\"- key here qwq -\", AES.MODE_CBC, b\"- iv here meow -\")\ndec = lambda x: unpad(aes.decrypt(x), AES.block_size, style='pkcs7')\n\n[f.with_suffix(\".dec\").write_bytes(dec(f.read_bytes())) \n for f in Path(sys.argv[1]).glob(\"*\")]\n```\n\n解密之后似乎是一个 pjsk 自己的二进制序列化格式,看起来还需要一些时间研究怎样把它转换成 json 呢,不过今天就到这里好啦,累累睡睡(x)\n\n
解密之后的明文
"},