Android 破解高德地图 sdk 使用 map 免 key

3,235 阅读3分钟

前言

开发项目中,经常会使用到地图,于是我会使用一些第三方的sdk,但是基本上所有的sdk使用时都需要申请key,填包名和sha1值,使(Ji)用(Qi)方(Fan)便(Suo)。作为一个android攻城狮,简直不能忍啊,于是乎看了下源码,决定破解一下,演示使用的是高德地图,至于百度,呵呵,下面看我慢慢道来

所需工具

  • 高德地图sdk最新版AMap_3DMap_V4.0.1_20160923.jar
  • Android Studio
  • jd-gui

分析代码

在使用高德地图sdk的时候需要我们申请这个key,而这个key是需要我们提供包名和签名的sha1值生成的 因此 ,sdk在校验的时候肯定需要以下3个条件

戳我申请

那么我们如果找到高德地图sdk的入口了,申请了一个key,可不可以写死在代码里面呢?这样就可以免去每次申请的烦恼,那么我们来尝试一下

首先我们打开jd-gui,然后从把从官网下下来最新的jar包拖进去,来看下jar包的目录结构

我去,这么多,而且都是混淆过的,难道你要我一个个的找吗?No!这个当然是有技巧的。首先我们来思考一下

  • 为什么我们需要申请到的key

  • 申请key的时候,为什么还要输入包名和sha1值,我乱填不行吗

答案是 当然不行,当我们输入包名和sha1值提交的时候,其实在后台已经产生一条数据,标示着用这个sha1的签名生成出对应包名的app才可以使用。

既然高德要获取包名,那么我们平时是怎么样获取app的包名的呢?

PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 64);
String packageName=packageInfo.packageName;

那么我们不妨搜索一下packageName

按下快捷键ctrl+shift+s,打开搜索界面搜索 packageName

这只隐藏深处的小精灵被我抓到了 ,哈哈

ok,双击打开看下代码

关键的地方我已经框出来了,其意思 先判断全局变量e 有没有值,有值直接返回,没有就获取自身app的签名的sha1和包名,然后用:去连接,最后return e; ,ok,找到这个全局变量我们把这个变量写死

修改代码

使用 Android Studio 新建一个 Android Library 的 Module ,包名与 jar 包要修改的类包名相同,新建一个类,与要修改的类名相同

复制我们jd-gui中找到的class的内容到我们新建的类中,同时将 SDK 的 jar 包作为这个 Module 的依赖包,保证这个 Module 可以正常编译

我们修改变量e的值也就是 sha1:packageName,

观察这个类发现全是静态方法,由此可判断是工具类,所以key应该也会在这里面获取,我在继续查看下代码

这个就是获取我们在AndroidManifest填入的key,我们继续把这个变量写死,填入我们的key

sha1有了,key有了,我们在来修改下包名,我们继续找

我们继续修改b的值

ok,大功告成。我们来打包成jar包,那么Android Studio 如何打包 jar 呢?

我们在这个修改的用来修改的 Module 的 build.gradle 中添加以下代码

task makeJar(type: Copy) {
    delete 'build/libs/lib.jar'
    from('build/intermediates/bundles/release/')
    into('build/libs/')
    include('classes.jar')
    rename ('classes.jar', 'lib.jar')
}
makeJar.dependsOn(build)

在工程目录下执行

即可得到 jar 文件

用压缩软件打开lib.jarAMap_3DMap_V4.0.1_20160923

找到lib.jareu.class 替换 到AMap_3DMap_V4.0.1_20160923里的eu.class

大功告成~

测试

使用修改后的 SDK jar 包替换原来的 jar 包进行地图测试

测试成功,包名和签名可以随意换咯,再也不用麻烦的每次申请 key 啦!

最后

戳我传送GitHub

demo中定位也是破解后免key,下一篇会讲解如何定位免key