zoukankan      html  css  js  c++  java
  • Google Earth影像数据破解之旅

    “Zed, you are so excellent.”

          为什么要写这句英文?容我卖个关子稍后再解释。

          相信大多数人都体验过Google Earth(简称GE),我对GE最初的印象是在大学宿舍,当时Google刚刚推出GE时,舍友们喜欢在上面找自己的家,惊讶于它的精细程度,并担心是否对中国有一定的安全隐患。

          坦白说,当时我对GE上找家没一点兴趣,但不能否认写到这时,我停下笔,打开了GE,花了很长时间找到了我在成都和泰安的家。我想中国80后的一代对家的概念或多或少有一定的困扰吧。比如我,生在泰山脚下,十八岁那年离开故乡,在北京学习工作了九年,莫名其妙的在成都安家,掐指一算四年有余。这让我不禁纳闷,尽管国家的全部土地都归公民所有,貌似没有任何一寸土地属于我个人,何处是我的家?故土还是户口?如那久未谋面的故人还是隔窗对望的路人。好了,带上耳机听上一曲《鹿港小镇》,我们还是进入正题。

          GoogleEarth的影像确实可以说是全球最佳影像数据,数据完整,更新及时,无IP限制,最重要的一点,没有偏移。这么宝贵的影像数据能这么大方的开放给大家,Google自然对自己的加密算法自信慢慢。可惜,就算是巨人般的Google,也会在程序员面前露出破绽。好戏开始了。

          类似上一篇解析百词斩的过程,首先我们先要想办法能获取这些数据,然后才能解析它。Google的技术自然毋庸置疑,直接放弃人肉搜索,一点技术含量都没有。这里我用的是HttpDebugger软件,可以查看本地应用程序的请求。这里打开GE随意浏览,你就可以捕获到如下的请求队列:

    1

          数据请求的url终于得到了,如鱼在哽的感觉。这url到底是什么规范,行列号在哪里?flatfile又是什么东东?这些-i,-t,-q又是干什么用的?下面的数字685又是什么意思?光归纳问题就得花不少时间来消化,仿佛一拳被KO的节奏。

          我想这个时候,你应该和我一样,默默的把url下载下来,尝试看一下里面的内容,或许这是唯一能做的事情了吧。于是乎,我切切的,怯怯的下载下来,以16进制打开该文件,瞬间泪崩的既视感:

    2

          无从下手啊。明明是一部不错的岛国爱情动作片,非要全屏马赛克,急死宝宝了。于是我Google了很久,作为一名程序员,翻墙技术就不普及了。找了半天都没任何进展,真的是将近一整天没有一丝想法。不小心的找到一个俄文网站,里面提到了影像数据的解析算法,编码解析后,发现果然可以。这里要说明一下,应该是白俄罗斯的网站,顿时对战斗民族的破解技术有了新的认识。

          总算有了一点头绪,原来该数据进行了一次加密,所以需要解密。密钥一共是1024个字节,如下的一串没道理的数字:

    3

          而这时候,你需要的是对下载下来的影像数据的所有字节依次解码,代码如下:


    8

          如上,解码的过程就是对读取的每一个字节和密钥做一次异或。解码后就可以得到原始的jpg影像。当然,如果你在GE中选择压缩,则获取的影像是DXT格式。但我个人测试发现,在我本机无论选不选压缩,都是jpg格式的,这个就不追究了。

    9

          影像的解析搞定后,这只是有了一点点曙光,离胜利还有很远。为什么这么说呢?第一Google提供历史影像,而url的规范又是如何,这段密钥是怎么获取到的,真的是才下眉头又上心头啊。

          比如这样一个url:https://khmdb.google.com/flatfile?db=tm&f1-02000123-i.19-f859f,我们怎么获取里面的信息,或者我想下载某一个瓦片,其对应的url又是如何?首先解释一下02000123这串数字的意思,截取Zed博客的图片,最直观明了:

    4


    5

    6

          原来这串数字就是一个四叉树的信息,依次递归可以找到对应的瓦片位置,每一位都是0~3之间的一个数字,代表在该级别下对应的四叉树的索引。对此我实现了如何根据这串数字获取对应的经纬度:

    7

          后面的f859f需要转为二进制,如下: fa99b == 11111010100110011011== 11111010100 | 11001 | 1011== 2004 | 25 | 11不难看出来,这表示该历史影像的拍摄日期。

          另外对应的-i.**对应的是其版本号信息。这个版本号又是如何获取?原来GE中每一个瓦片对应一个q2-xxx-q.yyy这样的qtree文件,里面会存储这些tile的时间和版本信息,包括历史数据等内容。

          这样就有了两个问题:第一,qtree文件也是有版本号的,这个是如何获取?第二,qtree文件该如何解析?

          原来在GE启动时,会更新一个dbRoot.v5文件,把该文件下载下来,16进制打开后你会发现,第七个字节和第八个字节分别是0XF4和0XBD,这时用0XBDF4和0x4200做一次异或,对应的结果就是qtree的版本号,这样你就可以请求每一个瓦片对应的qtree文件了。同时,上面所说的密钥,也保存在该文件中,而且从来都没有变过。       

          这趟GE数据解析之旅,和我平时的工作相关性不大,所以收获很多,大开眼界,偷窥了一点点GE这种级别的数据处理方式。当然,竟然有人能够破解这种复杂度的数据,我非常非常的钦佩。上面所说的所有内容,都是我在Zed的指点下了解的,或者简介通过他的博客。我并没有问他地形数据如何解析,因为我知道他基本不会告诉我,但他跟我说里面是三角形。

          当然,这里只是介绍了一个头,qtree文件如何解析?这个坦白说,我也只是一知半解,只是知道大概方法,但还没有彻底搞清楚。因为时间精力的原因,需要话一些时间,成本超过了我的兴趣程度,所以作罢。

          这些工作都是两年前做的,今天整理一下,也算对这个小小的遗憾做一次整理,和Zed聊了两三个小时,受益匪浅,于是也就有了文章开头的那句话。今后不再研究GE的数据解析部分了,毕竟术业有专攻。这部分我不专业,希望如果你知道的话,请悄悄的告诉我。      

         最后,作为一名GIS行业的码农,作为一名三维技术人员,我非常尊重Google Earth。

  • 相关阅读:
    read
    df,du,mount
    cat,tac,more
    Makefile内嵌函数
    PHP常量详解:define和const的区别
    微信小程序之this.setData
    二维码支付原理分析及安全性的探究
    php 原生文件下载
    php原生实现图片上传和查看
    php文件的处理和操作
  • 原文地址:https://www.cnblogs.com/fuckgiser/p/6424207.html
Copyright © 2011-2022 走看看