逆向教程之-反编译apk暴力去除弹窗和更新提示(三)

查看 111|回复 16
作者:liuxiaoxin   
授人以鱼,不如授人以渔!
本教程图文并茂,步骤非常详细,偏小白向,大佬请自觉屏蔽。
使用工具:MT管理器
[color=]免费版

被修改的软件:Apktool M_v2.4.1
如果想跟着教程一起实操,感受一下反编译带来的乐趣,修改成功之后油然而生的成就感,可以下载本软件练练手,链接我放在文末了。
温馨提示:初次看本人教程的小伙伴,建议配合往期教程一起学习,奠定基础,操作起来效果会更佳。
往期图文逆向教程:
①逆向教程之-反编译apk修改菜单默认设置(一)
②逆向教程之-反编译apk完全精简删除菜单功能(二)
言归正传,接下来教程正式开始
当我们首次打开Apktool M后→会连续出现两个弹窗,首先项目邀请,这个弹窗点击取消了之后,以后都不会出现了。
但是这个新版本更新提示,虽然通过第1期的教程,通过反编译修改了默认的设置,不让它再自动检测更新。
但是只要一打开软件还是会强制推送更新提示。让人有点反感。接下来就通过反编译进行修改,暴力去除这两个弹窗,请记住“
[color=]你好
”和“
[color=]新版本
”这两个关键词。



000.png (196.71 KB, 下载次数: 0)
下载附件
2020-11-27 19:29 上传

1.使用MT管理器点击Apktool M_v2.4.1.apk文件→选择查看


001.png (257.89 KB, 下载次数: 0)
下载附件
2020-11-27 19:29 上传

2.选择resources.arsc文件→通过Arsc编辑器打开


002.png (262.56 KB, 下载次数: 0)
下载附件
2020-11-27 19:29 上传

3.点击搜索资源值→输入“你好”关键词→搜索类型选择字符串→点击确定进行搜索→出现了1个结果
   →长按这个结果→会弹出菜单点击复制ID,这里复制的ID是“
[color=]7F0701142
”,然后返回



003.png (152.24 KB, 下载次数: 0)
下载附件
2020-11-27 19:29 上传

4.点击搜索资源值→输入“新版本”关键词→搜索类型选择字符串→点击确定进行搜索→出现了1个结果
   →长按这个结果→会弹出菜单点击复制ID,这里复制的ID是“
[color=]7F070127
”,然后按两次返回



004.png (144.38 KB, 下载次数: 0)
下载附件
2020-11-27 19:29 上传


[color=]特别提醒
:一定要记住复制的那两个ID值,后面会用到(如果你使用的输入法,没有开启剪切板功能,
                   默认使用的系统剪贴板的话,第2次复制的ID会覆盖第1次复制的ID,需要自行记住了。)

5.选择classes.dex文件→通过Dex编辑器++打开


005.png (256.89 KB, 下载次数: 0)
下载附件
2020-11-27 19:30 上传

6.点击搜索→发起新搜索→查找内容输入ID“7F070142”→路径默认→搜索类型选择“代码”→勾选搜索子目录→点击确定进行搜索


006.png (119.41 KB, 下载次数: 0)
下载附件
2020-11-27 19:30 上传

7.会看到出现了2个搜索结果→先选择第1个点击进入→会自动定位到第585行→然后全选它并删除掉→点击右上角保存→返回


007.png (329.17 KB, 下载次数: 0)
下载附件
2020-11-27 19:30 上传

8.接着选择第2个结果点击进入→会自动定位到第326行的ID


008.png (274.79 KB, 下载次数: 0)
下载附件
2020-11-27 19:30 上传

9.然后往上翻到第268行→往下滑到第366行→接着把268~366行的代码全部选中并删除→删除完然后在第268行添加“
[color=]return-void
”代码

  (“return-void”这段代码的意思是返回一个空值,就等于是什么都不返回),修改好后点击右上角保存→返回


009.png (534.81 KB, 下载次数: 1)
下载附件
2020-11-27 19:30 上传

10.点击发起新搜索→查找内容输入ID“7F070127”→路径默认→搜索类型选择“代码”→勾选搜索子目录→点击确定进行搜索


010.png (178.72 KB, 下载次数: 0)
下载附件
2020-11-27 19:30 上传

11.会看到出现了2个搜索结果→先选择第1个点击进入→会自动定位到第447行→然后全选它并删除掉→点击右上角保存→返回


011.png (461.37 KB, 下载次数: 0)
下载附件
2020-11-27 19:30 上传

12.接着选择第2个结果点击进入→会自动定位到第607行的ID


012.png (264.45 KB, 下载次数: 0)
下载附件
2020-11-27 19:30 上传

13.然后往上翻到第521行→往下滑到第695行→接着把521~695行的代码全部选中并删除→删除完然后在第521行添加“
[color=]return-void
”代码

    (“return-void”这段代码的意思是返回一个空值,就等于是什么都不返回),修改好后点击右上角保存


013.png (529.91 KB, 下载次数: 0)
下载附件
2020-11-27 19:30 上传

14.然后一路返回,会出现几个弹窗提示→点击保存并退出→勾选自动签名并选择确定→等待它自动回编译完成即可。


014.png (204.93 KB, 下载次数: 0)
下载附件
2020-11-27 19:30 上传

反编译完成之后,卸载原安装包,重新安装修改过的包,然后再打开软件,瞬间会发现变得清静了。
在软件的首界面,无论停留多久,再也不会出现“项目邀请”和“新版本更新提示”的这两个弹窗了。
因为就是通过上述的教程,对dex文件进行了修改,把弹窗时需要调用的全部代码都彻底删除了,
然后又添加了一个“return-void”代码,让它返回一个空值。所以这时候,软件打开后,这个空值代码,
就起到作用了,既然是空值代码,那就是意味着什么都没有,所以在软件里面的弹窗就不存在了,就彻底被去除了。



015.png (293.82 KB, 下载次数: 0)
下载附件
2020-11-27 19:59 上传

写到这里教程就结束了,其实这篇教程的目的,只是为了记录一下自己反编译的一个过程。分享给大家,提供的只是一个反编译的思路
声明一下:本篇教程只是以“项目邀请”和“新版本更新提示”的这两个弹窗为例,实现暴力去除弹窗提示的目标,
并不是说只能去除这两个弹窗,而是提供的一个思路。可以按照这个反编译的思路,暴力去除软件中的各种弹窗,
包括但不限于广告弹窗、提醒弹窗、更新提示弹窗等等,只要是你觉得扰人的弹窗,都可以按照本教程的暴力去除法,对它进行处理。
当然,反编译不仅仅于此,聪明的你可以根据本教程,举一反三,对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
如果本教程能帮到您,记得三连哦!顺便免费评分走一波,感谢支持! 您的支持,将是对我最大的鼓励!后续会继续分享更多逆向反编译教程,咱们后回有期!

下载次数, 教程

liuxiaoxin
OP
  


ustbsgw 发表于 2021-2-8 16:30
感谢楼主分享!
纯小白,在思考一个问题,为啥直接把定义弹窗方法的开始和结束语法也一起删了呢?这样就 ...

我没学过安卓开发,也没有系统的学过smali的语法。但是学过一点linux命令和js脚本语言,对定义函数和调用函数有一些理解。根据我现在的理解,本教程中smali语法的弹窗方法的开始和结束语法这中间的代码块,其实只是定义的一个函数体。这个定义的函数体,应该是在开始处有调用它的函数。
当调用函数时,会执行定义的函数体。这时如果函数体内的代码错误或者是代码被删了导致不全,都会报错。
同理,如果直接把定义弹窗方法的开始和结束语法也一起删了,就会报错。导致软件自动闪退。但加个 return-viod 代码是为了让它返回一个空值,这样就不会出现弹窗,不会报错,导致软件闪退了。
liuxiaoxin
OP
  


我爱林 发表于 2021-7-26 10:45
感谢啦大神!已经很好啦!真真心万分感谢!

好的 能帮到你就好
liuxiaoxin
OP
  


我爱林 发表于 2021-7-25 14:05
万感激大神相助啦!,我刚才给您私信发的那个链接的软件,真心特别感谢大神!

AirDroid_3.2.3.0去除升级弹窗提示版下载链接:
https://xiaoxin.lanzoui.com/inhuJruv5be
去除升级弹窗提示之后,导致点击右上角三个点的检查更新会闪退。本来想修改一下XML文件精简一下无用菜单,把检查更新的功能菜单去掉,但是免费版的MT管理器修改XML文件超200行就无法修改保存,没办法了
liuxiaoxin
OP
  


我爱林 发表于 2021-7-25 08:09
感谢大神啦,教程这得超详细,
我按照教程的方法改了我手机里的一个软件,
搜到三个带有升级的弹窗文件, ...

窗口还在?那应该是弹窗的相关代码没删掉,可能是弹窗的代码和那些显示的文字、按钮不在同一个代码块里面,弹窗的代码应该是在别的地方单独调用的,一般的弹窗代码都是"show()",你可以在那个文件里面单独搜索看看能不能找到
地蛋   


solsun 发表于 2020-12-1 09:09
为什么安卓没有IOS越狱的FLEX这样的软件,真心好用

老兄,论坛章伯写的Web Data Monitor ,吾爱消息提醒那个,能发送一个给我吗?大神好像最近不在线,私信也没有回复。谢谢
solsun   


地蛋 发表于 2020-12-9 08:48
老兄,论坛章伯写的Web Data Monitor ,吾爱消息提醒那个,能发送一个给我吗?大神好像最近不在线,私信 ...

我给删了
delsystem32   


liuxiaoxin 发表于 2020-12-3 11:54
按照教程的暴力去除法,应该可以去除

你好,附件是整段代码。
每次保存的时候都提示我错误。
[AppleScript] 纯文本查看 复制代码.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;->(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;->()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;->(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;->(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;->(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;->(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, "
"
    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;->(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;->(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;->(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
OP
  

自古
[color=]沙发

[color=]楼主
wanfon   

学习来了,感谢大神
您需要登录后才可以回帖 登录 | 立即注册