逆向教程之-反编译apk暴力去除弹窗和更新提示(三)
本帖最后由 liuxiaoxin 于 2020-12-3 19:01 编辑授人以鱼,不如授人以渔!
本教程图文并茂,步骤非常详细,偏小白向,大佬请自觉屏蔽。
使用工具:MT管理器免费版
被修改的软件:Apktool M_v2.4.1
如果想跟着教程一起实操,感受一下反编译带来的乐趣,修改成功之后油然而生的成就感,可以下载本软件练练手,链接我放在文末了。
温馨提示:初次看本人教程的小伙伴,建议配合往期教程一起学习,奠定基础,操作起来效果会更佳。
往期图文逆向教程:
①逆向教程之-反编译apk修改菜单默认设置(一)
②逆向教程之-反编译apk完全精简删除菜单功能(二)
言归正传,接下来教程正式开始{:1_927:}{:1_927:}
当我们首次打开Apktool M后→会连续出现两个弹窗,首先项目邀请,这个弹窗点击取消了之后,以后都不会出现了。
但是这个新版本更新提示,虽然通过第1期的教程,通过反编译修改了默认的设置,不让它再自动检测更新。
但是只要一打开软件还是会强制推送更新提示。让人有点反感。接下来就通过反编译进行修改,暴力去除这两个弹窗,请记住“你好”和“新版本”这两个关键词。
1.使用MT管理器点击Apktool M_v2.4.1.apk文件→选择查看
2.选择resources.arsc文件→通过Arsc编辑器打开
3.点击搜索资源值→输入“你好”关键词→搜索类型选择字符串→点击确定进行搜索→出现了1个结果
→长按这个结果→会弹出菜单点击复制ID,这里复制的ID是“7F0701142”,然后返回
4.点击搜索资源值→输入“新版本”关键词→搜索类型选择字符串→点击确定进行搜索→出现了1个结果
→长按这个结果→会弹出菜单点击复制ID,这里复制的ID是“7F070127”,然后按两次返回
特别提醒:一定要记住复制的那两个ID值,后面会用到(如果你使用的输入法,没有开启剪切板功能,
默认使用的系统剪贴板的话,第2次复制的ID会覆盖第1次复制的ID,需要自行记住了。)
5.选择classes.dex文件→通过Dex编辑器++打开
6.点击搜索→发起新搜索→查找内容输入ID“7F070142”→路径默认→搜索类型选择“代码”→勾选搜索子目录→点击确定进行搜索
7.会看到出现了2个搜索结果→先选择第1个点击进入→会自动定位到第585行→然后全选它并删除掉→点击右上角保存→返回
8.接着选择第2个结果点击进入→会自动定位到第326行的ID
9.然后往上翻到第268行→往下滑到第366行→接着把268~366行的代码全部选中并删除→删除完然后在第268行添加“return-void”代码
(“return-void”这段代码的意思是返回一个空值,就等于是什么都不返回),修改好后点击右上角保存→返回
10.点击发起新搜索→查找内容输入ID“7F070127”→路径默认→搜索类型选择“代码”→勾选搜索子目录→点击确定进行搜索
11.会看到出现了2个搜索结果→先选择第1个点击进入→会自动定位到第447行→然后全选它并删除掉→点击右上角保存→返回
12.接着选择第2个结果点击进入→会自动定位到第607行的ID
13.然后往上翻到第521行→往下滑到第695行→接着把521~695行的代码全部选中并删除→删除完然后在第521行添加“return-void”代码
(“return-void”这段代码的意思是返回一个空值,就等于是什么都不返回),修改好后点击右上角保存
14.然后一路返回,会出现几个弹窗提示→点击保存并退出→勾选自动签名并选择确定→等待它自动回编译完成即可。
反编译完成之后,卸载原安装包,重新安装修改过的包,然后再打开软件,瞬间会发现变得清静了。
在软件的首界面,无论停留多久,再也不会出现“项目邀请”和“新版本更新提示”的这两个弹窗了。
因为就是通过上述的教程,对dex文件进行了修改,把弹窗时需要调用的全部代码都彻底删除了,
然后又添加了一个“return-void”代码,让它返回一个空值。所以这时候,软件打开后,这个空值代码,
就起到作用了,既然是空值代码,那就是意味着什么都没有,所以在软件里面的弹窗就不存在了,就彻底被去除了。
写到这里教程就结束了,其实这篇教程的目的,只是为了记录一下自己反编译的一个过程。分享给大家,提供的只是一个反编译的思路。
声明一下:本篇教程只是以“项目邀请”和“新版本更新提示”的这两个弹窗为例,实现暴力去除弹窗提示的目标,
并不是说只能去除这两个弹窗,而是提供的一个思路。可以按照这个反编译的思路,暴力去除软件中的各种弹窗,
包括但不限于广告弹窗、提醒弹窗、更新提示弹窗等等,只要是你觉得扰人的弹窗,都可以按照本教程的暴力去除法,对它进行处理。
当然,反编译不仅仅于此,聪明的你可以根据本教程,举一反三,对apk进行更深层次的修改!
如果本篇教程中有什么错误、不足、需要指正的、或者遗漏的地方,热烈欢迎大家,在评论区留言,看到后都会及时的去纠正和补充!
另外说明一下,本系列的教程,到这一期就截止进入尾声了。毕竟这一系列的教程,
以Apktool M_2.4.1这个软件为例,通过这几期的教程,对它进行了一个全面的反编译,
已经没有需要修改的地方了,所以只能告一段落了。如果大家有什么好的提议,还需要哪方面的反编译教程,请多多在评论区留言。
接下来上干货了,为了满足部分伙伴的需求,方便他们按照教程实操时,省得还要到处去找使用工具。
在这里为大家一并提供了教程中使用的同款,MT管理器和修改的软件素材,请外链自取。
MT管理器:https://www.lanzoui.com/i80NBitkr6f 密码:99gn
Apktool M_2.4.1:https://www.lanzoui.com/ixv2ris6pah 密码:4yvk
如果本教程能帮到您,记得三连哦!顺便免费评分走一波,感谢支持!{:1_927:}{:1_927:} 您的支持,将是对我最大的鼓励!{:1_887:}后续会继续分享更多逆向反编译教程,咱们后回有期!{:1_911:}
ustbsgw 发表于 2021-2-8 16:30
感谢楼主分享!
纯小白,在思考一个问题,为啥直接把定义弹窗方法的开始和结束语法也一起删了呢?这样就 ...
我没学过安卓开发,也没有系统的学过smali的语法。但是学过一点linux命令和js脚本语言,对定义函数和调用函数有一些理解。根据我现在的理解,本教程中smali语法的弹窗方法的开始和结束语法这中间的代码块,其实只是定义的一个函数体。这个定义的函数体,应该是在开始处有调用它的函数。
当调用函数时,会执行定义的函数体。这时如果函数体内的代码错误或者是代码被删了导致不全,都会报错。
同理,如果直接把定义弹窗方法的开始和结束语法也一起删了,就会报错。导致软件自动闪退。但加个 return-viod 代码是为了让它返回一个空值,这样就不会出现弹窗,不会报错,导致软件闪退了。 本帖最后由 liuxiaoxin 于 2021-7-26 19:30 编辑
我爱林 发表于 2021-7-26 10:45
感谢啦大神!已经很好啦!真真心万分感谢!
好的:victory: 能帮到你就好{:1_927:} 我爱林 发表于 2021-7-25 14:05
万感激大神相助啦!,我刚才给您私信发的那个链接的软件,真心特别感谢大神!
AirDroid_3.2.3.0去除升级弹窗提示版下载链接:
https://xiaoxin.lanzoui.com/inhuJruv5be
去除升级弹窗提示之后,导致点击右上角三个点的检查更新会闪退。本来想修改一下XML文件精简一下无用菜单,把检查更新的功能菜单去掉,但是免费版的MT管理器修改XML文件超200行就无法修改保存,没办法了 我爱林 发表于 2021-7-25 08:09
感谢大神啦,教程这得超详细,
我按照教程的方法改了我手机里的一个软件,
搜到三个带有升级的弹窗文件, ...
窗口还在?那应该是弹窗的相关代码没删掉,可能是弹窗的代码和那些显示的文字、按钮不在同一个代码块里面,弹窗的代码应该是在别的地方单独调用的,一般的弹窗代码都是"show()",你可以在那个文件里面单独搜索看看能不能找到 solsun 发表于 2020-12-1 09:09
为什么安卓没有IOS越狱的FLEX这样的软件,真心好用
老兄,论坛章伯写的Web Data Monitor ,吾爱消息提醒那个,能发送一个给我吗?大神好像最近不在线,私信也没有回复。谢谢 地蛋 发表于 2020-12-9 08:48
老兄,论坛章伯写的Web Data Monitor ,吾爱消息提醒那个,能发送一个给我吗?大神好像最近不在线,私信 ...
我给删了:eee liuxiaoxin 发表于 2020-12-3 11:54
按照教程的暴力去除法,应该可以去除
你好,附件是整段代码。
每次保存的时候都提示我错误。
.method protected onCreateDialog(I)Landroid/app/Dialog;
.registers 9
const/4 v2, 0x0
sparse-switch p1, :sswitch_data_100
invoke-super {p0, p1}, Lcom/niugubao/simustock/MyBaseActivity;->onCreateDialog(I)Landroid/app/Dialog;
move-result-object v0
:goto_8
return-object v0
:sswitch_9
invoke-static {p0}, Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater;
move-result-object v0
const v1, 0x7f030003
const/4 v3, 0x0
invoke-virtual {v0, v1, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
move-result-object v3
const v0, 0x7f080012
invoke-virtual {v3, v0}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/TextView;
const v1, 0x7f080013
invoke-virtual {v3, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v1
check-cast v1, Landroid/widget/TextView;
:try_start_27
invoke-virtual {p0}, Lcom/niugubao/simustock/HomePageActivity;->getPackageManager()Landroid/content/pm/PackageManager;
move-result-object v4
invoke-virtual {p0}, Lcom/niugubao/simustock/HomePageActivity;->getPackageName()Ljava/lang/String;
move-result-object v5
const/4 v6, 0x0
invoke-virtual {v4, v5, v6}, Landroid/content/pm/PackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
move-result-object v4
iget-object v4, v4, Landroid/content/pm/PackageInfo;->versionName:Ljava/lang/String;
new-instance v5, Ljava/lang/StringBuilder;
const-string v6, "本地版本号:"
invoke-direct {v5, v6}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v5, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v4
const-string v5, ",最新版本号:"
invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v4
iget-object v5, p0, Lcom/niugubao/simustock/HomePageActivity;->m:Ljava/lang/String;
invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v4
invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v4
invoke-virtual {v0, v4}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
:try_end_54
.catch Landroid/content/pm/PackageManager$NameNotFoundException; {:try_start_27 .. :try_end_54} :catch_fc
:goto_54
new-instance v4, Ljava/lang/StringBuffer;
invoke-direct {v4}, Ljava/lang/StringBuffer;-><init>()V
iget-object v0, p0, Lcom/niugubao/simustock/HomePageActivity;->o:Ljava/util/List;
if-eqz v0, :cond_78
iget-object v0, p0, Lcom/niugubao/simustock/HomePageActivity;->o:Ljava/util/List;
invoke-interface {v0}, Ljava/util/List;->isEmpty()Z
move-result v0
if-nez v0, :cond_78
:goto_65
iget-object v0, p0, Lcom/niugubao/simustock/HomePageActivity;->o:Ljava/util/List;
invoke-interface {v0}, Ljava/util/List;->size()I
move-result v0
if-lt v2, v0, :cond_a3
invoke-virtual {v4}, Ljava/lang/StringBuffer;->toString()Ljava/lang/String;
move-result-object v0
invoke-static {v0}, Landroid/text/Html;->fromHtml(Ljava/lang/String;)Landroid/text/Spanned;
move-result-object v0
invoke-virtual {v1, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
:cond_78
new-instance v0, Landroid/app/AlertDialog$Builder;
invoke-direct {v0, p0}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V
const-string v1, "软件更新"
invoke-virtual {v0, v1}, Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;
move-result-object v0
invoke-virtual {v0, v3}, Landroid/app/AlertDialog$Builder;->setView(Landroid/view/View;)Landroid/app/AlertDialog$Builder;
move-result-object v0
const-string v1, "更新"
new-instance v2, Lcom/niugubao/simustock/v;
invoke-direct {v2, p0}, Lcom/niugubao/simustock/v;-><init>(Lcom/niugubao/simustock/HomePageActivity;)V
invoke-virtual {v0, v1, v2}, Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
move-result-object v0
const-string v1, "取消"
new-instance v2, Lcom/niugubao/simustock/w;
invoke-direct {v2, p0}, Lcom/niugubao/simustock/w;-><init>(Lcom/niugubao/simustock/HomePageActivity;)V
invoke-virtual {v0, v1, v2}, Landroid/app/AlertDialog$Builder;->setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
move-result-object v0
invoke-virtual {v0}, Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;
move-result-object v0
goto/16 :goto_8
:cond_a3
new-instance v0, Ljava/lang/StringBuilder;
add-int/lit8 v5, v2, 0x1
invoke-static {v5}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v5
invoke-direct {v0, v5}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
const-string v5, " "
invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-virtual {v4, v0}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
iget-object v0, p0, Lcom/niugubao/simustock/HomePageActivity;->o:Ljava/util/List;
invoke-interface {v0, v2}, Ljava/util/List;->get(I)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/String;
invoke-virtual {v4, v0}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
const-string v0, "<br/>"
invoke-virtual {v4, v0}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
add-int/lit8 v0, v2, 0x1
move v2, v0
goto :goto_65
:sswitch_cf
new-instance v0, Landroid/app/AlertDialog$Builder;
invoke-direct {v0, p0}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V
const-string v1, "退出"
invoke-virtual {v0, v1}, Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;
move-result-object v0
const-string v1, "您确认退出牛股宝模拟炒股吗?"
invoke-virtual {v0, v1}, Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;
move-result-object v0
const-string v1, "是"
new-instance v2, Lcom/niugubao/simustock/x;
invoke-direct {v2, p0}, Lcom/niugubao/simustock/x;-><init>(Lcom/niugubao/simustock/HomePageActivity;)V
invoke-virtual {v0, v1, v2}, Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
move-result-object v0
const-string v1, "否"
new-instance v2, Lcom/niugubao/simustock/y;
invoke-direct {v2, p0}, Lcom/niugubao/simustock/y;-><init>(Lcom/niugubao/simustock/HomePageActivity;)V
invoke-virtual {v0, v1, v2}, Landroid/app/AlertDialog$Builder;->setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
move-result-object v0
invoke-virtual {v0}, Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;
move-result-object v0
goto/16 :goto_8
:catch_fc
move-exception v0
goto/16 :goto_54
nop
:sswitch_data_100
.sparse-switch
0x1 -> :sswitch_9
0x1f41 -> :sswitch_cf
.end sparse-switch
.end method
.method public onKeyDown(ILandroid/view/KeyEvent;)Z
.registers 4
const/4 v0, 0x4
if-ne p1, v0, :cond_a
const/16 v0, 0x1f41
invoke-virtual {p0, v0}, Lcom/niugubao/simustock/HomePageActivity;->showDialog(I)V
const/4 v0, 0x1
:goto_9
return v0
:cond_a
invoke-super {p0, p1, p2}, Lcom/niugubao/simustock/MyBaseActivity;->onKeyDown(ILandroid/view/KeyEvent;)Z
move-result v0
goto :goto_9
.end method
.method protected onStart()V
.registers 1
invoke-static {p0}, Lcom/niugubao/h/e;->a(Landroid/app/Activity;)V
invoke-super {p0}, Lcom/niugubao/simustock/MyBaseActivity;->onStart()V
return-void
.end method 本帖最后由 liuxiaoxin 于 2020-11-30 09:46 编辑
自古沙发归楼主{:1_927:}{:1_927:} 学习来了,感谢大神{:1_921:} wanfon 发表于 2020-11-27 20:02
学习来了,感谢大神
太棒了{:1_921:} 为了学习,果然够积极{:1_927:} 学习这种爆破方法,感谢吾爱 这种方法是不是通用的呢 顶。收藏了 免费版本连xml都打开不了 还是用androidkiller 收费功能如果能快速处理加固还差不多 {:301_998:} 感谢分享 感谢分享