本帖最后由 xihuyu2000 于 2018-4-20 15:34 编辑
我是刚学习了一个月的纯小白,看了诸位大神的帖子,受益匪浅,把自己使用Xposed的经验分享一下,希望大家多多指教。
首先下载并安装Xposed。这个东西百度很多,很容易找的。我在模拟器中安装的效果如下图。
接下来开发一个android程序,具体操作可以参考丑小鸭大神的文章https://www.52pojie.cn/thread-648530-1-1.html。写的非常棒,我就是照的学习的,写出了我的第一个安卓小例子,感谢丑小鸭大神【大神看到我称呼他丑小鸭,会不会生气啊】。
我的页面如下图
代码如下
[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目录下。
在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同一个目录吧。
类中的代码贴出来,如下,尽可能的做了一些注释。
[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拖到模拟器,会自动安装,弹出下面的窗口。
点击最上面的未激活,弹出窗口,打勾。打勾后立刻弹出一个信息框,提示重启后才能生效,所以我们重启模拟器。
重启后,打开我们的app,输入信息,点击登录,竟然弹出“登录成功”提示框。
前面的登录代码中,明明要求都输入123,才提示成功。这里我们明显输入错误,为什么提示成功?
原因就是在Xposed中的beforeHookedMethod方法的最后2行,对参数重新赋值为123了。当真正调用checkLogin的时候,参数就变为123了,自然登录成功。
也就是说无论用户如何输入,都会提示登录成功。
这就是xposed的强大之处!!!!!
下面是打印的日志
可以印证参数被xposed修改了。
项目代码百度盘链接:https://pan.baidu.com/s/1Fr4WLOB96tC12B-7E44KfA 密码:slg7
自己的经验还太少,欢迎大家继续分享!!
另外,自己在签名验证方面很薄弱,如何深入哪?希望大家不吝赐教!
【第一次发帖,很紧张,也无法预览效果,排版不好,而且重新编辑两次,大家多多包涵!】
|