传送门 : [Xposed框架]Android Hook 菜鸟入门教程一
上面是这个系列的第一篇
本教程用到工具
Android studio
神模拟器
Xposed框架
这次我们自己用Android Studio写一个简单的登录注册界面 在本地比较账号密码 代码如下
MainActivity.java
[Java] 纯文本查看 复制代码 package com.kali.login;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private final String Uname = "admin";
private final String Passw = "admin";
private EditText etU , etP;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etU = (EditText)findViewById(R.id.editText);
etP = (EditText) findViewById(R.id.editText2);
findViewById(R.id.btnStart).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,TheActivity.class);
Bundle b = new Bundle();
b.putString("uname",etU.getText().toString());
b.putString("passwd",etP.getText().toString());
i.putExtras(b);
if (isOK(etU.getText().toString(),etP.getText().toString())){
Toast.makeText(MainActivity.this,"Login Success !" , Toast.LENGTH_SHORT).show();
startActivity(i);
}else{
Toast.makeText(MainActivity.this,"Login Wrong Check And Again !" , Toast.LENGTH_SHORT).show();
}
}
});
}
private boolean isOK(String uname, String pass) {
return uname.equals(Uname)&&pass.equals(Passw);
}
}
我们要Hook的就是MainActivity中的isOK方法:里面两个String参数
[Java] 纯文本查看 复制代码 private boolean isOK(String uname, String pass) {
return uname.equals(Uname)&&pass.equals(Passw);
}
截图如下:
登录跳转
下面开始Hook test_01 Hook isOK方法
直接拿上个教程编写好的APK 其他的不用改 只修改Tutorial.java
模块编写步骤 - 实现 IXposedHookLoadPackage接口
- 指定要 hook 的包名
- 判断当前加载的包是否是指定的包
- 指定要 hook 的方法名
- 实现beforeHookedMethod方法和afterHookedMethod方法(hook的具体功能)
当然首先是要分析目标APK的上面很容易看出来是登陆界面上面的用户信息都是存储在EditText控件上,
然后点击Login通过isOK 方法进行比较,去验证账号与密码是否正确,这样我们只要Hook这个方法就能劫持到账号密码。
使用Xposed进行Hook操作主要就是使用到了Xposed中的两个比较重要的方法,
handleLoadPackage获取包加载时候的回调并拿到其对应的classLoader;
findAndHookMethod对指定类的方法进行Hook。
主要代码Tutorial.java
[Java] 纯文本查看 复制代码 package com.kali.hooktest;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class Tutorial implements IXposedHookLoadPackage {
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
// 将包名不是 com.kali.login 的应用剔除掉
if (!lpparam.packageName.equals("com.kali.login"))
return;
XposedBridge.log("Loaded app: " + lpparam.packageName);
// Hook isOk 方法
findAndHookMethod("com.kali.login.MainActivity", lpparam.classLoader, "isOK", String.class,
String.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("---Hook Start---");
XposedBridge.log("Uname = " + param.args[0]);
XposedBridge.log("Passwd = " + param.args[1]);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("---Hook End---");
XposedBridge.log("Uname = " + param.args[0]);
XposedBridge.log("Passwd = " + param.args[1]);
}
});
}
}
上面使用Xposed提供的findAndHookMethod直接进行MethodHook操作。
在其Hook回调中使用XposedBridge.log方法,将登陆的账号密码信息打印至Xposed的日志中。
编译 运行 安装 重启之后 我们打开目标APK 输入账号密码登录 然后查看一下日志
下面开始Hook test_02 Hook onClick方法 用来修改用户的登录信息 演示而已
这个由于个人的粗心 导致一下午都在百度 Google
由于菜鸟写登录APK的时候 etU 获取的密码输入框 etP获取的账号的输入框 Hook的时候想修改etU的值 为admin 碰巧我每次都输入密码的值为admin
刚好这样的巧合一直没发现问题,写代码能力太差 尴尬啊 已经修改过来了 [Java] 纯文本查看 复制代码 package com.kali.hooktest;
[/align]Hook onClick的代码 [color=#000][backcolor=rgb(228, 228, 255)][font=宋体][size=12px]Tutorial.java[/size][/font][/backcolor][/color]
[color=#000][backcolor=rgb(228, 228, 255)][font=宋体][size=12px]
[/size][/font][/backcolor][/color]
[align=left]
import android.view.View;
import android.widget.EditText;
import java.lang.reflect.Field;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class Tutorial implements IXposedHookLoadPackage {
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
// 将包名不是 com.kali.login 的应用剔除掉
if (!lpparam.packageName.equals("com.kali.login"))
return;
XposedBridge.log("Loaded app: " + lpparam.packageName);
// Hook isOk 方法
findAndHookMethod("com.kali.login.MainActivity", lpparam.classLoader, "onClick", View.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Class clazz = param.thisObject.getClass();
XposedBridge.log("class name:"+clazz.getName());
// 通过类的字节码得到该类中声明的所有属性,无论私有或公有
Field field = clazz.getDeclaredField("etU");
// 设置访问权限(这点对于有过android开发经验的可以说很熟悉)
field.setAccessible(true);
EditText username = (EditText) field.get(param.thisObject);
// 设置账号
username.setText("admin");
XposedBridge.log("uname = " + username.getText().toString());
}
});
}
}
截图如下
第一个 uname 是修改前 第二个 uname是修改后
这样就能实现 在afterHook之后修改username 为admin 当然也可以在beforeHookedMethod 里面写 没什么实际意义 就不写了达到目的就行了
代码和login.apk都会在链接给出来
1.txt
(48 Bytes, 下载次数: 244)
|