kali-cc 发表于 2016-8-31 18:37

[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-8-31 18:54

本帖最后由 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:直接写的 没用编辑器 可能代码跑不起来,自己修改下就行
顺便求评分~~


login 发表于 2016-8-31 19:27

请问楼主知道怎么在Xposed里执行被hook程序中里面的方法吗?不是我们自己写的方法,而是程序本身自带的方法,我们hook住它的方法后,根据他参数我们进行判断然后来执行它的方法。

如果楼主会的话希望出一篇教程指导一下

kali-cc 发表于 2016-9-1 09:02

XhyEax 发表于 2016-8-31 18:54
///交流区最好不要设置下载附件,占用论坛空间。

写的不错,是自己的写的例子。虽然简单,但还是支持下 ...

收到 学习了{:1_893:}

kali-cc 发表于 2016-9-1 09:05

login 发表于 2016-8-31 19:27
请问楼主知道怎么在Xposed里执行被hook程序中里面的方法吗?不是我们自己写的方法,而是程序本身自带的方 ...

这个用反编译来做 后面教程会给出的

盈盈一水间cc 发表于 2016-9-1 09:14

很详细,辛苦了

XhyEax 发表于 2016-9-1 12:35

login 发表于 2016-8-31 19:27
请问楼主知道怎么在Xposed里执行被hook程序中里面的方法吗?不是我们自己写的方法,而是程序本身自带的方 ...

hook其他程序的方法大同小异 确定要hook的方法所在类 参数就行了

pxf15888100343 发表于 2016-9-1 12:40

ABCD 发表于 2016-9-2 00:33

mark   菜鸟学习中

PJ头狼 发表于 2016-9-2 15:35

谢谢,自己也玩了一下
页: [1] 2 3
查看完整版本: [Xposed框架]Android Hook 菜鸟入门教程二