ChengXuYuan.com
程序员的职场第一站

如何做一个代码搬运工?

“天下文章一大抄,看你会抄不会抄”,不得不说这是一个互联网信息膨胀的时代,获取信息太容易了,各行各业都在抄,抄歌曲,抄游戏,甚至抄代码,有句话说的好——“我们不生产代码,我们只是代码的搬运工”。互联网上有大把的开源项目,只要肯搬砖,迟早垒成山。退一万步讲,即使不是开源项目,如果有遇到解决不了的问题,网上一搜,各种博客论坛也能搜到大量的代码片段,并且提供了方便的复制选项。

除了这些能搜到的,那些搜不到的——比如竞品的一些策略,功能忍不住想抄一下相关的代码怎么办呢?这时就需要借助一些逆向的手段,比如反编译。以我们常见的Android安装文件APK为例,其实一个APK文件就是一个简单的压缩文件,随便用一个解压软件就能解开,解开后有一个叫classes.dex的文件,源代码就藏在这里面。

Android程序是用JAVA编写的,所以只需要借助一些工具就能将dex文件还原成可以看到近乎源码的class文件了:

代码

你可能会觉得这也太简单了吧,那应用之间还有什么秘密可言呢?首先得承认,JAVA的反编译就是这么简单,不过它也不会束手就擒,如果你按照我说的去解开一个流行应用的APK安装包,你看到的可能是这个样子(一堆字母歌一样的东西):

代码搬运工

这是最常见的反制手段——代码混淆。混淆的是啥呢?就是各种文件的名字以及里面的函数名字。对于开发来讲,为了方便记忆和查找,起名的时候一般都是选择有代表意义的单词,而对于机器来说,开发起的这些名字毫无意义,它们和一些无意义的字母及组合a,b,c,ft,cM这种没有什么区别,所以替换掉原来有意义的命名对机器来说没啥特别的影响,但是对反编译出来研究的人来说可读性就很差了,而且用这些简短的字母组合来代替还能省出不少长名带来的空间占用,可谓是一箭双雕。所以打包发布前做一下混淆还是很有必要的。

但是,一般开发看反编译出来的代码都不会通篇阅读的,会寻找核心的部分去看,这就意味着阅读范围会小很多,况且可读性差不代表不能读懂,如果下些功夫,看个七七八八也不是问题,所以混淆还是不保险,它阻止不了那些狠下心把自己当机器的人。

主要问题出在反编译的工具能够轻易还原dex文件,为了阻止反编译,APK加固的技术应运而生。APK加固就是对dex文件做一些手脚,让反编译工具解析不了,那么反编译工具和加固技术就形成了攻防的对手了,既然是攻防,那两边作为工具都会不断的完善自己来应对彼此的变化,所以即使是加固,迟早有一天也会被升级过的反编译工具给攻破。

当然,不是所有语言都能反编译的,或者说不像反编译JAVA一样门槛这么低。最后,不得不说抄High了的我们已经逐渐失去了自己思考的技术,内容发布的平台一个接一个的冒出来,但是内容输出的人却远远跟不上了节奏了。

作者:果果

文章出处:给产品经理讲技术(订阅号ID:pm_teacher)

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址