美文网首页Android开发Android开发经验谈程序员
Android笔记 (9): 反编译 - 代码注入

Android笔记 (9): 反编译 - 代码注入

作者: joyin5344 | 来源:发表于2016-07-04 23:40 被阅读614次

    关于反编译系列,其实网络上有很多总结的很好的,反编译一类的教程,我也仅仅是从别人的博客里面了解到部分粗浅的知识而已。个人感觉学习反编译最大的作用是去了解别人的实现过程,所以查看源代码是个人认为比较重要的,而代码注入这一部分就主要是为了玩儿了。
    这一篇我写不写压根不重要,网上总结的好的文章多得是,毕竟这是有攻击性的行为,所以我的目标只是记录一些自己接触过的点、修改apk的思路,以及修改一下前面的成果VolleyDemo.apk,所以比较简单。

    其实,真相是这样的:难的我并不会啊!!!哈~哈~哈!

    好了,进入正题。既然说到apk的反编译,自然就会联想到smali这个词,百度上也有很多相关知识,其实大家都知道还有一种方法也是学习smali很高效的途径:自己写一个简单的应用,可以只有一个Activity,只做简单的功能,然后反编译,对比源码来学习。

    基本语法我这里就不给大家解释了,现在先来回顾一下目前VolleyDemo的主要功能有哪些。

    原版VolleyDemo.apk主要功能

    • 进入应用后向ip.taobao.com发出请求,获取ip地址信息。

      ip参数为不合法的ip地址
    • 网络请求结果(原始数据),以log形式输出。

    D/demo    (16032): {"code":1,"data":"invaild ip."}
    
    • 解析结果,弹出Toast+Dialog。


      数据错误提示
    • 点击“我知道了”,验证HTTPS支持。


      HTTPS请求访问结果

    目标

    现在我们通过代码注入的方式来做以下事情:

    • 点击“我知道了”,不打开HTTPS页面,而是关闭当前Activity。
    • MessageDialog描述不准确,应改为“无效IP地址”。
    • 将IP改为合法地址。

    实现过程

    准备

    上一篇查看源代码中有提到:

    本章使用上一章节所搭建的环境和工具,同时也使用之前Volley系列的成果作为源文件。工具和源文件可到这里下载,同时也可参考上一章节进行环境配置。

    同理,这里我用的也是同样的环境和素材。

    注入

    • 点击“我知道了”事件
      首先,我们在不知道源代码的情况下以最简单的方式来解决问题。
      点击我知道了,看现象应该能猜出是跳转到下一个Activity,那么这个Activity叫什么名字呢?我们可以通过log查看:
      查看启动的Activity名称
      可以看到log输出为HttpsTestActivity,而且可以得到包名为com.joyin.volleydemo,同理,MainActivity的信息也一样可以获得。
      接下来查看代码中什么地方用到了HttpsTestActivity

      除了./activity/HttpsTestActivity.smali本身,就只有./activity/MainActivity$1.smali第52行用到了这个字段,我们跟进代码。

      发现52行所在的环境是一个onClick,我们删掉几行代码,再修改一点,代码没什么难度,懂一点smali的话很容易理解:
    # virtual methods
    .method public onClick(Landroid/view/View;)V
        .locals 4
        .param p1, "v"    # Landroid/view/View;
    
        .prologue
        .line 70
        iget-object v0, p0, Lcom/joyin/volleydemo/activity/MainActivity$1;->this$0:Lcom/joyin/volleydemo/activity/MainActivity;
    
        invoke-virtual {v0}, Lcom/joyin/volleydemo/activity/MainActivity;->finish()V
    
        .line 71
        return-void
    .end method
    

    此时代码已经修改好了,再次运行,弹出对话框后,点击“我知道了”就直接finish掉,大家可以自己实验一下。


    回编译过程
    • 修改MessageDialog描述
      这个需求比较简单,我们先找“获取请求失败了”这个关键字,然而你会发现,除了dex文件适配到了,其余地方都找不到,这是因为当初写代码的时候,这句话不是写在资源里的,而是直接放在java代码里,而smali中的是Unicode编码,所以要查找\u83b7\u53d6\u8bf7\u6c42\u5931\u8d25\u4e86
      找过去会发现MainActivity241行定义了该字符串:

      我们修改如下:
    const-string v3, "\u65e0\u6548\u0049\u0050\u5730\u5740"
    

    再次回编译,签名,安装:


    修改内容后的对话框
    • 将IP改为合法地址
      利用前面章节中的知识点,将手机和电脑连上同一wifi,保证在同一局域网内。手机设置代理,电脑打开charles进行抓包,发现ip字段传的参数是“2dss3”:
      抓包结果
      接下来我们以同样方法找到“2dss3”(MainActivity.smali第48行),修改为:
    const-string v1, "21.22.11.33"
    

    回编译-签名-安装:

    apktool b VolleyDemo/ && apksign VolleyDemo/dist/VolleyDemo.apk && adb install -r VolleyDemo/dist/VolleyDemo.apk_sign.apk
    
    运行结果

    至此,简单的代码注入已经完成。

    其他

    反编译系列的简单处理就写到这里了,我只记录了最简单的处理方式,但相信各位应该能很联想出怎么进行高难度的注入了,我就不点破了(我不会啊,哭)。基本技巧掌握了,改文字/图片/逻辑都可以实现。VolleyDemo没有做任何代码混淆,加密,安全验证等,仅仅是为了在这里更容易的反编译,在这里还是呼吁大家平时做项目一定要记得加固,基本的代码混淆,对dex做动态加载、验证等。相信大家都知道,我们可以使用一些免费的平台来完成这些事,省时省力,哈哈。

    另:反编译的技能最好用于学习,切勿用于恶意攻击。谢谢~~

    相关文章

      网友评论

        本文标题:Android笔记 (9): 反编译 - 代码注入

        本文链接:https://www.haomeiwen.com/subject/srzcjttx.html