前言
开发项目中,经常会使用到地图,于是我会使用一些第三方的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.jar
和AMap_3DMap_V4.0.1_20160923
找到lib.jar
的eu.class
替换 到AMap_3DMap_V4.0.1_20160923
里的eu.class
大功告成~
测试
使用修改后的 SDK jar 包替换原来的 jar 包进行地图测试
测试成功,包名和签名可以随意换咯,再也不用麻烦的每次申请 key 啦!
最后
demo中定位也是破解后免key,下一篇会讲解如何定位免key