何为hook 
Hook英文翻译过来就是“钩子”的意思,那我们在什么时候使用这个“钩子”呢?

我们知道,在Android操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处理,也是根据事件流程一步步的向下执行。而“钩子”的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子勾上事件一样。并且能够在勾上事件时,处理一些自己特定的事件。如下图所示:

Hook的这个本领,使它能够将自身的代码“融入”被勾住(Hook)的程序的进程中,成为目标进程的一个部分。我们也知道,在Android系统中使用了沙箱机制,普通用户程序的进程空间都是独立的,程序的运行彼此间都不受干扰。

这就使我们希望通过一个程序改变其他程序的某些行为的想法不能直接实现,但是Hook的出现给我们开拓了解决此类问题的道路。当然,根据Hook对象与Hook后处理的事件方式不同,Hook还分为不同的种类,如消息Hook、API Hook等。

注:上述言论来自北漂周大神http://blog.csdn.net/yzzst/article/details/47318751

主要功能就是,修改或者监听他人程序方法的返回值,这逼装的瞬间就给满分。

Xpose

https://github.com/rovo89 
 
框架由上面三部分构成。 
既然能够hook其他程序的api,相比也会修改底层代码,而Xposed主要是来修改系统的app_process,它集成在XposedInstaller中,所以只要运行XposedInstall打包的apk点击“安装/更新”就可以了。

而XposedBridge则是一个jar包,提供hook相关的api.

除了XposedInstall这个安装器,还有wsm,据说是为了兼容miui而有的,两者主要目的都差不多,具体可百度之.

安装完成之后,打开模块功能,两行绿色数字代表激活的版本号。 


接下来就来看看hook的魅力,导入XposedBridgeApi-54.jar包,因为正常的compile files(‘lib/XposedBridgeApi-54.jar’)之后,运行会报错,IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation”。 故使用 provided files(‘lib/XposedBridgeApi-54.jar’)

  • 新建一个类实现IXposedHookLoadPackage接口
public class Main implements IXposedHookLoadPackage{

    //handleLoadPackage方法可以捕捉指定包名
@Override
public void handleLoadPackage(LoadPackageParam arg0) throws Throwable {
// TODO Auto-generated method stub
//不是指定的程序,不hook
if (!arg0.packageName.equals("com.pingplusplus.demoapp") )
return;
//打印日志在XposedInstall.apk里
XposedBridge.log("Loaded app: " + arg0.packageName); //hook TelephonyManager类里面的getDeviceId,修改手机imei码妥妥的
XposedHelpers.findAndHookMethod(TelephonyManager.class.getName(), arg0.classLoader, "getDeviceId", new Object[] { new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("劫持结束了~");
//将返回得imei值设置为我想要的值
param.setResult("1234567890"); }
} });
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

XposedHelpers.findAndHookMethod有两个回调方法beforeHookedMethod,afterHookedMethod。一个在方法调用前回调,一个在方法调用之后回调。

  • 然后需要声明程序入口,在assets新建xposed_init文件声明该类
//包名+类名
com.example.loginhook.Main
  • 1
  • 2

在AndroidManifest.xml声明meta-data

     <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" > <meta-data
android:name="xposedmodule"
android:value="true" />
<!-- 模块描述 -->
<meta-data
android:name="xposeddescription"
android:value="模块名,在XposedInstall显示" />
<!-- 最低版本号 -->
<meta-data
android:name="xposedminversion"
android:value="30" />
</application>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

然后运行程序,在XposedInstall的模块功能可以看到新加了一个模块 
 
勾选模块,会提示你重启手机,这样才会生效。

这样就可以修改包名为com.pingplusplus.demoapp的程序的getDeviceId()方法了,在程序中打印一下,输出的imei码是不是变了?


除了修改方法的返回值,还可以用它来广告注入。你想在哪个程序注入广告,,只需知道那个程序的包名+主activity,劫持他的onCreate方法,在这里打开另一个透明的activity,就可以实现广告了

首先定义一个AdActivity接入第三方广告

public class AdActivity extends Activity implements InterstitialAdListener{

    public static String url = null;
public static byte FS_DESIRE_AD_FORM = 0;
private String LOG_TAG = "unlock"; private RelativeLayout layout; public static TextView adCount ;
public static TextView adBeaconCount; private InterstitialAd ad; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //全屏广告实例
ad = new InterstitialAd(this,"2b8dbd92edd74a97b3ba6b0189bef125",true,this);
// 设置全屏格式
ad.setDesireAdForm(InterstitialAd.ADWO_INTERSTITIAL);
// 设置请求广告类型 可选。
// ad.setDesireAdType((byte) 0);
// 开始请求全屏广告
ad.prepareAd(); } @Override
public void onReceiveAd() {
Log.e(LOG_TAG, "onReceiveAd");
} @Override
public void onLoadAdComplete() {
Log.e(LOG_TAG, "onLoadAdComplete");
// 成功完成下载后,展示广告
ad.displayAd();
} @Override
public void onFailedToReceiveAd(ErrorCode errorCode) {
Log.e(LOG_TAG, "onFailedToReceiveAd");
} @Override
public void onAdDismiss() {
Log.e(LOG_TAG, "onAdDismiss");
finish();
} @Override
protected void onDestroy() {
super.onDestroy();
Log.e(LOG_TAG, "onDestroy");
// 请在这里释放全屏广告资源
if (ad != null) {
ad.dismiss();
ad = null;
}
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
// 开始请求广告
Log.e(LOG_TAG, "onAttachedToWindow"); }
@Override
public void OnShow() {
// TODO Auto-generated method stub
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

实现一个action ,为了隐式调用

<!-- @android:style/Theme.Translucent.NoTitleBar -->
<activity android:name="com.example.loginhook.AdActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"//
android:hardwareAccelerated="true">
<intent-filter>
<!-- 广告的action -->
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <action android:name="com.example.loginhook.action.AD" /> </intent-filter>
</activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

接下来实现hook,在应用宝的主页添加广告

    @Override
public void handleLoadPackage(LoadPackageParam arg0) throws Throwable {
if (!arg0.packageName.equals("com.tencent.android.qqdownloader") )
return;
XposedHelpers.findAndHookMethod("com.tencent.assistantv2.activity.MainActivity", arg0.classLoader, "onCreate", new Object[]{Bundle.class,
new XC_MethodHook() { @Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("onCreate" + param.method.getName());
CMD.execCommand1("am start -a com.example.loginhook.action.AD");
}
}}); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

也就是打开应用宝的时候启动一个透明的广告,看起来就像是应用宝里面的广告,感觉66的

代码下载https://github.com/JadynChan/xposehookdemo

标签: androidimei
2015-11-24 12:01 441人阅读 评论(0) 收藏 举报
 分类:
android开发(8)  github框架(5) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

何为hook 
Hook英文翻译过来就是“钩子”的意思,那我们在什么时候使用这个“钩子”呢?

我们知道,在Android操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处理,也是根据事件流程一步步的向下执行。而“钩子”的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子勾上事件一样。并且能够在勾上事件时,处理一些自己特定的事件。如下图所示:

Hook的这个本领,使它能够将自身的代码“融入”被勾住(Hook)的程序的进程中,成为目标进程的一个部分。我们也知道,在Android系统中使用了沙箱机制,普通用户程序的进程空间都是独立的,程序的运行彼此间都不受干扰。

这就使我们希望通过一个程序改变其他程序的某些行为的想法不能直接实现,但是Hook的出现给我们开拓了解决此类问题的道路。当然,根据Hook对象与Hook后处理的事件方式不同,Hook还分为不同的种类,如消息Hook、API Hook等。

注:上述言论来自北漂周大神http://blog.csdn.net/yzzst/article/details/47318751

主要功能就是,修改或者监听他人程序方法的返回值,这逼装的瞬间就给满分。

Xpose

https://github.com/rovo89 
 
框架由上面三部分构成。 
既然能够hook其他程序的api,相比也会修改底层代码,而Xposed主要是来修改系统的app_process,它集成在XposedInstaller中,所以只要运行XposedInstall打包的apk点击“安装/更新”就可以了。

而XposedBridge则是一个jar包,提供hook相关的api.

除了XposedInstall这个安装器,还有wsm,据说是为了兼容miui而有的,两者主要目的都差不多,具体可百度之.

安装完成之后,打开模块功能,两行绿色数字代表激活的版本号。 


接下来就来看看hook的魅力,导入XposedBridgeApi-54.jar包,因为正常的compile files(‘lib/XposedBridgeApi-54.jar’)之后,运行会报错,IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation”。 故使用 provided files(‘lib/XposedBridgeApi-54.jar’)

  • 新建一个类实现IXposedHookLoadPackage接口
public class Main implements IXposedHookLoadPackage{

    //handleLoadPackage方法可以捕捉指定包名
@Override
public void handleLoadPackage(LoadPackageParam arg0) throws Throwable {
// TODO Auto-generated method stub
//不是指定的程序,不hook
if (!arg0.packageName.equals("com.pingplusplus.demoapp") )
return;
//打印日志在XposedInstall.apk里
XposedBridge.log("Loaded app: " + arg0.packageName); //hook TelephonyManager类里面的getDeviceId,修改手机imei码妥妥的
XposedHelpers.findAndHookMethod(TelephonyManager.class.getName(), arg0.classLoader, "getDeviceId", new Object[] { new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("劫持结束了~");
//将返回得imei值设置为我想要的值
param.setResult("1234567890"); }
} });
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

XposedHelpers.findAndHookMethod有两个回调方法beforeHookedMethod,afterHookedMethod。一个在方法调用前回调,一个在方法调用之后回调。

  • 然后需要声明程序入口,在assets新建xposed_init文件声明该类
//包名+类名
com.example.loginhook.Main
  • 1
  • 2

在AndroidManifest.xml声明meta-data

     <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" > <meta-data
android:name="xposedmodule"
android:value="true" />
<!-- 模块描述 -->
<meta-data
android:name="xposeddescription"
android:value="模块名,在XposedInstall显示" />
<!-- 最低版本号 -->
<meta-data
android:name="xposedminversion"
android:value="30" />
</application>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

然后运行程序,在XposedInstall的模块功能可以看到新加了一个模块 
 
勾选模块,会提示你重启手机,这样才会生效。

这样就可以修改包名为com.pingplusplus.demoapp的程序的getDeviceId()方法了,在程序中打印一下,输出的imei码是不是变了?


除了修改方法的返回值,还可以用它来广告注入。你想在哪个程序注入广告,,只需知道那个程序的包名+主activity,劫持他的onCreate方法,在这里打开另一个透明的activity,就可以实现广告了

首先定义一个AdActivity接入第三方广告

public class AdActivity extends Activity implements InterstitialAdListener{

    public static String url = null;
public static byte FS_DESIRE_AD_FORM = 0;
private String LOG_TAG = "unlock"; private RelativeLayout layout; public static TextView adCount ;
public static TextView adBeaconCount; private InterstitialAd ad; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //全屏广告实例
ad = new InterstitialAd(this,"2b8dbd92edd74a97b3ba6b0189bef125",true,this);
// 设置全屏格式
ad.setDesireAdForm(InterstitialAd.ADWO_INTERSTITIAL);
// 设置请求广告类型 可选。
// ad.setDesireAdType((byte) 0);
// 开始请求全屏广告
ad.prepareAd(); } @Override
public void onReceiveAd() {
Log.e(LOG_TAG, "onReceiveAd");
} @Override
public void onLoadAdComplete() {
Log.e(LOG_TAG, "onLoadAdComplete");
// 成功完成下载后,展示广告
ad.displayAd();
} @Override
public void onFailedToReceiveAd(ErrorCode errorCode) {
Log.e(LOG_TAG, "onFailedToReceiveAd");
} @Override
public void onAdDismiss() {
Log.e(LOG_TAG, "onAdDismiss");
finish();
} @Override
protected void onDestroy() {
super.onDestroy();
Log.e(LOG_TAG, "onDestroy");
// 请在这里释放全屏广告资源
if (ad != null) {
ad.dismiss();
ad = null;
}
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
// 开始请求广告
Log.e(LOG_TAG, "onAttachedToWindow"); }
@Override
public void OnShow() {
// TODO Auto-generated method stub
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

实现一个action ,为了隐式调用

<!-- @android:style/Theme.Translucent.NoTitleBar -->
<activity android:name="com.example.loginhook.AdActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"//
android:hardwareAccelerated="true">
<intent-filter>
<!-- 广告的action -->
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <action android:name="com.example.loginhook.action.AD" /> </intent-filter>
</activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

接下来实现hook,在应用宝的主页添加广告

    @Override
public void handleLoadPackage(LoadPackageParam arg0) throws Throwable {
if (!arg0.packageName.equals("com.tencent.android.qqdownloader") )
return;
XposedHelpers.findAndHookMethod("com.tencent.assistantv2.activity.MainActivity", arg0.classLoader, "onCreate", new Object[]{Bundle.class,
new XC_MethodHook() { @Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("onCreate" + param.method.getName());
CMD.execCommand1("am start -a com.example.loginhook.action.AD");
}
}}); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

也就是打开应用宝的时候启动一个透明的广告,看起来就像是应用宝里面的广告,感觉66的

代码下载https://github.com/JadynChan/xposehookdemo

xpose修改手机imei码,注入广告的更多相关文章

  1. IMEI手机串码和serialno

    IMEI 1.IMEI是什么 国际移动设备识别码(International Mobile Equipment Identity number,IMEI),俗称“手机串号”.“手机串码”.“手机序列号 ...

  2. andriod sdk 安卓模拟器修改imei码,位置信息

      imei码就是手机卡的信息一段15位数字,就好像pc的mac地址.很多app注册会检测你是否是手机登录的,就会读取你的imei码,如果读取不到,就说明你可能是用平板等移动设备上网的. app也可以 ...

  3. MTK如何烧录IMEI码(俗称串号)

    先介绍一下使用环境 主控:MT6582VX android版本:4.4.2 操作系统:windows XP SN烧录工具:SN_Write_tool_exe_v2.1420.00 首先介绍一下IMEI ...

  4. air for android 使用ANE来获取安卓手机IMEI号

    一首页创建一个ANE文件 1 使用FlashBuilder 或者Eclipse 创建一个新的android项目     A 创建文件Extension.java package com.dabing. ...

  5. 不修改源代码,动态注入Java代码的方法(转)

    转自:https://blog.csdn.net/hiphoon_sun/article/details/38707927 有时,我们需要在不修改源代码的前提下往一个第三方的JAVA程序里注入自己的代 ...

  6. 利用websocket实现手机扫码登陆后,同步登陆信息到web端页面

    新手必看 广播系统 事件系统 准备工作 初始化项目 引入 laravel-websockets 软件包 启动 websocket 监听 主要流程 创建两个页面 建立 socket 连接 手机端扫码登陆 ...

  7. iOS修改手机定位(非越狱任意位置)

    利用开发者的一些调试功能,我们可以修改非越狱的苹果手机定位,模拟任意位置. 经测试,此方法仅限开发者调试使用,并不能长时间修改手机定位. 1. 首先需要了解一些坐标系的知识 iOS,原生坐标系为 WG ...

  8. 获取手机IMEI 号和 IP

    没什么可说的,直接上代码: public class PhoneStateCodeUtils { /** * 获取手机imei串号 */ public static String getImei(Co ...

  9. 修改FFMpeg源码—捕获丢包

    概述 最近我们项目有一个需求就是解决客户端播放RTSP视频流花屏的问题,一般来说丢包就会引起花屏,导致客户端花屏的因素又有很多,比如说: 相机到服务器丢包 服务器到客户端丢包 等等... 其中服务器到 ...

随机推荐

  1. Vue视图

    1. 基本模板语法 1.1 插值 文本 数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值 v-text 指令也可以用于数据绑定,如果要更新部分的 textContent ...

  2. swift实现UItableview上拉下拉刷新模块

    最近用写个项目 发现上拉下拉刷新模块没找到合适的 so 自己写了一个 由于最近忙 教程就不写了 里面有 直接贴地址https://github.com/DaChengTechnology/DCRefr ...

  3. 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(下)

    在飞机大战游戏开发中遇到的问题和解决方法: 1.在添加菜单时,我要添加一个有背景的菜单,需要在菜单pMenu中添加一个图片精灵,结果编译过了但是运行出错,如下图: 查了很多资料,调试了很长时间,整个人 ...

  4. fiddler的断点使用

    功能 用于修改数据 1.断点设置请求之前--修改请求数据 2.断点设置在响应时--对响应的数据修改 已中断的会话最前面的图标为红色的带箭头的标志 设置断点方法 1.菜单栏:rules->auto ...

  5. vue的ui库使用Element UI,纯html页面,不使用webpack那玩意

    使用手册访问:https://cloud.tencent.com/developer/doc/1270 第一步:在head添加样式 <link rel="stylesheet" ...

  6. Linux 优化详解

    一.引子 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不是说现在又花了.测试了,以后就可以一劳永逸,而不是说 ...

  7. MapReduce和yarn

    1.Mapreduce是什么? Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架: Mapreduce核心功能是将用户编写的业务逻辑代码和自带默 ...

  8. JAVA基础学习之路(九)[2]String类常用方法

    字符与字符串: 1.将字符数组变为字符串(构造方法) public String(char[] value) Allocates a new String so that it represents ...

  9. python2和python3同时存在如何安装和使用pip

    linux下 如果没有pip则需要安装pip python2安装pip sudo apt install python-pip1如果是python3,则如下: sudo apt install pyt ...

  10. 【Python入门学习】闭包&装饰器&开放封闭原则

    1. 介绍闭包 闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure) 例如:如果在一个内部函数里:func2()就是内部函数, 对在外部 ...