吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 24346|回复: 46
收起左侧

[Android 原创] Xposed使用经验

  [复制链接]
xihuyu2000 发表于 2018-4-20 00:05
本帖最后由 xihuyu2000 于 2018-4-20 15:34 编辑

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

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

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

我的页面如下图
2.png

代码如下
[Java] 纯文本查看 复制代码
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.[i]activity_main[/i]);

        final EditText phoneEdit = findViewById(R.id.[i]editTextPhone[/i]);
        final EditText pwdEdit = findViewById(R.id.[i]editTextPwd[/i]);

        Button btn = findViewById(R.id.[i]button[/i]);
        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.[i]makeText[/i](MainActivity.this, "登录成功", Toast.[i]LENGTH_SHORT[/i]).show();
        }else{
            Toast.[i]makeText[/i](MainActivity.this, "失败了", Toast.[i]LENGTH_SHORT[/i]).show();
        }
    }
}


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

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

在XposedBridgeApi-89.jar上,鼠标右键,点击Add As Library,添加到类库中。这样,接下来写代码的时候,就可以引用到jar中的类了。
4.png
C:/Users/Think/AppData/Local/YNote/data/weixinobU7VjplVUxVuFntEkd63GK_MNyY/bf372ae30e0d430386bbbe19721818b5/clipboard.png


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


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


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


类中的代码贴出来,如下,尽可能的做了一些注释。
[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[0]);
                XposedBridge.log("param2="+param.args[1]);
                param.args[0] = "123";
                param.args[1] = "123";
            }

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

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


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

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


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

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

下面是打印的日志
11.png
12.png
可以印证参数被xposed修改了。


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

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

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

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

免费评分

参与人数 22吾爱币 +21 热心值 +20 收起 理由
yxz + 1 用心讨论,共获提升!
zzzlucas + 1 + 1 谢谢@Thanks!学习了
聆听-往昔 + 1 + 1 谢谢@Thanks!
zfzzqlx + 1 + 1 热心回复!
KUKI + 1 + 1 谢谢@Thanks!
jadespider + 1 我很赞同!
Toosan + 1 + 1 热心回复!
Fortuitously + 1 + 1 用心讨论,共获提升!
别了丶 + 1 + 1 用心讨论,共获提升!
lookerJ + 1 + 1 用心讨论,共获提升!
ban_op + 1 + 1 我很赞同!
whojeff + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Microooooogle + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
1750249993 + 1 + 1 用心讨论,共获提升!
90182si + 1 + 1 666啊!
惜亿网络 + 1 + 1 用心讨论,共获提升!
笙若 + 1 + 1 谢谢@Thanks!
xinkui + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
82ybF3UuGN0e + 1 + 1 我很赞同!
℡LOVE + 1 + 1 请速度更新
q75291722 + 1 + 1 应该是把手机一起放水里泡下才能发挥框架最大功能!
安逸2Amour + 1 无字天书啊 是不是得把屏幕放水里面泡一下啊

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

早早er 发表于 2018-4-20 13:01
麻烦楼主重新编辑一下好吗,更新了麻烦通知哈
acm79 发表于 2019-9-24 18:54
小白,参照大佬的过程实现了一下,安装完 apk 后发现 xposed 框架无法检测到,后自行搜索发现需要在AndroidMainfest.xml中application节点下添加类似如下语句:
[XML] 纯文本查看 复制代码
<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? ... 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
看不到内容
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-27 07:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表