• android smali代码注入 实战一


          有同学在通服里面干活,最近一直忙着4g基站搭建的干活,测试设备(android)测量移动网络数据,没有自动保存记录的功能,只能手动记录各种测试参数,不知道测试软件供应商是怎样想的,竟然不提供的这样的功能! 要我帮忙把测试数据自动导入excel表格中,我硬着头皮去尝试下。网上有smali的语法和注入的介绍,但参考价值不大,分享下自己的smali注入的过程和心得(这里smali语法就不讲了)。

    案例

    1.需求

    需要提取数据界面如下:

    提取数据字段信息: 地点address 小区识别码 cellId,区位码aresId 信号强度rx

    2.确定应用数据中是否有需要的数据表,导出sqlite数据。

    1) 手机没有root权限,可以从smali 注入应用内部复制dada/data/xxxxx/的目录文件的功能代码。

    2)  手机有root权限,adb pull /data/data/inet.GDTEL.com/ e:不成功(没有权限),而adb shell中没有pull,cp指令,当然安装下 busybox  ,先cp到sdcard中去,在pull到      电脑上去,或者通过手机助手pull电脑中去。

         有相应的表对应需求数据实体,不必从界面提取,那可以从数据库拿数据,转化为excel文档;没有,则从界面上一个个提取数据,在转excel文档。

    3.打开需要提取的界面,确定界面所在的activity,方法:查看手机当前活动activity,adb指令

    adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'
    

    查询结果如下:

    从查询结果可以看出 这个界面所在项目进程:inet.GDTEL.com,所在activity:com.wellcell.inet.Cust.CustTestActivity

    4.apktool 反编译apk,确定所需数据的数据来源

      1)进入com.wellcell.inet.Cust.CustTestActivity,搜索onCreate ,setContentView,确定layout.xml

         比如:

      .line 100
       const v0, 0x7f03000f  //layoutId
    
      invoke-virtual {p0, v0}, Lcom/wellcell/inet/Cust/CustTestActivity;->setContentView(I)V
    

         根据layoutId,在R(不存在的话,把反编译的文件导入eclipse中,不管有没有错,运行这个工程之后就生成R类,根据这个R类,可能有问题,我测试了,没有问题)类中搜索          layouId对应的layout.xml。

      2)在eclipse中查看layout.xml界面,确定所需数据所在的控件的id name,再在R类中查询控件id的具体数值。

      3)在所在activity或者fragment中根据控件id确定控件的属性名称比如

        

      4)根据控件名称确定数据来源,搜索m_txLacGsm,setText

     

      可知cellId,lacId来自TelStrengthInfo实体,其他数据类推。

    5.注入代码

       1)注入代码实现:

             方法1:直接根据smali语法写注入的代码

             方法2:先按照注入的项目包名新建工程,根据注入的类名命名类,编写注入功能的模块代码,并测试,然后反编译apk,从smali文件的拷贝代码到注入点,再apktool打包即使对smali语法不行,也可以胜任.

       2)常见错误:

            1.类的包名不对 

               比如:包命名混乱的时候就容易犯错

               

      

            2.打包时,属性忘记申明定义

            3. .line 行数(方法调用在java文件所在行数) 有重复

            4.引用三方jar包或者添加新类,忘记拷贝到反编译项目中去。

            

    6.smali调试

       smali调试是个蛋疼的事,即使注入的代码出问题了也不出崩溃。

       调试方法:

       1)通过eclipse 调试smali。过程好像比较麻烦,尝试了下,会出现各种问题,jdk版本问题,远程jvm拒绝链接等,可能跟开发环境有关系。

       2)通过强大的adb 功能,解决运行时错误,常用的三种方法,VFY的信息会给出Smali代码出错的文件、函数以及错误原因,dalvikvm的信息可以给出调用栈,以及上下文执行过  程。

    adb logcat > e:log.txt | grep inet.GOTEL.com
    adb logcat > e:log.txt | grep dalvikvm
    adb logcat > e:log.txt | grep VFY

    比如使用 adb logcat > e:log.txt | grep inet.GOTEL.com

      

    3)在注入点通常加入log,追踪代码路径,和方法参数,执行结果等。

    7.注入建议

      1)尽量在注入点,以函数调用一行代码注入,且把注入的函数实现放在走后面,避免对其他原有代码 .line 有影响。

      2)把注入代码封装的成类,避免注入的时候,要手动修改很多的.line。

    参考网址:

    MIUI V4移植经验分享(三)—— Smali代码注入

  • 相关阅读:
    RabbitMq 集群配置
    获取 input 单选框和多选框的值
    js 获取 通过 ”?“ 或者 ”&“ url 传过来参数值
    Java 对文件的读取操作
    java 链接jdbc
    了解EBP寄存器
    节后后遗症
    [转]web service实现原理与异步调用
    Javascript实现无刷新分页
    邮件发送
  • 原文地址:https://www.cnblogs.com/sihaixuan/p/4372625.html
Copyright © 2020-2023  润新知