前几天相信大家一定被谷歌的官方小程序「猜画小歌」刷爆了各大平台吧。在猜画小歌风靡全国的时候,不管是大V们还是吃瓜群众也都去筹热闹个个都变成了灵魂画手。
这一切也自然要归功于 Google AI 的神经网络驱动,大家在20秒内作画的寥寥几笔,其实背后已经被该网络源拿去对比自身超过5000万个手绘素描的数据群,并迅速猜出答案。
猜画小歌在互联网上几乎是病毒式的传播,以至于大家也在讨论谷歌是否要回归。当然谷歌是否近期要回归国内,我可以用 Craig Federighi 今年苹果发布会式的回答回答你们,"NO"!
也有人推测说猜画小歌的推出也只是为了让国内用户帮助谷歌训练 AI,其实我们这寥寥几笔跟谷歌自身已有的数据来说,真的算不上什么。何况各个神手没有误导 AI 已经很不错了。看这个小程序的官方介绍,旨在让用户了解和体验人工智能的乐趣或许这才是它的真正忠旨。
猜画小哥想说:我一不打广告,二不拉赞助,只是想安静地做个美男子,让你们体验一把人工智能的乐趣,哪来那么多的阴谋论。
欸,打住一下,你上面说的这些,好像我都听人说过了,能不能说点我不知道的?那行吧,看来同行们对此的报道力度真的很大,你们也知道得挺多的了,那我就再随便溜点大家没怎么报道过的消息。
其实看小程序背后,上线后很多页面如好友对战,打赏页面等不完整,而且还存在不少bug, 甚至刚上线不久就被别人反编译,发现函数命名什么的也是混乱,在正常项目里代码审核里根本无法通过。
甚至有消息称,被反编译的代码压根就是一个后端工程师一个人写前端代码写出来的,因为时间太赶,没法在意那么多细节。或许这也可以称为一个 side project。
一个程序发布后被反编译的情况数不胜数,更何况是谷歌官方小程序。而且负责这个项目的人知道有人会去反编译,可能因为时间紧迫,压根都没采取任何措施。
那么,我今天就来说说反编译是怎么一回事。事物都是相对的,有正必有反,我们要说反编译,自然要先了解什么是编译。
1.什么是编译?
举个栗子,各国人民之间交流有不同的语言,自然程序员跟计算机谈恋爱也需要用编程语言来与计算机交流。
如有的用世界上最好的语言 php 跟计算机交流的,也有闲人生苦短写 python 跟计算机唠嗑的,还有习惯性每次说话总是特别啰嗦庸长,用 Java blah blah 地跟计算机说个不停的。因此程序界跟现实生活一样也有不同的语言。
如果各国人民突然相聚在一起,交流出现问题,就需要翻译官的帮忙。而计算机也只懂得读0和1,所以不管程序员用什么语言,总需要将自己所写的代码翻译成0和1,好让计算机明白自己再说些什么。而让计算机明白自己写的语言的意思的过程,就是编译。如下图所示:
2. 什么是反编译?
故事继续,你给电脑写的情书「源代码」,你自然不愿意第三者看到。但这个世界上总有那么一群人爱窥探别人的隐私,于是乎他们发明了一种技术,除非你压根不跟电脑交流,不写任何代码,不然他们就有手段可以把你给电脑说的一切东西推测出来,这就叫做反编译。
像C跟C++这种比较接近系统底层的语言是直接被编译成一堆0和1,反编译C或者C++多数情况下也最多只是被反编译成汇编语言。而汇编语言本来就晦涩难懂,不然大家都抢着写汇编去了。C跟C++是硬茬不好惹,所以大家转向了更容易欺负的以java为首的一些代表。
Java推出时主打的口号是: code once, run everywhere.其原理无非也是把 Java 程序跑在虚拟机里。所以Java 编译的过程中并不是编译成机器语言,而是编译成.java 的文件,虚拟机能读懂这文件的意思,再跟计算机直接交流。所以有了.java 这个文件,反编译推出源码也显得相对容易。
微信的小程序无非也是个网页程序(in-app web),要想反编译小程序相对来说也更为简单。
3. 如何避免反编译
最常用的办法就是代码混淆,这样做其实只是让反编译后阅读源代码的难度增大。再举个栗子就是就是你把你写给电脑看到情书字写丑一点,别人反编译出来看到特别丑的字,就读着特别难受。
然后还有种办法就是加密数据,用加密算法加密程序配置文件也好,或者加密程序间传球的数据,亦或者用第三方软件加密软件使之更难破解,其最终目的就是让破解的人无法获得源代码。
就算你道高一尺获得了源代码,除了混淆代码,我还可以在软件中加入无效代码,或者混淆程序逻辑结构,让你就算得到了源代码,也读得你难受。
所以说,要想完完全全地防止软件被反编译不可能。这就好像春运抢票一样,就算政府管制力度再大,除非压根没人买票,不然总有一堆人在到处叫卖:票子要伐?
嗯,故事就说到这了,码字不容易,赶紧去画几幅画放松一下。
领取专属 10元无门槛券
私享最新 技术干货