Android逆向之路---改apk包名、达到多开效果
前言
最近在某乎上有人在问我如何将打好的包更改包名。了解我的同学大概都知道,我喜欢自己动手做实验,再将自己的方式分享给大家,这次我选择了一个阅读类型app,随机选的。先看效果
如何做到的呢,那就把我的思路分享给大家。
ps:侵删!仅供个人学习使用,不适宜商用。
准备工作
咪咕阅读v7.1.1app
apktool
一个编辑器,(我用vscode装了smali高亮插件)
思路
- 利用apktool拆包咪咕阅读
- 首先更改AndroidManifest.xml里面的包名
- 全局更改com.xxx.xxxx类似的包名
- 全局更改smali类型代码的包名字符串Lcom/xxx/xxxx
- 全局更改所有com/xxx/xxxx文件夹的名称,因为java文件里面要求包名和文件夹路径要对应
- 更改删除app原本的包名或签名校验相关smali代码
- apktool b打包apk
- jarsigner 签名 ,安装apk
开始逆向
拆包
apktool d com.ophone.reader.ui_7.1.1_129.apk
更改包名
在AndroidMaifest.xml里面我们发现他的包名是 com.ophone.reader.ui
我就把我的包名改成com.ophone.reader.ui01吧
将所有com.ophone.reader.ui替换成com.ophone.reader.ui01
更改smali的包名
将所有Lcom/ophone/reader/ui替换成
Lcom/ophone/reader/ui01
更改文件夹名称
更改所有com/ophone/reader/ui 的ui文件夹名为ui01
ps:其实以上三步可以写成程序吧,大体思路都是关于文件的读写,还有重命名等
开始打包
更改完了app的包名准备打包,
apktool b com.ophone.reader.ui_7.1.1_129
打好的包我的路径在
com.ophone.reader.ui_7.1.1_129/dist里面,
看到了我们逆向动了手脚的apk了
然后签名执行以下命令
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore "MartinHanKey.jks" -signedjar _signed.apk ".\com.ophone.reader.ui01_7.1.1_129.apk" "MartinHan"
以上命令我就不解释了,可以具体自己查询。
运行
开始运行了,发现有如下问题,如图
很明显啊,开发者加了签名校验,或者包名校验。
思路
后来我搜索了如下字符串“你安装版本xxxx”搜到了如下字符串
<string name="check_sign_notice">您安装的版本不是官方版,建议您访问wap.cmread.com官网下载安装(注意:安装新版本需卸载当前版本)</string>
跟着这个name=check_sign_notice在public.xml里面看到了这个
<public type="string" name="check_sign_notice" id="0x7f0701bf" />
由此可见,其实他的id就是7f0701bf。
继续全局搜索这个id我在WelcomePageActivity里面发现了如下代码,这段代码比较关键,需要我们细细研读。
#这里调用了setContentView方法invoke-virtual {p0, v0}, Lcom/cmread/bplusc/bookshelf/WelcomePageActivity;->setContentView(Landroid/view/View;)V#这里调用了com.cmread.bplusc.layout.as类的a方法,将结果传入v0,也就是根据这个#v0来判断下面的条件.line 171invoke-static {p0}, Lcom/cmread/bplusc/layout/as;->a(Landroid/content/Context;)Zmove-result v0#根据刚才的结果进行跳转if-nez v0, :cond_3#设置了WelcomePageActivity的E变量.line 172iput-boolean v4, p0, Lcom/cmread/bplusc/bookshelf/WelcomePageActivity;->E:Z#下面的就不具体解释了,其实就是创建了那个对话框.line 173iget-object v0, p0, Lcom/cmread/bplusc/bookshelf/WelcomePageActivity;->g:Landroid/content/Context;.line 175invoke-virtual {p0}, Lcom/cmread/bplusc/bookshelf/WelcomePageActivity;->getResources()Landroid/content/res/Resources;move-result-object v2#这就是那一段提示非官方版的文字const v3, 0x7f0701bfinvoke-virtual {v2, v3}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;move-result-object v2.line 176invoke-virtual {p0}, Lcom/cmread/bplusc/bookshelf/WelcomePageActivity;->getResources()Landroid/content/res/Resources;move-result-object v3const v4, 0x7f070278invoke-virtual {v3, v4}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;move-result-object v3.line 177invoke-virtual {p0}, Lcom/cmread/bplusc/bookshelf/WelcomePageActivity;->getResources()Landroid/content/res/Resources;move-result-object v4const v5, 0x7f070156invoke-virtual {v4, v5}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;move-result-object v4new-instance v5, Lcom/cmread/bplusc/bookshelf/hu;invoke-direct {v5, p0}, Lcom/cmread/bplusc/bookshelf/hu;-><init>(Lcom/cmread/bplusc/bookshelf/WelcomePageActivity;)Vnew-instance v6, Lcom/cmread/bplusc/bookshelf/hw;invoke-direct {v6, p0}, Lcom/cmread/bplusc/bookshelf/hw;-><init>(Lcom/cmread/bplusc/bookshelf/WelcomePageActivity;)Vnew-instance v7, Lcom/cmread/bplusc/bookshelf/hx;invoke-direct {v7, p0}, Lcom/cmread/bplusc/bookshelf/hx;-><init>(Lcom/cmread/bplusc/bookshelf/WelcomePageActivity;)V.line 173invoke-static/range {v0 .. v8}, Lcom/cmread/uilib/dialog/h;->a(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/cmread/uilib/dialog/CommonReaderDialog$a;Lcom/cmread/uilib/dialog/CommonReaderDialog$a;Lcom/cmread/uilib/dialog/CommonReaderDialog$b;Z)Lcom/cmread/uilib/dialog/CommonReaderDialog;goto/16 :goto_0..............................# goto_0具体位置代码如下,其实就是调用了父类的方法onKeyDown,然后就return了。.line 1071:cond_0:goto_0invoke-super {p0, p1, p2}, Lcom/cmread/uilib/activity/CMActivity;->onKeyDown(ILandroid/view/KeyEvent;)Zmove-result v0:goto_1return v0
到此为止,我们了解了以上的方法,就知道了,关键点就在于if-nez v0, :cond_3,
现在吧if-nez改成if-eqz,然后再次打包运行
如图:
写在结尾
一切都彻底搞定啦,打到了本文章开始的效果,咪咕阅读双开,更改了他的包名,而且还过了校验。
关于我
个人博客:MartinHan的小站
知乎:MartinHan01
Android逆向之路---改apk包名、达到多开效果相关推荐
- 获取安卓应用APK包名的方法
应用商店按照符合Android标准的原则进行设计,使用包名(Package Name)作为应用的唯一标识.即:包名必须唯一,一个包名代表一个应用,不允许两个应用使用同样的包名.包名主要用于系统识别应用 ...
- (转)[Android] 利用 ant 脚本修改项目包名
[Android] 利用 ant 脚本修改项目包名在开发android应用项目的时候,经常会有这样的需求,一个应用项目,要求 房价上半年下行 下半年或回暖 在不同的OEM下有不同的包名,不同的资源,不 ...
- Android文件夹路径/data/data/包名/
文件之获取文件夹路径/data/data/ 应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的. 大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存 ...
- android 漫画切换,Android逆向之路---让我们试试另一种方法看漫画-(2)
前言 上次我们分析到了快看漫画的协议部分,这次我们根据他的协议来手动写个脚本,然后执行以后,可以把他的漫画自动下载到电脑上面, 然后自动拼接图片,这样就可以实现在电脑上当成一个长图来看漫画了,没有广告 ...
- android 11兼容适配之根据包名查看是否安装第三方应用
android 11兼容适配之根据包名查看是否安装第三方应用 本文介绍android 11的兼容性适配之一的根据包名唤起第三方应用功能.包括但不限于(支付宝.微信.QQ.微博.百度地图.高德地图.腾讯 ...
- Android studio修改项目名称和包名
Android studio修改项目名称和包名 (android studio v2021) 如想要修必包的名称,包的名称是和项目中的文件夹一致的,所有一般会有空的目录(com.xxx.yyy.zzz ...
- Android逆向之路---脱壳360加固原理解析
前言 众所周知,上次说到了如何脱壳360加固,大致意思就是安装一个xposed插件,然后自动就会脱壳了,那么这个插件是如何工作的呢,本次重点说说这个. 上次说道了dumpDex脱壳360加固,其实先说 ...
- android adb apk包名,ADB命令简单使用--查看包名、activity等
1.连接设备 adb connect ip 2.查看连接的设备 adb devices 3.安装/卸载Android 应用 adb install packagesname adb uninstall ...
- Android之在linux终端执行shell脚本文件(通过aapt)得到apk包名
1.问题 我们在ubuntu上经常想看到apk的包名,然后在终端通过pidcat.py packageName 过滤日志,我们常用的办法手机连接电脑,然后打开这个app adb shell dumps ...
最新文章
- 软件工程第二周阅读作业
- Java知识系列 -- 反射
- dnslog 在 sql注入中的应用
- 代码对比与文件对比的一个简单方法
- MySQL之IFNULL()、ISNULL、NULLIF用法
- python的内存管理机制及调优手段_Python的内存管理机制及调优手段?
- python爬虫--爬取豆瓣top250电影名
- activemq spring 集成与测试
- Mac电脑C盘空间不足怎么办?
- bnuoj 29065 鸣人的查克拉
- 拓嘉辰丰电商:拼多多所属哪种电商模式
- 《基本控制结构》-小组作业 (1~10)
- 移动直播初露锋芒,能否成为社交的下一个风口?
- [GO项目]开源免费在线客服系统-真正免费开源-GOFLY0.3.2发布-极简强大Go语言开发网页客服...
- windows系统下redis安装以及设置redis开机自启动方法教程
- 学习Linux的第五课时
- 打灰太狼oc核心代码实现
- 电子电路2-CAD4-(4-35)
- java搭建直播平台_直播平台简单搭建笔记
- 国科大人工智能学院《计算机视觉》课 —ޮ典型视觉应用和系统