[Xposed框架]Android Hook 菜鸟入门教程二
传送门 : Android Hook 菜鸟入门教程一上面是这个系列的第一篇
本教程用到工具
Android studio
神模拟器
Xposed框架
这次我们自己用Android Studio写一个简单的登录注册界面 在本地比较账号密码 代码如下
MainActivity.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参数
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
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);
XposedBridge.log("Passwd = " + param.args);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("---Hook End---");
XposedBridge.log("Uname = " + param.args);
XposedBridge.log("Passwd = " + param.args);
}
});
}
}
上面使用Xposed提供的findAndHookMethod直接进行MethodHook操作。
在其Hook回调中使用XposedBridge.log方法,将登陆的账号密码信息打印至Xposed的日志中。
编译 运行 安装 重启之后 我们打开目标APK 输入账号密码登录 然后查看一下日志
下面开始Hook test_02 Hook onClick方法 用来修改用户的登录信息演示而已
这个由于个人的粗心导致一下午都在百度 Google
由于菜鸟写登录APK的时候 etU 获取的密码输入框 etP获取的账号的输入框 Hook的时候想修改etU的值 为admin 碰巧我每次都输入密码的值为admin
刚好这样的巧合一直没发现问题,写代码能力太差 尴尬啊 已经修改过来了package com.kali.hooktest;
Hook onClick的代码 Tutorial.java
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都会在链接给出来
本帖最后由 XhyEax 于 2016-9-4 12:37 编辑
///交流区最好不要设置下载附件,占用论坛空间。
写的不错,是自己的写的例子。虽然简单,但还是支持下!
本来我刚准备写个Hook实例的帖子的,既然你发了那我就不发了。
就把我写的一点贴这里吧:(最基础的 最简单的)
beforeHookedMethod 主要用来读取和修改参数
afterHookedMethod 主要用来修改返回值以及查看修改是否生效
1.修改参数
(这里假定 Hook的方法参数只有一个 并且是String类型)
beforeHookedMethod 这样写:
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
String str = (String)param.; //获取第一个参数
String newstr = "changed string"
param. = newstr ; //修改第一个参数
XposedBridge.log("=====Hook Log: Change" +str+"into"+newstr );
}
2.修改返回值
(这里假定 Hook方法有返回值 并且是String类型)
afterHookedMethod 这样写:
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
String str = (String)param.getResult();//获取返回值
String newstr = "changed string";
param.setResult(newstr);//修改返回值
XposedBridge.log("=====Hook Log: Change Return" +str+"into"+newstr );
}
PS:直接写的 没用编辑器 可能代码跑不起来,自己修改下就行
顺便求评分~~
请问楼主知道怎么在Xposed里执行被hook程序中里面的方法吗?不是我们自己写的方法,而是程序本身自带的方法,我们hook住它的方法后,根据他参数我们进行判断然后来执行它的方法。
如果楼主会的话希望出一篇教程指导一下 XhyEax 发表于 2016-8-31 18:54
///交流区最好不要设置下载附件,占用论坛空间。
写的不错,是自己的写的例子。虽然简单,但还是支持下 ...
收到 学习了{:1_893:} login 发表于 2016-8-31 19:27
请问楼主知道怎么在Xposed里执行被hook程序中里面的方法吗?不是我们自己写的方法,而是程序本身自带的方 ...
这个用反编译来做 后面教程会给出的 很详细,辛苦了 login 发表于 2016-8-31 19:27
请问楼主知道怎么在Xposed里执行被hook程序中里面的方法吗?不是我们自己写的方法,而是程序本身自带的方 ...
hook其他程序的方法大同小异 确定要hook的方法所在类 参数就行了 mark 菜鸟学习中 谢谢,自己也玩了一下