有同学在通服里面干活,最近一直忙着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代码注入

android smali代码注入 实战一的更多相关文章

  1. apk反编译(4)Smali代码注入

    转自 : http://blog.sina.com.cn/s/blog_5674d18801019i89.html 应用场景 Smali代码注入只能应对函数级别的移植,对于类级别的移植是无能为力的.具 ...

  2. Android 反编译 代码注入之HelloWorld

    为了向经典的"Hello, World"致敬,我们也从一个简单的程序开始HelloWorld.apk.当你把这个APK安装到手机上运行后,在屏幕上就显示一行文字"Hell ...

  3. 【转】Delphi+Halcon实战一:两行代码识别QR二维码

    Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...

  4. Android调试系列—使用android studio调试smali代码

    1.工具介绍 使用工具 android killer:用于反编译apk包,得到smali代码 android studio:调试smali代码工具,或者使用idea,android studio就是在 ...

  5. [Android Security] 如何把java代码转换成smali代码

    copy :https://www.cnblogs.com/gordon0918/p/5466514.html 1.概述 Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中 ...

  6. Android Studio 动态调试 apk 反编译出的 smali 代码

    在信安大赛的准备过程中,主要通过 Android Studio 动态调试 apk 反编译出来的 smali 代码的方式来对我们分析的执行流程进行验证.该技巧的主要流程在此记录.以下过程使用 Andro ...

  7. [Android]Android MVP&依赖注入&单元测试

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入 ...

  8. Android下so注入和hook

    一.前言 总结一下这两天学习的Android注入so文件,通过遍历got表hook函数调用 1.注入so文件 2.so文件中遍历got表hook函数 二.注入so文件 1)注入进程 1.编程思路分为以 ...

  9. Netty聊天器(实战一):从0开始实战100w级流量应用

    Java 聊天程序(百万级流量实战一):系统介绍 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之14 [博客园 总入口 ] 源码IDEA工程获取链接:Java 聊天室 实战 源码 写在前面 ...

随机推荐

  1. swing之gridlayout

    package gui1; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.JButton; im ...

  2. centos7 showdoc 安装部署

    1.进入showdoc官网帮助目录下 https://www.showdoc.cc/web/#/help?page_id=828455960655160 阅读自动安装部署相关事项: 2.利用xshel ...

  3. [转]使用Flexible实现手淘H5页面的终端适配

    曾几何时为了兼容IE低版本浏览器而头痛,以为到Mobile时代可以跟这些麻烦说拜拜.可没想到到了移动时代,为了处理各终端的适配而乱了手脚.对于混迹各社区的偶,时常发现大家拿手机淘宝的H5页面做讨论—— ...

  4. CentOS6.5上安装Python2.7和PIP

    目前大部分用户使用的CentOS6.5上默认的Python还是2.6版本.升级到Python2.7碰到很多问题.本文将介绍如何安装Python2.7. 1. 安装必要的准备包 安装过程将用到gcc,方 ...

  5. Python学习笔记 - MySql的使用

    一.安装MySql模块 Python2.X pip install MySQLdb Python3.X pip install pymysql 二.数据库连接接口 由于Python统一了数据库连接的接 ...

  6. [转] linux 启动文件及设置环境变量

    系统级启动文件  ==================================== 1./etc/rc  主启动文件,不要修改它 2./etc/rc.conf  决定启动哪些系统自带的守护进程 ...

  7. SA读书笔记1

    SA的基本任务: 帐户: 为新用户增设帐号,将不再活动的帐号删除,帐号存活期事务(忘记密码等).把用户的主目录放在什么位置.在哪些机器上创建帐号. 硬件:识别并使用新硬件.对于虚拟化:设备可能要安装在 ...

  8. Changing Controller Numbers in Solaris

    If you need to change the controller numbers (c#) that a disk has assigned to it, whether it is for ...

  9. BA 新web化 问题汇总

    1. 3D堆栈图在winform端无法显示,但在web端可以正常显示,说明与浏览器版本有关,在 IE 中设置文档模式为 IE8 即报错,IE9 却正常显示,可在 <head>节点下添加如下 ...

  10. mysql存储过程@命名变量的区别

    存储过程中@是用来标识每一次运行存储过程都会保存的值.而直接命名是每一次都会初始化的局部变量.@@是用来标识全局变量. CREATE PROCEDURE prc_test ()BEGIN DECLAR ...