1丶Android下的常用Hook框架

android下的Hook框架有很多,比较出名的就是XposedCydia Substrate,当然都各有不足,Xposed只能Hook Java层,面对native层就显得无力了;Substrate和Java层和native层都可以Hook,但作者好像很久没更新了,只能在dalvik上Hook,在android5.0及以上版本就不能用了,而且兼容性也不是很好,在几款模拟器上都没配置成功。

当然还有其它一些和新出的hook框架也是不错的,就不一一介绍了,下面给出Hook 框架的项目地址

Xposed:https://github.com/rovo89/Xposed
Cydia Substrate官网:http://www.cydiasubstrate.com/
Android Inline Hook:https://github.com/ele7enxxh/Android-Inline-Hook
StormHook:Android侵入式Java Hook框架:https://github.com/woxihuannisja/StormHook
免RootHook框架:https://github.com/asLody/legend
基于VirtualApp和YAHFA的免RootHook框架:https://github.com/rk700/VirtualHook

2丶Xposed框架的使用-进入Java的世界

环境:

开发工具:Android studio3.0.1
运行环境:Genymotion模拟器,系统安卓4.4.4
Xposed版本:v2.7
XposedBridgeApi版本:v54
注意:Android 5.0以下Xposed版本用v2.7,Android5.0用v3.+

实验目的

二个app,一个点击按钮获取imei,另一个完成Hook系统imie操作

操作步骤

①在Android studio中新建个Poriect,删除掉原有的app module,新建一个名为hook和一个名为getImei的module

②用getImei实现获取imei的功能

添加权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

layout:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:gravity="center"    tools:context="com.banyan.imei.MainActivity">    <TextView        android:id="@+id/textView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="20dp"        android:text="获取到的imei值为:" />    <Button        android:layout_marginTop="18dp"        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="获取imei"/>LinearLayout>

Activity:

package com.banyan.imei;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.telephony.TelephonyManager;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends AppCompatActivity {    private Button button1;    private TextView textView1;    private TelephonyManager tm;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button1 = findViewById(R.id.button1);        textView1 = findViewById(R.id.textView1);        tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);        button1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //获取imei                String imei = tm.getDeviceId();                //设置文本框的内容为获取的imei                textView1.setText("获取到的imei值为:");                textView1.setText(textView1.getText() + imei);            }        });    }}

运行效果如下:

因为是模拟器,这imei有点奇怪^_^
好,下面我们来完成Hook imei操作。。

③用hook实现获取Hook imei的功能

使用Xposed hook的必要配置

在AndroidManifest.xml里添加这三项:

<meta-data android:name="xposedmodule" android:value="ture"/><meta-data android:name="xposeddescription" android:value="Hook imei测试" /><meta-data android:name="xposedminversion" android:value="54" />

添加XposedBridgeApi

新建个lib文件夹,拷贝XposedBridgeApi-54.jar到此目录,然后右键点击lib文件夹中的jar文件选择-> add as Library,这个有个坑,添加完之后还要更改一下配置,不然编译的时候会把XposedBridgeApi也编译进去,会导致很多问题,所以要配置一下使之编译的时候不参加编译。
Ctrl+Shift+Alt+s快捷键来到Project Structure界面,更改 jar的implementation 为compileOnly:

添加Hook的入口类

新建assetc文件夹,在文件夹下新建xposed_init文件,然后向文件添加入口类信息。如下图:

实现Hook imie功能

新建MianHook,代码如下:

package com.banyan.hook;import android.telephony.TelephonyManager;import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.XC_MethodHook;import de.robv.android.xposed.XposedHelpers;import de.robv.android.xposed.callbacks.XC_LoadPackage;/** * Created by banyan on 2018/1/1. *///实现IXposedHookLoadPackage接口public class MainHook implements IXposedHookLoadPackage{    //执行接口的handleLoadPackage方法    @Override    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {        /***         * 用XposedHelpers类的findAndHookMethod方法查找需要hook的方法并进行hook         * 第一个参数:需要Hook的类         * 第二个参数:需要Hook的方法         * 第三个参数:hook到了方法后要进行的操作         * */        XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodHook() {            /***             * 在被Hook的方法执行之前要进行的操作             * 比如改变参数之类的             */            @Override            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {                super.beforeHookedMethod(param);            }            /***             * 在被Hook的方法执行后要进行的操作             * 比如改变返回值之类的             */            @Override            protected void afterHookedMethod(MethodHookParam param) throws Throwable {                String primary = (String) param.getResult();                //改变被Hook的方法getDeviceId()的返回值                param.setResult("我是etDeviceId方法,我被Hook了,返回值由" + primary + "改成了:88888888888888");            }        });    }}

执行效果图:

结语

Hook是种优雅的利器^-^。。

更多相关文章

  1. Android微信登录(shareSDK)注意事项
  2. afinal logoAndroid的快速开发框架 afinal
  3. Qt on Android:添加分享功能
  4. Android(安卓)Framework 框架系列之 PhoneWindowManager
  5. 2020最新Android大厂面试真题大全(附答案)
  6. Android视频播放框架Vitamio
  7. Android(安卓)GUI编程模型(MVC设计模式)
  8. Android(安卓)Studio 友盟api实现apk多渠道打包
  9. 传感器使用简介

随机推荐

  1. Android(安卓)Adapter详解(1)
  2. Android(安卓)事件处理
  3. Android(安卓)AsyncTask解析
  4. android日志分析与记录.
  5. 理解Android的菜单
  6. Android高手进阶教程(四)之----Android(
  7. .net程序员转战android第二篇---牛刀小试
  8. Android(安卓)NFS文件系统挂载遇到的问题
  9. Android应用程序启动过程源代码分析(1)
  10. android读取keystore证书文件