草庐IT

Android反编译:手把手教你制作高德地图车机共存版

WangJie0822 2023-03-28 原文
高德地图车机版

前言

去年年底提了新车,这车什么都好就是自带的高德地图版本太低了,在高德地图已经进入6.x的时代,车机上自带的才4.x,更重要的是不支持升级,从高德官网下载的车机版安装提示签名不同,覆盖安装又没有权限,就很难受,好在高德官方论坛里面有很多大佬都有提供共存版本,非常好用。

但是,作为一个Android开发人员,怎能如此没有追求,当然得自己造一个出来啊。

前期准备

首先需要感谢的是高德地图的APK没有进行加固,这大大减轻了我们反编译的工作量,为此我们需要以下工具:

  1. apktools.jar 用于对apk进行反编译及重新打包 官方地址

  2. dex2jar 用于将apk中的dex文件转换为可读的jar格式 下载地址

  3. jd-gui 用于查看反编译出来的源码信息的图像化工具 下载地址

由于部分网站可能被墙无法访问,可以选择从我打包好的云盘下载

当然,最后还不能忘了下载 高德地图车机版

最终环境结构如下:

文件结构

反编译流程

反编译获取有效信息

首先第一步就是通过 apktools.jar 工具对官方的apk进行解包;

# 通过 apktools.jar 进行解包
$ java -jar .\apktool_2.6.0.jar d .\AUTO_V6.1.0.600644_release_signed.apk

命令执行后会在当前路径生成一个 AUTO_V6.1.0.600644_release_signed 文件夹,这里面就是apk解包之后的内容,我们后续的修改也是基于这个文件夹

接着将 AUTO_V6.1.0.600644_release_signed.apk 当作压缩文件打开,将其中的 classes.dex 文件解压到当前路径,并通过 dex2jardex 文件转换为 jar 文件

# 将 dex 转换为 jar
$ .\dex2jar-2.0\d2j-dex2jar.bat .\classes.dex

命令执行后会在当前路径生成 classes-dex2jar.jar 文件

修改关键信息

修改包名

要做共存版,最重要的当然是修改应用包名了,打开 .\AUTO_V6.1.0.600644_release_signed\AndroidManifest.xml,第一行里面 package 属性就是包名,改为你自己的包名,注意不要和其它应用重复即可,我这边是在后面加上了.coexist修改为com.autonavi.amapauto.coexist

包名

修改其它配置

仅修改包名并没有结束,除此之外,我们还需要将 AndroidManifest.xml 文件中的所有涉及到权限及内容提供者的原 com.autonavi.amapauto 修改为 com.autonavi.amapauto.coexist

权限
内容提供者

生成APK

重新打包成apk

在对解包后的数据进行修改之后,我们可以再通过 apktools.jar 将文件夹重新打包为 apk

# 重新打包为apk
$ java -jar .\apktool_2.6.0.jar b .\AUTO_V6.1.0.600644_release_signed -o .\AUTO_V6.1.0.600644_coexist_unsigned.apk

执行后会在当前路径生成 AUTO_V6.1.0.600644_coexist_unsigned.apk,这个时候的apk是没有签名的,无法进行安装使用。

重新签名

对于没有签名的apk,可以通过jarsigner -verbose -keystore 【签名文件】-storepass 【签名密码】 -signedjar 【输出APK】 【未签名APK】 【签名别名】进行签名

# 重新签名
$ jarsigner -verbose -keystore .\wj_android.jks -storepass xxxxxx -signedjar .\AUTO_V6.1.0.600644_coexist_signed.apk .\AUTO_V6.1.0.600644_coexist_unsigned.apk xxxxxx

签名完成会在当前路径生成 AUTO_V6.1.0.600644_coexist_signed.apk,这个apk就可以直接进行安装使用了

绕过校验机制

在安装完上面的apk打开后,你会发现根本无法使用,会提示应用出现异常错误

高德地图异常

这个是高德地图启动的时候做了签名相关的校验,我们修改了包名及签名,所以无法通过校验

定位启动界面

定位启动界面其实很简单,还是打开之前的 AndroidManifest.xml 文件,在其中搜索 android.intent.category.LAUNCHER,其所在 Activity 就是启动界面

启动页

然后我们就可以按照这个包路径,在之前界面的文件夹里面找到对应的源文件了,解包出来的代码是smali格式的

SMALI文件

一个简单的类被拆成了这么多,并且对应smali代码我们也不熟悉,更重要的是smali中的中文都被编码了,排查起来更加困难,这个时候我们前面转换出来的 classes-dex2jar.jar 文件就派上了用场

定位校验逻辑

打开 jd-gui 并将classes-dex2jar.jar 拖拽到窗口里,我们很快找到启动 Activity 的代码

FILLACTIVITY

在这里我们可以直接搜索错误信息文本

错误信息

我们找到方法 g() 的调用地点

调用地点

根据上面的代码,我们能简单的推断,方法 i() 就是跳转进入导航界面

跳转地图

由此可知关键代码 p90.d(vd.w().e()) 如果返回为 false 则会直接打开地图,否则就会提示异常

校验代码

这里我们在回调解包出来的 smali 代码里,找到 p90 这个文件,找到 d(Context) 这个方法

关键方法

修改校验逻辑

smali 语法和 Java 还是有很大差别的,但是我们不需要精通,对应这个校验方法看上去很复杂,但是我们的需求只不过是让这个方法返回 true 即可,因此修改如下:

修改后方法

修改之后再按照上面 打包APK 的步骤重新打包就能正常使用了。

资源修改

如果你想要给APP修改为不同的名称,不同的图标甚至是替换内部的图片,这些就都很简单了,只需要找到对应的图片、文本资源,直接进行替换就可以了,不需要像修改包名那么复杂

最终效果

来看下安装的最终效果吧

最终效果

文章作者: WangJie0822
文章链接: http://www.wangjie0822.top/posts/5569bb54
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WangJie0822

有关Android反编译:手把手教你制作高德地图车机共存版的更多相关文章

  1. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  2. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  5. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

  6. ruby - 如何在ruby中制作动态多维数组? - 2

    我有一个关于多维数组的初学者ruby​​问题。我想按年份和月份对条目进行排序。所以我想创建一个包含年->月->月条目的多维数组所以数组应该是这样的:2009->08->Entry1->Entry209->Entry32007->10->Entry5现在我有:@years=[]@entries.eachdo|entry|timeobj=Time.parse(entry.created_at.to_s)year=timeobj.strftime("%Y").to_imonth=timeobj.strftime("%m").to_itmparr=[]tmparrentry}@years.pu

  7. ruby - 如何在不使用 HERE-DOCUMENT 语法的情况下在 Ruby 中制作多行字符串文字? - 2

    问题总结我想尝试使用Ruby来完成我在Python中所做的事情。在Python中它有r"""syntaxtosupportrawstrings,这很好,因为它允许将原始字符串与代码内联,并以更自然的方式连接它们,而无需特殊缩进。在Ruby中,当使用原始字符串时,必须使用其次是EOT在单独的行中,这会破坏代码布局。你可能会问,为什么不使用Ruby的%q{}?嗯,因为%q{}与Python的r"""相比有局限性因为它不会转义多个\\\并且只处理单个\.我正在动态生成Latex代码并写入一个文件,该文件稍后用pdflatex编译。Latex代码包含类似\\\的内容在许多地方。如果我使用Rub

  8. ruby - 如何制作 Ruby 1.8 小写非拉丁字符? - 2

    我正在使用Ruby1.8。似乎downcase不会改变非拉丁字符。例如:"Δ".downcase返回“Δ”我知道在Ruby1.9.1及更高版本中,我可以使用UnicodeUtils(fromhere)。我试过了,它工作正常。返回上一个示例的"δ"。是否有适用于1.8Ruby的等效(或任何)解决方案? 最佳答案 nash@nash:~$ruby-vruby1.8.7(2011-02-18patchlevel334)[i686-linux]gem安装unicode(https://rubygems.org/gems/unicode)re

  9. ruby - 如何使用 pager 制作 ruby​​ 命令行应用程序? - 2

    我正在使用Ruby制作一个命令行工具。它将在屏幕上打印大量文本。目前,我正在使用shell管道(may_app|more)来执行此操作。但我认为最好有一个默认的寻呼机。就像你在执行gitlog时看到的一样。可以使用git--nopagerlog禁用寻呼机。我已经完成了大量的谷歌工作并找到了一颗gem:hirb,但似乎有点矫枉过正。经过多次尝试,我目前正在使用shellwrapper来这样做:#!/bin/bash#xray.rbisthecorescript#doingthemainlogicandwill#outputmanyrowsoftexton#screenXRAY=$HOME

  10. ruby - 制作命令行程序 "full screen" - 2

    我想知道如何在shell中创建“全屏”窗口的外观,如在vim、emacs等中。是否可以在Ruby中以编程方式执行此操作?这对平台的依赖程度如何?编辑:我不是在寻找如何让我的shell进入全屏模式。我正在寻找一种方法来隐藏以前输入的命令并用应用程序“填充”shell屏幕。它适用于安装程序。 最佳答案 您可能正在寻找的是ncurses或S-Lang支持提供你的全TUI经验。Ruby的gem环境提供了几个可能值得探索的gem:$gemlist--remote|grep-icursescursesx(003)ffi-ncurses(0.4.

随机推荐