何为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. Entity Framework中的几种加载方式

            在Entity Framework中有三种加载的方式,分别是延迟加载,自动加载和显示加载.下面用一个例子来说明:现在有两个表,一个是资料表(Reference),另外一个表是资料分类表 ...

  2. VirtualBox主机和虚拟机互相通信

    默认情况下VirtualBox虚拟机网络设置为网络地址转换,虚拟机中的地址一般是10.0.2.x,虚拟机中访问主机只需要访问默认网关地址即可,但是主机访问虚拟机就需要增加一些配置了,方法有以下几种: ...

  3. css控制字体线使用:text-decoration

    css控制字体下划线使用text-decoration : text-decoration:none 无装饰,通常对html下划线标签去掉下划线样式 text-decoration:underline ...

  4. Web性能测试篇:AB 压力测试

    1. 压力测试的概念\定义 1.这段话是给刚接触\学习性能测试知识的初学者,在实际工作中都会接触到性能测试.压力测试.负载测试等专业名词也容易混淆,下面带大家熟悉下这到底是怎么定义: 1.1.性能测试 ...

  5. 亚马逊AWS业务副总裁:如何在基础设施上降成本

    腾讯科技 林靖东 11月17日编译 亚马逊Amazon Web Services业务的副总裁.著名工程师詹姆斯汉密尔顿(James Hamilton)在AWS re:Invent大会上解释了公司是如何 ...

  6. 你用 Python 做过什么有趣的数据挖掘项目?

    有网友在知乎提问:「你用 Python 做过什么有趣的数据挖掘项目?」 我最近刚开始学习 Python, numpy, scipy 等, 想做一些数据方面的项目,但是之前又没有这方面的经验.所以想知道 ...

  7. mysql 数据库名含“-”

    跨数据库操作时,用反引号即可: insert into `tmi-ds`.knn_test(imagedata) select imagedata from tmidb.imagetable wher ...

  8. rsa加密算法,前后端实现。

    前端js: 下载地址:http://travistidwell.com/jsencrypt/ js第一版本: // 对数据加密 function encrypt(enStr){ //没有加载jsenc ...

  9. MySQL 基于xtrabackup备份—热备工具

    xtrabackup(仅对InnoDB存储引擎支持热备) percona公司开发 改进的MySQL分支:percona-server 存储引擎改进:InnoDB —> XtraDB 使用本地的R ...

  10. linux svn启动和关闭

    linux svn启动和关闭 博客分类: linux系统 svnlinux  1,启动SVN sudo svnserve -d -r /home/data/svn/ 其中 -d 表示守护进程, -r ...