通过smali注入的方式插入自定义代码来监控app的行为数据
2014-11-15 16:46
489 查看
http://www.myhack58.com/Article/html/3/7/2014/55348.htm
通过smali注入的方式插入自定义代码来监控app的行为数据,包括性能数据
以及部分逻辑数据,可以通过inline hook的方式在运行时监控应用的行为,笔者做了一个工具可以自动往apk中插入smali代码,
具体的步骤如下:
1、通过androguard解析apk文件,并获得dex文件;
2、通过baksmali将dex文件反编译为smali文件;
3、开始解析smali文件,将smali文件映射为内存数据结构;
4、分析smali文件,找出需要替换的方法关键字,并通过改写smali文件的方法注入代码;
当然这里面有很多细节问题需要解决,比如插入代码后会对原有的smali代码逻辑产生影响,如寄存器数量
增加,寄存器的的使用,跳转逻辑的影响,这些都需要你自己分析需要插入或者替换的代码上下文逻辑,使插入逻辑正确。
我下面以json为例,来详细描述如何替换smali代码:
json对象初始化的smali代码:
第一行代码用来生成一个JSONObject对象,并放到v3寄存器中,第二行代码调用v3中JSONObject对象的init方法,
参数为存在p0寄存器(第一个参数)中的String对象 调用json对象格式化字符串jsonObject . toString,对应的smali代码如下:
第一行代码调用v3中存放的json对象的toString方法,第二行代码将该返回值存放到v8寄存器中。
下面定义一个静态的方法,覆盖jsonobject对应的方法 :
ok,剩下的就是将smali代码里的逻辑改为调用上面的静态方法,替换后的内容如下:
init方法做同样的处理,这样就可以截获json对象的内容,从而可以监控使用json来上传数据的app内容,
如果在上面的方法开始和结束的地方获取系统时间,还可以用来获取json toString方法耗费的时间。
json方法只是众多可以捕获的方法之一,按照类似的逻辑还可以捕获更多您感兴趣的方法。
为了测试一下smali自动注入的成果,笔者下载了一个360安全卫士,进行了自动注入,此处需要注意的是,
修改完smali 后需要重新打包签名,而360安全卫士在启动时做了签名校验,如果发现签名不一致会弹出一个
对话框让你去下载应用并 退出,不过这也可以通过修改smali代码的方式来解决,可以找到签名校验的地方将
返回值改为1即可
通过smali注入的方式插入自定义代码来监控app的行为数据,包括性能数据
以及部分逻辑数据,可以通过inline hook的方式在运行时监控应用的行为,笔者做了一个工具可以自动往apk中插入smali代码,
具体的步骤如下:
1、通过androguard解析apk文件,并获得dex文件;
2、通过baksmali将dex文件反编译为smali文件;
3、开始解析smali文件,将smali文件映射为内存数据结构;
4、分析smali文件,找出需要替换的方法关键字,并通过改写smali文件的方法注入代码;
当然这里面有很多细节问题需要解决,比如插入代码后会对原有的smali代码逻辑产生影响,如寄存器数量
增加,寄存器的的使用,跳转逻辑的影响,这些都需要你自己分析需要插入或者替换的代码上下文逻辑,使插入逻辑正确。
我下面以json为例,来详细描述如何替换smali代码:
json对象初始化的smali代码:
new-instance v3, Lorg/json/JSONObject; invoke-direct {v3, p0}, Lorg/json/JSONObject;-><init>(Ljava/lang/String;)V
第一行代码用来生成一个JSONObject对象,并放到v3寄存器中,第二行代码调用v3中JSONObject对象的init方法,
参数为存在p0寄存器(第一个参数)中的String对象 调用json对象格式化字符串jsonObject . toString,对应的smali代码如下:
invoke-virtual {v3}, Lorg/json/JSONObject;->toString()Ljava/lang/String; move-result-object v8
第一行代码调用v3中存放的json对象的toString方法,第二行代码将该返回值存放到v8寄存器中。
下面定义一个静态的方法,覆盖jsonobject对应的方法 :
public static String toString(JSONObject jsonObject) { String jsonString = jsonObject.toString(); Log.i("json toString:" + jsonString); return jsonString; }
ok,剩下的就是将smali代码里的逻辑改为调用上面的静态方法,替换后的内容如下:
invoke-static {v3}, Lcom/test/JsonReplace;->toString(Lorg/json/JSONObject;)Ljava/lang/String; move-result-object v7
init方法做同样的处理,这样就可以截获json对象的内容,从而可以监控使用json来上传数据的app内容,
如果在上面的方法开始和结束的地方获取系统时间,还可以用来获取json toString方法耗费的时间。
json方法只是众多可以捕获的方法之一,按照类似的逻辑还可以捕获更多您感兴趣的方法。
为了测试一下smali自动注入的成果,笔者下载了一个360安全卫士,进行了自动注入,此处需要注意的是,
修改完smali 后需要重新打包签名,而360安全卫士在启动时做了签名校验,如果发现签名不一致会弹出一个
对话框让你去下载应用并 退出,不过这也可以通过修改smali代码的方式来解决,可以找到签名校验的地方将
返回值改为1即可
相关文章推荐
- 一起谈.NET技术,提供第三种代码生成方式——通过自定义BuildProvider为ASP.NET提供代码生成
- 关于在.NET中通过Parameter方式插入Oracle数据的错误提示——Oracle-ORA-01722 invalid number
- Android中如何通过代码的方式获取APP的SHA1值.
- 一种不通过UI给C4C自定义BO创建测试数据的方式
- AppDelegate存储全局变量和 NSUserDefaults standardUserDefaults 通过模型保存和读取数据,存储自定义的对象
- Spring代码实例系列-02:松耦合loose coupling(通过xml文件以默认的方式进行setter注入)
- MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)
- 尽管普通的sql语句代码可以实现数据插入的操作,但是更好的代码应该是参数的方式:
- 通过loadrunner 11常规通用的C语言API类型的Vuser 方式,测试验证MySQL数据库插入、查询、修改、删除数据性能脚本实例
- 利用vmstat命令监控Linux资源使用并将数据通过图形化方式显示
- 通过JSON替换的方式实现app返回数据MOCK
- EJB通过注解方式注入并使用其他EJB或者服务、配置JBoss数据源
- 通过数组方式向Oracle大批量插入数据(10万条11秒)
- 提供第三种代码生成方式——通过自定义BuildProvider为ASP.NET提供代码生成
- ArrayList如何实现插入的数据按自定义的方式有序存放
- 项目中使用XML方式去取数据插入数据代码
- 【iOS技巧- 6 】通过代码新建一个自定义的UITableViewCell < app中的cell的高度,宽度,位置都是不一致的情况下 >
- Spring代码实例系列-01:hellospring(通过xml文件以默认的方式进行setter注入)
- Office编程(二)C#读取Excel并存入数据库,通过XML自定义表名,是否重建并插入数据
- nagios系列(七)nagios通过自定义脚本的方式监控mysql主从同步