泛滥的山寨APP,仍在换皮重生

安卓难禁,苹果也不容乐观。

撰文 | 李欢

编辑 | 赵晋杰

来源 | 盒饭财经(ID:daxiongfan)

本来想注册“嘀嗒出行”的北京车主王晓琳,最近被一款名叫“滴答顺风车”的换皮APP给骗了。

今年8月初,她第一次使用“滴答顺风车”,被强制收取了9块9的车主认证费,最后不仅没有注册成功,连对方客服电话都没能打通。

当她将个人遭遇发到黑猫投诉平台上后,才发现受骗的不止自己一人,更有用户称自己被诱导购买了两年588元的VIP会员。

购买了588元VIP会员的陈鹏表示,“苹果和各大安卓商城都上架了‘滴答顺风车’,从标识和文字以及应用介绍,都碰瓷嘀嗒出行。”

泛滥的山寨APP,仍在换皮重生

如滴答一类的所谓山寨APP,正是通过盗用正版APP的图标和名称,来侵害用户权益,从而谋求非法获利的应用软件。

山寨APP的危害,并不亚于木马病毒。

北京高勤律师事务所合伙人王源告诉盒饭财经,这些出现在诱导链接中的山寨APP,与正版APP具有高度相似性,一旦下载,容易很隐蔽地违法收集用户个人信息,尤其是通讯录和行踪轨迹等。此外,山寨APP也经常频繁弹窗提示兑奖、扣费等,进而实施金融诈骗。

作为山寨软件过滤器的应用商店,尽管近些年来不断在提高审核能力,但仍然难以避免其成为山寨软件的重灾区。

仅去年一整年,苹果App Store就封杀了6.35万个盗版APP。凭借封闭生态,安全系数更为强大的App Store尚且如此,更开放的安卓系统,在海量的山寨软件面前,面对的无疑是一个更复杂的治理环境。

泛滥的山寨APP,仍在换皮重生

互联网领域,一直是山寨APP泛滥的重灾区。

2018年社交电商风起云涌之际,拼多多成为卷入“山寨漩涡”的明星公司,身后尾随了一大批山寨APP。它们与拼多多仅一字之差,如“平多多”“品多多”“聚多多”等。在早期运营中,这些真假难辨的名称,足以迷惑住偏远地区用户群,老龄人口更是受骗的高危人群。

除了名字,山寨APP连经营模式也模仿。比如,一款名叫拼趣多的高仿软件,试图模仿社交电商,但设计出的拼团购,单人也能下单,“拼团购”功能形同虚设。

但在用户活跃度上,拼趣多还是扑棱了两下。据拼趣多官方资料,自2017年7月9日正式运营以来,平台已累积接近两百万用户量,月均流水接近500万。

生命力顽强的高仿APP们之所以层出不穷,也与背后技术门槛不高有关。

盒饭财经发现,一些科技公司在知乎上会做广告宣传,称自己有类似于抖音的短视频APP源码;B站上,更是能直接搜到“仿抖音快手”的各类开发教程。

泛滥的山寨APP,仍在换皮重生

制作山寨软件,在黑产市场,早已暗中形成了一条隐秘而稳定的产业链。

对于成熟的山寨软件开发者来说,几天时间内就可以做出一套前端框架。服务器、源代码、域名、服务商这些内容的创建,通过网上租赁的方式就可以解决。

像一款苹果应用商城里上线的借贷类APP,有的黑产从业者报价5500元,能达到1:1级别的复制,但这并不包括后续每月的运营费和其他费用。假如仿冒一些上市公司的软件,报价甚至高达近三万元,20天就能完工。

如果想要让这些仿冒APP成功上线苹果或者安卓的应用商店,只需要在完工后支付相应的费用即可。

在捞钱的套路上,山寨APP也想了很多办法。

比如,一款成本极低的山寨软件,只是顶着与正版极其相似的名称和图标,仅仅通过替换正版软件的广告商、收集用户隐私这两种方式,就能赚取巨额的广告费、窃取用户数据完成诈骗。

苹果App Store上甚至专门出现了一类奉行“免费订阅+订阅扣费”的诈骗软件。

比如一款不起眼的“PDF阅读器”,一度是美区Mac App Store里下载量最大的APP。这类小体量的APP诱导性极强,用户安装完成后在使用过程中,页面会弹出一系列欺骗性十足的按钮,三两步就能误导用户订阅,当免费试用期过了之后,“订阅”就开始悄悄地扣费了。

泛滥的山寨APP,仍在换皮重生

为了让更多用户看见然后订阅,很多山寨软件往往还会通过刷下载量和评论的方式来提高曝光率。

今年2月底,软件开发者凯文 · 阿彻(Kevin Archer)发现,自己开发的“Authenticator-2 Factor app”软件被一款俄罗斯软件山寨了,“Authenticator-APP”,它的名字与正版十分相似。

这款山寨软件要求用户在初次使用时,就得在应用商店进行评价为其增加软件热度。

而且,Authenticator-APP同样采取“订阅制”,一旦用户忘记取消订阅,每周就要支付3.99美元的订阅费。

泛滥的山寨APP,仍在换皮重生

无数山寨APP,暗藏在很多来源不明的链接和应用商店里。每年监管重压之下,都会对这些危险软件,进行一波集中清理下架。

但由于很多APP的开发技术是开源的,山寨APP在网络空间中,很容易打一枪换一个地方。

这也直接造成安卓应用商店成为山寨软件滋生的“沃土”。

王源告诉盒饭财经,因为安卓系统具有开放性,“山寨”APP容易出现在安卓系统的手机中,而监管对违法违规收集个人信息的APP进行“点名”“下架”行动中,也主要是针对安卓系统的APP。

国家网信办反诈中心于2022年发布的数据显示,4.2万个仿冒APP受到排查打击,并纳入国家涉诈黑样本库。

更重要的是,山寨APP数量,还会随着正版软件的热度水涨船高。

360公司首席反诈骗专家裴智勇曾介绍,当一款正版APP数量超过5000万时,市场上至少会尾随700种各式各样的山寨货,而低于10万的APP身后也会有二三十个“盗版”跟随。

在应付猖獗的山寨风险软件这一点上,苹果App Store同样无法做到万无一失。

2014年8月,上海陆家嘴国际金融资产交易市场股份有限公司(下称“陆金所”)在日常安全监控中,发现在苹果应用商店上,暗藏着一款山寨版陆金所官方应用。

这个盗版软件存在安全隐患,可能会误导用户,陆金所要求苹果下架侵权隐患APP,但没有得到苹果的正面回应,3个月后,陆金所直接向美国北加州旧金山地区法院递交了起诉状。

事实上,苹果商店中出现虚假山寨软件并不是新鲜事,比如,曾经出现的《Temple Jump 》《Plant vs. Zombie》,就分别模仿了《Temple Run》《植物大战僵尸》。

泛滥的山寨APP,仍在换皮重生

想要彻底治理山寨APP,目前仍是一道难题。

2022年8月1日起施行的《移动互联网应用程序信息服务管理规定》中,加强了应用商店的个人信息保护、内容审核、数据安全责任。

为了解决安卓系统开放性带来的APP审核标准不统一难题,隶属工信部的中国信通院泰尔终端实验室特意研发了一套“APP签名服务系统”,用于构建统一的APP认证签名体系,从APP各个环节中提升可溯源性,并推动解决APP的仿冒问题。

截至目前,包括快手、快手极速版、360手机助手、华为、小米等已纷纷接入了“APP签名服务系统”。

只要软件的APP签名能经受住考验,就证明这款APP是可靠的。换句话说,APP签名服务系统解决了APP的签名问题,让正版APP获得一份难以被伪造的数字证书。

想要获得这张证书并不容易,因此山寨APP入门门槛自然被拔高了。

在App Store中,决定一款软件能否被下载,则是由苹果一个叫做App Review的团队决定。

泛滥的山寨APP,仍在换皮重生

最初,这个审核团队只有三名审核员,负责审查全部的应用。但要知道的是,App Store在2008年刚推出时,仅仅只有500款应用。

2019年左右,据知情人士透露,苹果应用审查团队增加到了300多人。而这时,苹果应用数量已经增长到200多万。

对于坚持人工审核的App Store来说,这是一项耗时的工程,几百人的审核团队处理着成千上万的可疑软件,审核资源仍会显得十分紧张。

据CNBC报道,苹果每个审查人员每天需要完成50到100款应用软件审核,每款应用软件的审查时间一般只有几分钟。

在苹果App Store上架或更新应用,有40%被拒绝的概率。但如果遇上像素级模仿正版的盗版软件,再加上审核人员审核每款软件的时间有限,还是让很多山寨软件成了漏网之鱼。

王源告诉盒饭财经,中国网民基数大,APP数量范畴庞杂,加之网民防范意识不强,这些都是山寨软件在治理中会遇到的困难。更重要的是,APP开发成本低、变化快,很多底层技术是开源的。即使被下架,很快就可以“另起炉灶”。

想要真正扮演好山寨软件“守门人”的角色,应用商店还需要解决更多的挑战。

参考资料:

1.三易生活:《山寨APP这个难题,现在有了新的解决方案》

2.《人民日报》:《互联网上开放才能摆脱“山寨血统” 》

3. ifanr:《苹果这个神秘团队,掌握着 App Store 200 万款应用的「生杀大权」》

4. 纵融新媒体传播:《这些app竟山寨“拼多多”,拼团模式已经被玩坏了》

5.新浪科技:《苹果:App Store去年下架160万个“风险”App 阻止欺诈交易近15亿美元》

6.站长之家:《细数山寨App的三宗罪:插广告、偷流量、还骗钱》

7.新浪数码:《应用开发者吐槽苹果App Store:山寨应用仍不断出现》

8.成都商报:《调研报告:平均每个APP有92.7个盗版》

9.第一财经日报:《苹果商店暗藏山寨App》

转自:

我是中部省会公务员,找到了合规的增收办法【原创】

最近看到征集令(见文末),我也来分享一下自己花钱赚钱的故事。
01
个人基本情况
95年1月生,男,2017年6月某不知名大学本科毕业,生命科学类冷门专业,截止2022年9月未婚育。
毕业当年参考招考,成为中部某省会城市(“新一线”城市、疫情最初席卷之地,这么一说大多数人应该猜到了)基层街道搬砖民工。
先后从事纪检监察、党建、扶贫、组织、综合管理、文字材料等工作。
历经五年的摸爬滚打,目前在区级某群团组织工作,同时在职提升学历(法学)。
02
收入情况
年收入12w左右(实际到手),一般分为每月工资到账4200元左右,年终“五奖”6.7w,有个单项奖励3000元。
公积金单边约扣1400。
工资到手后,房贷扣掉3000,车贷2700(7月已经还清)。
暂时住在单位宿舍,无需缴纳水电、物业费、停车费。
车油费1000元(出门办事都开自己的车),基本属于硬性支出。
一人吃饱,全家不饿。
单位管饭,伙食支出基本上是聚餐花销,每月花费不等。
车贷没还完的时候,基本上每年需要家人支援,还完车贷后,自己负担房贷和日常花销。
每月偶有不够的时候,刷信用卡度日、下个月再还。
2022年开始工资改革,月到手8800元,年底据说有3w奖金,还不知道发不发。
家庭负担方面,父母都是“70”后,刚满50岁,身体还健康。
在农村老家,无养老金,老两口自己搞点小生意,年收入15w左右,时不时支援我。
单位全年工会福利1700元超市券+扶贫券300元+蛋糕券300元+米、油、鸡蛋等物资,我一般带回家。
总体看来,能维持日常生活,但个人幸福感不高。
03
工作节奏
目前主要从事文字材料和共青团改革的一些协调工作。
面对的主要是电脑和材料,和其他人打交道不多(正好个人性格偏内向,也不喜欢应酬接待)。
偶有延迟下班,加班不多。
按照疫情常态化防控的要求,会不定期下沉社区,搞清洁家园、门岗值守、核酸检测秩序维护等工作。
节假日有时候需要值班。
领导比较年轻,相对开明很多,只要把工作干好,其他的一般不管,也不需要去接待啥的。
个人感觉还是比较喜欢这种状态的。
每天晚上7点以后基本上是自己的时间,或者湖边散散步、在家里写文章之类的。
偶有觉得疲惫和压抑,但基本上尚可。
04
改变现状和开源的多种探索
就像某著名电影台词所说“这世界上只有一种病,就是穷病”。
说一千道一万,终归还是钱的问题。
很多人说,要提高收入,还是要换一份高工资的工作。
但我不敢,也不会这么贸然去做。
从农村一路读书走出来,与大自然抗争赢口粮、火车硬座近30个小时奔赴千里之外求学、蜗居城市一隅的穷日子历历在目。
我太明白一份稳定工作的不易,所以我倍加珍惜现今的生活。
曾尝试着记账削减开支,无奈未能坚持下去,“节流”对于我而言难以实施。
当然,我一般也不出去逛街、唱歌、打牌之类的,娱乐消费性支出不多,主要还是吃饭和超市花钱。
我的观点一直是:只要不违法违纪,就一猛子去想办法搞钱,比如开滴滴、快递分拣、写文章等等都可以。
目前我的思路是立足本职工作,在不违法犯罪、不违规违纪的前提下,利用自己的优势“开源”——写文章。
咨询过地方组织和纪检部门的同事,写文章拿稿费这种方式比较靠谱,不涉及违规违纪的问题。
2021年,利用业余时间写的文章,主要是评论、散文、约稿一类,稿费1w左右,略微改善了生活。
2022年开始,时间更为充足,写作热情也大为高涨。
 
前8个月的时间,在多家报纸、杂志、网站已经发表了40多万字的时评、散文等等。
已经发到手的稿费1.7w左右,各家报社发稿费的时间不固定,还有一部分没发,预计全年下来能拿到4w左右。
自己也很诧异,几百块几百块地攒着,竟然有这么多。
引用一句话:人生不如意十有八九,与人言之不过二三。不开心的事情也有,不足为他人道也。
在挣稿费改善生活的同时,写作也是我喜欢的方式,我有了充足的时间用在我喜欢的事情上。
每个月只要自己努力一点,投稿勤快点,一个月1500的稿费不成问题,甚至偶有月份攒下3000+,可以慢慢攒着留作结婚用。
用写文章调剂业余生活,我是甘之如饴的。
最近也在准备出一本书,用于申请加入省作家协会,目前是地方作协的会员。
以后的话,在做好本职工作的同时,我争取挪出更多的时间深耕文字水平。
计划朝着中短篇小说努力,说不定有这天赋,向“秦时明月”学习。
作者:匿名。
在《江西日报》、《浙江日报》、《改革与党风》、宣讲家网、四川新闻网等众多媒体发表文章,言论以社会、政治、时事评论为主,常为主流媒体引用。
转自:https://mp.weixin.qq.com/s/VSNEre0TCs04nWwLGGhmPw

中文正在被谋杀

不信人间尽耳聋。

作者:摩登中产
来源:摩登中产(ID:modernstory)
 

怒发冲冠,临表涕零。

01

不久前,脱口秀大会第五季上,零零后小姑娘拉宏桑,四灯全亮,顺利晋级。

 

她表演中用了大量网络词汇,比如“我真的会谢”、“栓Q”,谤誉加身,一路冲上热搜。

 

评委中,李诞也亮灯支持。几年前,他还公开说“网络词汇全是垃圾,劝你们不要用这些词”。察言观色者从不会逆势而行。

 

大潮已势不可挡。加油是“奥利给”,失败是“芭比Q”,表示无奈是“咱就是说一整个大无语”,最后万物都可绝绝子。

 

姐妹要叫集美,小狗要叫修勾,发言开篇常是“我真的会谢”,结尾往往是“小丑竟是我自己”。

 

喧嚣的一天,从微博上的姐妹调侃开篇,由直播间的虎狼之词收尾。弹幕、评论和推送中,网络词汇无孔不入。

 

有些表达已经沉降固化。小学生作文中已经出现“扎心了”、“干饭人”、“时间过得好快鸭!”。考卷为舔字组词,有学生组了舔狗。

 

异化的词汇尚可望文生义,字母组合则恍如天书,yygq还能拼出阴阳怪气,yjgj则雾水满头。去年参加活动时,甄子丹一本正经问yyds是什么,是以一打十么?

 

中年人感慨着物是语非,新生代欢呼着网络盛宴,而更年轻一辈,生在茧房之中,恐怕以为中文生即如此,浑不知如果倒溯语言长河,他们错过了怎样的绝美壮阔。

 

古人的中文之旅,大多从私塾启程,私塾第一课便是对联。

 

幼童的中文审美从“天对地,雨对风”开始,品味了秋月与晚霞,触碰了意蕴和气象,从而奠定中文的根基。

 

那些出口成章的少年,常享超人一等的礼遇。

 

骆宾王讨伐武则天,怒斥“一抔之土未干,六尺之孤何托”,武则天听后反而惜才,称人才流落草野是“宰相之过”。

 

和他齐名的王勃,去滕王阁时不过布衣少年,但行文惊得都督慌张离座,孤鹜落霞,秋水长天。

 

到了李白,更可遭金龟换酒,唤力士脱靴,几句诗就能让整个大唐如痴似醉。

 

那是传承千年的中文审美,言辞即学识,出口即文化。

 

柳永的最高赞誉是“有水井处皆有柳词”,秦观女婿被狗咬仍不忘高呼“我乃山抹微云秦学士之女婿也”,没几个人能说出苏轼官职,但大多会念“但恐琼楼玉宇,高处不胜寒”。

 

唐寅不过一介潦倒书生,所有不过草庵桃花,但因满口锦绣,足以倜傥五百年。

 

高中课文中,贾政考究贾宝玉学识,让他给大观园拟联,其中有一联写道“幽窗棋罢指犹凉”,当年不觉怎样,多年后,越想越觉凉字之妙。

 

这便是中文独有之魅,它能惊风雨泣鬼神,能观沧海越星汉,能念天地之悠悠,独沧然而涕下。

 

倘若熟读经史,它能让红脸汉子,抱拳说:某誓与兄患难与共,终身相伴,生死相随,有渝此言,天人共戮!

 

倘若不会,便只能在旁憨憨说道:俺也一样!

02

传承千年的中文审美,沉淀出底蕴深厚的中文环境,文化得以滋养其中。

 

民国乱世,战火狼烟,山河动荡叠加着文言文白话文更迭,但即便如此,中文也未失传承。

 

民国幼童,从《三字经》一路读到《幼学琼林》《古文观止》,最后再学着读报上新文章。

 

翻看民国报纸,平民征婚启事写道“望之若庄严,亲之甚和蔼”,结婚证书上印着“看此日桃花灼灼,宜室宜家”,即便求人代写书信,也不忘加上“天涯咫尺,海天在望,不尽依依”。

 

保存香火的西南联大,无论文理都视国文为第一学科,国文不及格不可毕业。

 

最受欢迎的中文课,是罗庸讲杜甫诗。他上课不带片纸,所有诗词和历代注解,都能随手写在黑板上。

 

罗庸口才极佳,出口成章,一度受邀到昆明广播讲解中文。他说不带片纸,其实是因藏书轰炸被毁,但“诗书绝,犹有舌”。

 

同校的朱自清则说,乱世更应“弦诵未绝”,我们所说的话,传承着中华。

 

那年,外来文化和流行文化同样冲击着中文,但在中文环境中,它们别有表达。

 

西南联大设在昆明后,戏院老板请吴宓教授翻译好莱坞片名,他信手译出《魂断蓝桥》、《出水芙蓉》和《翠堤春晓》。

 

多年之后,影迷仍在感叹,“翠堤春晓,这么美的名字怎么想出来的?”

 

江山平复后,中文之美绵延更长。在香港,黄霑以歌词名震香江,获评四大才子,最是不拘小节。

 

然而流出的手稿可见,他的行文极为严谨,有多轮涂抹痕迹,几乎每个字词都反复斟酌。

 

刘德华刚开始写歌时,黄霑毫不留情,“歌词写得文理不通,又臭又烂,这么笨还当作词人?”

 

和他同列四大才子的金庸,对遣词用句更为谨慎,他的书稿几经修订,并在修订版自序中称“几乎每个句子都曾改过”。

 

他的小说和黄霑的歌流入内地,几代人从此知道“浪奔浪流,万里江水滔滔永不休”,“秋风清、秋月明,落叶聚还散,寒鸦栖复惊”。

 

1995年,语言学家郝铭鉴创办期刊《咬文嚼字》,创刊词说:刊物虽小,但语文规范化,兹事体大。

 

多年后,他受访说:“一个现代人,他的修养表现在非常优雅地运用我们的母语正确地表达自己的感情。”

 

2011年,《咬文嚼字》批评故宫送锦旗,将“撼祖国强盛”中的“捍”写成了“撼”。

 

2012年,《咬文嚼字》批郭敬明对文字缺乏敬畏,其博客错字连篇,小说用典混乱,却流传甚广。

 

当然,《咬文嚼字》也没放过韩寒,称韩寒堪勘不分,劝他“传统的语文教育毕竟蕴含不少养分,聪明的韩寒还须补一补语文课”。

 

那年,传承与坚守还在,杂志上引用着余光中的句子:

 

只要仓颉的灵感不灭,美丽的中文不老,那磁石一般的向心力当必然长在。

03

2010年,央视贺炜解说世界杯英德大战,散场时,他即兴说:

“我们想想吧,此时此刻,在柏林,在慕尼黑,在汉堡,在科隆大教堂,肯定有无数德国球迷为之欢欣鼓舞。而在伦敦,在利物浦,在曼彻斯特,在泰晤士河边的小酒馆,肯定也有无数英格兰球迷为之黯然神伤。在生命如此有意义的一个时间节点,我们大家一起来经历,共同分享,这是我的幸福,也是大家的幸福。”

 

他因此被赞为解说席上的吟游诗人,倾慕者众多。

2018年,韩国平昌冬奥会,央视解说再展语言之魅,点评羽生结弦时,主播陈滢化用《洛神赋》:容颜如玉,身姿如松,翩若惊鸿,婉若游龙。

 

然而,三年后,谷爱凌夺冠,全网已满是“谷爱凌yyds”。

 

不止谷爱凌,在此之前,杨倩夺得东京奥运会首金,全网惊呼yyds。全红婵一场决赛跳出三个满分,全网依旧yyds。

 

一切改变源自中文环境的垮塌。曾经,公众接触的中文信息,大多经过字斟句酌,报亭里最不畅销的报纸,也有审校环节,任何一本小说,都要经历出版社三审三校。

 

王蒙说,即便成名之后,人民文学出版社审校他的小说,仍“极其仔细,不厌其烦,细得有时我都受不了”。

 

网络小说兴起后,纸质小说风光不再,上海作家陈村说:

“按照传统出版的要求,10000字里不应该出现2个以上错别字,但是以这个标准来衡量网络文学,基本上全部都是假冒伪劣产品。”

 

而随着新媒体登场,报纸谢幕,中文环境进一步恶化。大量自媒体并无审校环节,反而加入追逐流量的狂欢。

挖掘机要叫“呕泥酱”,消防员要叫“蓝朋友”,连新版《天龙八部》官博,宣传文案都在用“U1S1”“美滴狠”,网友吐槽:剧组是玩儿快手的吧?

 

短视频浪潮完成对中文环境的最后一击。大批走红主播,既无口才,也无学识,精致言辞也不符合粉丝群体。网络梗更直接,还能掩去尴尬。

 

yyds出自英雄联盟直播,绝绝子出自女团选秀,奥利给出自快手热搜,芭比Q出自吃鸡游戏中被烧后的自嘲解说。

 

粗鄙的闭环至此完成。新生代主播掌控话语权,网络词汇成为流行潮,平台用算法追逐,循环扩散。

 

那些词汇,最终织成巨大的文字茧房,生生灭灭均在其中。中文正在被谋杀。

 

这是一场令人绝望的罪案。挣扎者们唯一能做的,不过是闭门读书,尽量洗涤污染。

不求腹有诗书气自华,但求能坚持中文最后的审美。

 

黄霑晚年时,找人刻了一印章,“不信人间尽耳聋”。

 

他已触碰到粗鄙的潮汐,但他信中文有最后的倔强。

 

转自:https://mp.weixin.qq.com/s/m7x7oC4qDieO2ZwY548abA

羊了个羊,通关秘籍

最近火遍朋友圈的一款游戏“羊了个羊”,相信大家都被虐过吧!

明明那么“难”的游戏,怎么朋友圈一堆人在晒通关成果呢?

本篇文章来介绍“通关” 的黑科技,让每个人都有机会秀一把。

# 1. 羊了个羊

本来在一个平淡的夜晚,困了。找个小游戏玩一玩提提神,“羊了个羊”?看着还行,玩一玩第一关,这么简单,都给我整困了,一会能睡个好觉了,第二关,哎,这游戏有点意思哈。。。

凌晨三点了。。。

哎呀,来劲了,来劲了,从来没有第二关给我卡的死死的游戏。。。我就不信了

。。。。

我待羊羊如初恋,而它虐我千百遍。。。

第二天到公司顶着重重的黑眼圈拖着沉重的身体,和同样重重的黑眼圈的同事相遇,相视一笑。我问:你也是羊?同事:什么阳,我可没阳,我绿码!我是加班通宵上线,现在要回家。

好吧!苦逼的娃。。。

到了办公室本着死道友不死贫道的精神,为了广大同事的睡眠质量,安利了这个简单好玩(丧心病狂)的小游戏,增进同事之前的友情,第二天接到了以下反馈:

羊了个羊,通关秘籍

第二天上班被同事集体声讨,胁迫,追打,按在地上死死摩擦(我这是何苦的自作孽)。在我们“心平气和的探讨”后,我们“打”成了协议:由我帮他们通过这个好玩(BT)的游戏。

我坐在工位苦思冥想,实验了几次以请假为由回家而被同事堵门口而失败的方案后,又开始苦思冥想的想解决方案。终于,在我薅光了我工位上的小绿植之前,脑子 灵光一闪。常规的路走不下去,我为什么不学魔法那!!!所谓道高一尺魔高一丈。我玩不过你我还不能修改你的接口吗?!

常言道:黑猫白猫,抓住老鼠都是好猫!

是时候祭出我的大杀器了,技术人员的不二神器:Charles!!!

什么你问我何为Charles?Charles,旅游必备良药!!!杀人放。。呸,抓包必备神器!!!修改弱网无所不能!

# 2. 环境准备

Charles 是在 PC 端常用的网络封包截取工具,详细介绍感兴趣的同学可自行搜索,我要抓紧时间破解,完成同事们的心愿!下班前救回自己的狗命!

羊了个羊,通关秘籍

Charles官网下载安装包,下载成功后根据指示安装即可

官网地址:www.charlesproxy.com

(ps:破解方案本期就先不介绍了)

 2.1 连接手机

1、配置http代理

羊了个羊,通关秘籍
羊了个羊,通关秘籍

2、手机上连接代理

在手机WiFi中配置手动代理,输入安装Charles的电脑的网络地址,端口填8888。(注意:手机WiFi要和电脑同一个哦)

 2.2 观察接口

万事俱备,只欠东风。让我们瞅瞅这个Charles抓了个啥出来。

羊了个羊,通关秘籍

啥?!!这怎么是https的,都是乱码啊?

莫慌,天将降大任于斯人也,必先。。。百度

其实是因为缺少SSL代理的原因哈,我们继续操作,打开电脑上Charles

 2.3 配置SSL代理

首先在charles的 Proxy选项选择SSL Proxy Settings

羊了个羊,通关秘籍

然后在弹出的对话框中点击add,添加需要监视的域名。域名支持 *号通配符,如:抓取所有的https请求,可以填写 *:443

 2.4 手机安装证书

以IOS为例,在Safri上打开Charles的根证书下载网址:chls.pro/ssl 。

接下来,在设置->通用->VPN与设备管理 选择刚才的证书进行安装。

然后,在设置->通用->关于本机->证书信任设置 (这一步很重要) 刚刚安装的证书的开关打开信任就可以抓取加密包了。

欧克!让我们再来看一看抓到了什么东西!

羊了个羊,通关秘籍

look,我们看到了什么,这不是通关的接口吗?让我们直接选中接口然后点击右键

羊了个羊,通关秘籍

让我们来具体分析一下这个接口,距离成功已经仅剩一小步了。激动的手忍不住颤抖,晚上终于不用挨揍了。。😭

!@#!@¥#%  分析中。。。。

这个接口是get请求,那它的参数都暴露出来了啊,让我们看看他的请求路径:

https://cat-match.easygame2021.com/sheep/v1/game/game_over?rank_score=1&rank_state=2&rank_time=25&rank_role=1&skin=1

emm 。。。我觉得晚上好好吃一顿吧,能抗揍!

开个玩笑,这些参数看着就rank_state这个比较靠谱那我们修改一下它的值,别人都是1,凭什么你是2!!!

调用一下,等下等下,header里面的差点忘了,让我看看,哦吼,发现了什么

羊了个羊,通关秘籍

t和content-type,这次让我们再来调用一下!哦吼!成功了!让我们来看看小程序的通关记录

羊了个羊,通关秘籍

欧凯!通关了!通关了!敲锣打鼓告知同事们!晚上不用挨揍了。。

结果。。。你皮肤那?为啥没有?搞不出来皮肤照样揍你!。。。

等等。。。我这个皮肤为啥没有搞出来?难道是我少调用了接口?刚才太着急了?让我们再次分析分析。这个接口通关后就没有调其他接口了啊?

# 3. 黑科技:Map Local

经过反反复复的查看,没找到皮肤的接口,古人云,世上无难事只怕肯放弃。来吧,我抗揍。大义凌然的去挨揍的路上突然想到为啥不能走正常流程修改接口返回值那?再让我们分析分析。。。

羊了个羊,通关秘籍

每次进游戏的时候总是调用了2次接口,让我看看看它的返回值。

羊了个羊,通关秘籍

嗯~ 这个就是地图文件了,那么80001里面的返回这么少,90016的返回这么多,盲猜一下,这个就是第一关和第二关的地图文件了吧。让我们开启海克斯黑科技。替换接口返回值!!!

Charles修改返回值有多种方法,今天我们先介绍第一种方法:

1、 map Local         将匹配的url映射到本地文件。这个需要首先将url右键,save Response,将原有报文保存到本地,然后修改接口映射到该文件即可。也可以自己创建文件映射

羊了个羊,通关秘籍

选中最后一行 Map Local,然后选中80001的接口返回值

羊了个羊,通关秘籍

欧克 ,让我们再来一次。

我们重新发起游戏,因为修改接口后再次调用接口页面才会重新渲染,再来一次,欧凯!第二个变得像第一关一样easy啊!!!皮肤触手可得啊!!!朋友们!晚上不用挨揍了啊!!!

羊了个羊,通关秘籍
羊了个羊,通关秘籍

就当我想再次兴高采烈的奔向我可爱(暴力)的同事们时,我冷静了下来,毕竟以我这么严谨的性格,肯定还要再多检查几遍的。绝不是因为怕挨揍。然后我们简单测试看一下,纳尼?我不就是把小程序删除重新进,我的皮肤为啥子没了?难道?它的资源都缓存在客户端!oh no!我说为啥没看到请求的接口资源那!

时间紧迫让我们再来一次之前的操作,重新加入羊群,当上CEO,重振羊风!!

现实再次当头一棒,加入羊村后当天就不能再次加入了啊?天要亡我?距离下班还有1小时?我抬头看了看时间,稳住,不能慌,大不了就是挨一顿打。

几分钟后。。

咋办?咋办?要挨揍吗?一点思索一边狂点游戏入口,哎~?为啥没有调接口那?我有个大胆的猜测?莫非!为了减少后端交互?所以在客户端做了限制?本着大胆猜想,小心求证的想法,我修改了本地时间!!!哈哈哈,果然,天才的点子得到了验证,居然绕过了倒计时的限制,可以重新进入。

经过我多次重复操作后,终于,我得到了已下的皮肤。。。

羊了个羊,通关秘籍

老泪纵横,终于不用挨揍了。。。

学好数理化。走遍天下都不怕。

所以,我为什么要推荐他们玩这个游戏那。。。。。

羊了个羊,通关秘籍

转自:https://mp.weixin.qq.com/s/G1r49RJutfSQCg2wnO222A

程序员用12小时复刻《羊了个羊》,代码已开源!

来源 | CSDN(ID:CSDNnews)
作者 | 开发游戏的老王
责编 | 张红月
 
【CSDN 编者按】过去一周,不少人被《羊了个羊》这款游戏虐的不轻,有多少个“再玩一把”的念头,就有多少次被打入深渊的凄凉,甚至还有人评价道:“什么事都可以过去,除了《羊了个羊》第二关”。因此,有用户抱怨是“程序员故意挖坑制作死关卡”。然而在本文作者老王一探究竟以后,才发现并非程序员挖坑,而是该游戏的本身,就有很多天然的坑”。
昨天有朋友和我说:“最近有个叫《羊了个羊》的游戏爆火,就是太难玩了,你能复刻一个不?”话说上次玩休闲游戏还是在几年前,但是朋友之托必须赴汤蹈火啊,二话不说,开整!然而,冲动是魔鬼,直到此时此刻,老王也没能亲手玩一局原版游戏,不知道是游戏入口设计得太隐蔽还是网络加载太慢,无论手机端还是PC端,游戏都停留在如下界面。
所以本次游戏的复刻,完全是基于各视频网站云观摩的结果,好在游戏的玩法不是特别难理解。复刻使用的开发工具是Godot Engine(使用其它工具开发原理也是相似的),目前项目已经开源到了GitCode:Godot版《羊了个羊https://gitcode.net/hello_tute/SheepASheep
接下来我将通过临摹游戏的方式推测一下这个小游戏的实现原理,本文主要面向对游戏开发有兴趣的朋友,欢迎大家多提宝贵意见。
程序员用12小时复刻《羊了个羊》,代码已开源!

先说说玩法

第一眼看到《羊了个羊》,老王首先想到当年的《连连看》,不过有网友爆料,该游戏“借鉴”了《3tiles》。瞄了眼3tiles,是比较相似。说心里话,这个游戏的玩法并没有什么过于出众的地方,算是个中规中矩的“低卡路里”休闲游戏。
之所以成为话题作品,主要就是因为它的第2关极其低的通关率,一下子激起了众多玩家的挑战欲望。而时至今日这个“低通关率”也被网络上的众多玩家揭秘,第2关其实大概率上本身就是个死局。是程序员故意挖坑设了死局么?先卖个关子,我们先聊聊游戏的开发,然后您自己就会有答案了。
程序员用12小时复刻《羊了个羊》,代码已开源!

实现概要

游戏的整体很简单,但其中有几个实现的重点需要注意:
  • 牌堆数据结构的实现
  • 如何检测和更新可拾取的牌
先做个小定义,一个牌堆中可被拾取的牌以下将简称其为:“窗口牌”。

牌堆的结构及其数据结构

最初,我还真被这复杂的牌堆结构蒙住了,但仔细研究一番发现,无论多么复杂的牌堆,其实都是由如下三种牌堆模式组合拼凑而成的。
  • 蓝圈圈出的牌堆模式A:上面1张牌只挡住下面1张牌;同时下面的牌仅被上面1张牌挡住。只要上面的1张牌被取走,下面的牌就成为窗口牌;
  • 红圈圈出的牌堆模式C:上面1张牌可以挡住下面4张牌;同时下面的牌可能被上面4张牌挡住,一张牌只有它上面的4张牌都被取走,它自己才成为窗口牌。
虽然上图中体现不是很明显,但不难猜想出,第三种牌堆模式B 的存在,那就是:
  • 上面1张牌可以挡住下面2张牌;同时下面的牌可能被上面2张牌挡住,一张牌只有它上面的2张牌都被取走,它自己才成为窗口牌。
对于牌堆模式A,有些朋友会迫不及待地用“队列”或“栈”实现它,这样做有两个缺点:
  • 逻辑上牌堆模式A的窗口牌也可能是2维的,如果用队列实现就限制了它的灵活性;
  • 牌堆模式B和C都不好用队列实现,所以想追求数据结构的统一,还要另求他法。
实际上无论牌堆模式A、B还是C,都不过是3维数组结构,上图中模式A看起来特殊,无非是它的x,y维度都为1罢了。而三种牌堆的区别也无非就是当一张窗口牌被取走,检查牌堆是否出现新的窗口牌的方法罢了。
牌堆模式A
程序员用12小时复刻《羊了个羊》,代码已开源!
牌堆模式B
程序员用12小时复刻《羊了个羊》,代码已开源!
牌堆模式C
程序员用12小时复刻《羊了个羊》,代码已开源!
牌堆的数据结构
我将其定义为MContainerBase基类
#MContainerBaseextends Node2Dclass_name MContainerBase
func _ready(): add_to_group(name) add_to_group("game") var Mask = FileReader.read(mask_file,null) box.resize(size_x) for i in range(size_x): box[i] = [] box[i].resize(size_y) for j in range(size_y): box[i][j] = [] box[i][j].resize(size_z) for k in range(size_z): if Mask == null or Mask[i][j] == 1: box[i][j][k] = add_tile(i,j,k,get_parent().distribute_face()) else: box[i][j][k] = null for x in range(size_x): for y in range(size_y): for z in range(size_z): check_is_on_top(x,y,z)
最基础的牌堆就是一个 x*y*z的三维数组,我们可以使用一切方法构造想要的排队形状:柱形、条形、甚至金字塔形。这都不会影响后面程序的实现。
项目中为了增加这个“大方块”的多样性,我还给它设置了如下的“遮罩”,这就是游戏中CSDN文字的由来。当然我们还可以通过“遮罩”来自由定义窗口牌,这部分就请大家自由发挥了。
# S形遮罩[ [0,0,0,0,0], [0,0,0,0,0], [1,1,1,0,1], [1,0,1,0,1], [1,0,1,1,1],]
程序员用12小时复刻《羊了个羊》,代码已开源!

如何检测和更新可拾取的牌

三种牌堆模式分别派生自MContainerBase,并对应着如下三种检测方式:
牌堆模式A
仅检测自己正上方是否有牌
#1 Cover 1extends MContainerBase
func check_is_on_top(x,y,z): if has_tile(x,y,z): if not has_tile(x,y,z + 1) : (box[x][y][z] as MTile).set_is_on_top(true)
牌堆模式B
检测自己上方两方位是否有牌
#1 Cover 2extends MContainerBase
func check_is_on_top(x,y,z): if has_tile(x,y,z): if z%2 == 0: if not has_tile(x,y,z + 1) and not has_tile(x - 1 ,y,z + 1): (box[x][y][z] as MTile).set_is_on_top(true) else: if not has_tile(x,y,z + 1) and not has_tile(x + 1 ,y,z + 1): (box[x][y][z] as MTile).set_is_on_top(true)
牌堆模式C
检测自己上方四方位是否有牌
#1 Cover 4extends MContainerBase
func check_is_on_top(x,y,z): if has_tile(x,y,z): if z%2 == 0: if not has_tile(x,y,z + 1) and not has_tile(x - 1 ,y,z + 1) and not has_tile(x,y - 1 ,z + 1) and not has_tile(x - 1,y - 1,z + 1): (box[x][y][z] as MTile).set_is_on_top(true) else: if not has_tile(x,y,z + 1) and not has_tile(x + 1 ,y,z + 1) and not has_tile(x,y + 1 ,z + 1) and not has_tile(x + 1,y + 1,z + 1): (box[x][y][z] as MTile).set_is_on_top(true)
在Godot中,这三种牌堆模式还可以通过场景节点制作成预制体,这样关卡设计师就可以轻松地制作出美观的关卡了。
程序员用12小时复刻《羊了个羊》,代码已开源!
程序员用12小时复刻《羊了个羊》,代码已开源!
程序员用12小时复刻《羊了个羊》,代码已开源!

如何生成新关卡

简单了解游戏规则后,我们就不难推导出,每个关卡能被通过的一个必要条件就是每一种图案的总数,必须能被3整除。实现方法如下:
var tiles = []export var initial_tiles = { 0:10, 1:10, 2:10, 3:10, 4:10, 5:10, 6:10, 7:10, 8:10, 9:10, 10:10, 11:10, 12:10, 13:10, 14:10, 15:10}
func _init(): for key in initial_tiles: var num = initial_tiles[key]*3 for i in range(0,num): tiles.append(key) tiles.shuffle()
其中字典initial_tiles 的key对应着每一种图案,后面的value对应着这一关该图案出现的“对数”(此处1对等于3个)。按照value乘以3的数量存入数组tiles(下文称之为:待发牌池),然后把待发牌池中的元素打乱顺序,等待“发牌”。

关于游戏中的坑

很多朋友抱怨:“程序员故意挖坑制作死关卡”。其实不然,他无须故意挖坑,因为这个游戏本身就有很多“天然的坑”,如果不使劲填坑,它们自然而然就属于你了。而这里就隐藏了几个可致命的坑:乍一看,待发牌池中所有的图案都可以被3整除那么一定可以通关?那可不一定:
  • 只有桌面牌堆中牌的数量和待发牌池牌数一致,所有的牌才能“落地”,而游戏中桌面牌堆到底有多少(层)本身就是个迷。并且如果没猜错的话,在每一局设计者先要确保牌堆形状好看,然后再使堆牌数和待发池的牌数一致。二者哪怕差1个,也会造成死局。
  • 上文说了,桌面牌数和待发牌池的牌数一致只是过关的必要而非充分条件。即使该条件满足,如果相对于牌桌上的牌数以及图案数量,窗口牌数太少,也会造成死局。比如下面这个极端的例子:假设游戏共有 15种花色,而牌桌上只有这个模式A牌堆,它有90张牌。那么玩家只要在连续7次拾牌时没有遇到3个相同图案的牌,就“必死无疑”了。
程序员用12小时复刻《羊了个羊》,代码已开源!
其实这个游戏,一方面要控制关卡的难度,另一方面又要保证能通关本身就是一个相当困难的问题(至少老王没有想出办法)。而设计者反其道而行之,(可能)没有花力气去设计算法,把坑留给玩家,得到了极低的通关率,反而制造了话题并形成爆款。如此说来,这确实是个抖机灵的“设计”。但老王认为这种“设计”在游戏策划中是不宜被借鉴的,就像现在市面上泛滥的悬疑剧,开始埋坑无数,吊足观众胃口,最后烂尾不了了之一样,长此以往观众(玩家)对于悬疑剧(游戏)的信任感就被消费殆尽了。

洗牌道具的实现

洗牌的实现原理很简单,把当前桌面的牌记录在一个数组tiles中,当需要洗牌时,先打乱一下数组中牌的顺序,然后让桌面上每一张牌到tiles中重新取一个值。再来个眼花缭乱点的动画,还真挺像那么回事儿。
程序员用12小时复刻《羊了个羊》,代码已开源!
func shuffle_tiles(): tiles.shuffle() tiles_index = -1 func redistribute_face() -> int: tiles_index += 1 return tiles[tiles_index]

遮罩文件的读取

这里要夸一下Godot Engine,它的很多功能真是方便,比如下面这个str2var它可以简单粗暴地直接把字符串转换成对象类型。
class_name FileReader
static func read(path,default_data): var data = default_data var file = File.new() file.open(path,File.READ) var content :String = file.get_as_text() if not content.empty(): data = str2var(content) file.close() return data

对象间的通信

这个小游戏中存在大量的对象间的通信需求:牌和牌之间、牌和牌堆之间、牌和关卡之间、牌堆和关卡之间。为了快速实现游戏,我大量使用了Godot Engine的Group机制,不得不说Group是Godot Engine最赞的设计之一。
程序员用12小时复刻《羊了个羊》,代码已开源!
程序员用12小时复刻《羊了个羊》,代码已开源!
程序员用12小时复刻《羊了个羊》,代码已开源!

总结

小游戏《羊了个羊》,从策划和开发的角度来看并不困难,然而“瑕疵”竟然能够成为“噱头”,也让人不得不感慨“游戏世界真的一切皆有可能啊”。
※本文内容来自授权转载,不代表TechWeb观点,转载请联系CSDN(ID:CSDNnews)
 
—【 THE END 】—
转自:https://mp.weixin.qq.com/s/ELyL8PsVxqFMnRgDbsUCcg