xihuyu2000 发表于 2018-4-20 00:05

Xposed使用经验

本帖最后由 xihuyu2000 于 2018-4-20 15:34 编辑

我是刚学习了一个月的纯小白,看了诸位大神的帖子,受益匪浅,把自己使用Xposed的经验分享一下,希望大家多多指教。

首先下载并安装Xposed。这个东西百度很多,很容易找的。我在模拟器中安装的效果如下图。


接下来开发一个android程序,具体操作可以参考丑小鸭大神的文章https://www.52pojie.cn/thread-648530-1-1.html。写的非常棒,我就是照的学习的,写出了我的第一个安卓小例子,感谢丑小鸭大神【大神看到我称呼他丑小鸭,会不会生气啊{:1_893:}】。

我的页面如下图


代码如下
package com.example.think.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      final EditText phoneEdit = findViewById(R.id.editTextPhone);
      final EditText pwdEdit = findViewById(R.id.editTextPwd);

      Button btn = findViewById(R.id.button);
      btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String phone = phoneEdit.getText().toString().trim();
                String pwd = pwdEdit.getText().toString().trim();

                checkLogin(phone, pwd);
            }
      });
    }

    private void checkLogin(String phone, String pwd) {
      if ("123".equals(phone) & "123".equals(pwd)){
            Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
      }else{
            Toast.makeText(MainActivity.this, "失败了", Toast.LENGTH_SHORT).show();
      }
    }
}

代码的意思是phone和pwd都输入123才显示“登录成功”,只要输入错误,就显示“失败了”。以上内容不是我的重点,接下来才是重点。

使用Project方式查看项目,在app目录下创建lib目录,lib目录与libs目录平级。复制XposedBridgeApi-89.jar到lib目录下。


在XposedBridgeApi-89.jar上,鼠标右键,点击Add As Library,添加到类库中。这样,接下来写代码的时候,就可以引用到jar中的类了。

C:/Users/Think/AppData/Local/YNote/data/weixinobU7VjplVUxVuFntEkd63GK_MNyY/bf372ae30e0d430386bbbe19721818b5/clipboard.png

创建资产文件xposed_init,写上我们将要写的java类
com.example.think.myapplication.Main。这个名字随便起,路径也随便。只是接下来创建java类的时候,一定是这个路径,这个名字就行。



修改配置文件,增加刚才的jar包信息和资产信息。图中红色框框中的内容一定要填写正确,不能乱写。



创建一个java类,命名为Main.java吧。就是上面在xposed_init中指明的类。在这个类中实现xposed中的方法。位置哪,就和MainActivity.java同一个目录吧。



类中的代码贴出来,如下,尽可能的做了一些注释。
package com.example.think.myapplication;


import org.json.JSONObject;

import javax.xml.transform.ErrorListener;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;

public class Main implements IXposedHookLoadPackage {
    /**
   * 包加载的时候回调
   * @param lpparam
   * @throws Throwable
   */
    @Override
    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
      String packageName = lpparam.packageName;

      //限定包,可以减少管理的类
      if (Main.class.getPackage().getName().equals(packageName)) {
            XposedBridge.log("Loaded app:" + packageName);
      }else{
            return;
      }
      //第一个参数是className,表示被注入的方法所在的类
      //第二个参数是类加载器,照抄就行
      //第三个参数是被注入的方法名
      //第四五个参数是第三个参数的两个形参的类型
      //最后一个参数是匿名内部类
      XposedHelpers.findAndHookMethod("com.example.think.myapplication.MainActivity", lpparam.classLoader, "checkLogin", String.class, String.class, new XC_MethodHook() {
            /**
             * 该方法在checkLogin方法调用之前被调用,我们输出一些日志,并且捕获参数的值。
             * 最后两行的目的是改变参数的值。也就是说无论参数是什么值,都会被替换为123
             * @param param
             * @throws Throwable
             */
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                XposedBridge.log("开始劫持~");
                XposedBridge.log("param1="+param.args);
                XposedBridge.log("param2="+param.args);
                param.args = "123";
                param.args = "123";
            }

            /**
             * 该方法在checkLogin方法调用之后被调用
             * @param param
             * @throws Throwable
             */
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                XposedBridge.log("结束劫持~");
                XposedBridge.log("param1="+param.args);
                XposedBridge.log("param2="+param.args);
            }
      });
    }
}

最后,生成apk,这样就写完了。


接下来就是部署到模拟器中。把apk拖到模拟器,会自动安装,弹出下面的窗口。


点击最上面的未激活,弹出窗口,打勾。打勾后立刻弹出一个信息框,提示重启后才能生效,所以我们重启模拟器。



重启后,打开我们的app,输入信息,点击登录,竟然弹出“登录成功”提示框。

前面的登录代码中,明明要求都输入123,才提示成功。这里我们明显输入错误,为什么提示成功?
原因就是在Xposed中的beforeHookedMethod方法的最后2行,对参数重新赋值为123了。当真正调用checkLogin的时候,参数就变为123了,自然登录成功。
也就是说无论用户如何输入,都会提示登录成功。

这就是xposed的强大之处!!!!!

下面是打印的日志


可以印证参数被xposed修改了。


项目代码百度盘链接:https://pan.baidu.com/s/1Fr4WLOB96tC12B-7E44KfA 密码:slg7

自己的经验还太少,欢迎大家继续分享!!

另外,自己在签名验证方面很薄弱,如何深入哪?希望大家不吝赐教!

【第一次发帖,很紧张,也无法预览效果,排版不好,而且重新编辑两次,大家多多包涵!】

早早er 发表于 2018-4-20 13:01

麻烦楼主重新编辑一下好吗,更新了麻烦通知哈:lol

acm79 发表于 2019-9-24 18:54

小白,参照大佬的过程实现了一下,安装完 apk 后发现 xposed 框架无法检测到,后自行搜索发现需要在AndroidMainfest.xml中application节点下添加类似如下语句:<meta-data android:name="xposedmodule" android:value="true"/>
      <meta-data android:name="xposeddescription" android:value="Xposed Demo"/>
      <meta-data android:name="xposedminversion" android:value="89"/> 再次拜谢,感谢教程

Hmily 发表于 2018-4-20 10:58

图片需要上传,不能直接粘贴,否则会导致帖子都无法显示,上传方法:https://www.52pojie.cn/misc.php?mod=faq&action=faq&id=29&messageid=36

a96220 发表于 2018-4-20 11:06

怎么看不到内容呀

x1135025713 发表于 2018-4-20 11:09

看不到,没内容

wuyy 发表于 2018-4-20 11:39


看不到,没内容

yyang200206 发表于 2018-4-20 12:16

凉凉,啥都看不到

dashuaibi 发表于 2018-4-20 12:32

xp框架?= =

Magic010824 发表于 2018-4-20 13:06

啥都看不到啊

pjk 发表于 2018-4-20 13:08

看不到内容{:1_907:}
页: [1] 2 3 4 5 6
查看完整版本: Xposed使用经验