吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 31471|回复: 28
上一主题 下一主题
收起左侧

[Android 原创] [Xposed框架]Android Hook 菜鸟入门教程二

[复制链接]
跳转到指定楼层
楼主
kali-cc 发表于 2016-8-31 18:37 回帖奖励
传送门 : [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)

















点评

交流区建议不要设置附件下载,占用论坛空间。(个人看法)  发表于 2016-8-31 19:08

免费评分

参与人数 6威望 +1 吾爱币 +1 热心值 +5 收起 理由
hxq835900040 + 1 附件也没有了
Looke + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Xyzzz + 1 谢谢@Thanks!
qtfreet00 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
茶城兄弟 + 1 在这一个方面,你是我的老师。
XhyEax + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

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

推荐
XhyEax 发表于 2016-8-31 18:54
本帖最后由 XhyEax 于 2016-9-4 12:37 编辑

///交流区最好不要设置下载附件,占用论坛空间。

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



本来我刚准备写个Hook实例的帖子的,既然你发了那我就不发了。

就把我写的一点贴这里吧:(最基础的 最简单的)

beforeHookedMethod 主要用来读取和修改参数
afterHookedMethod 主要用来修改返回值以及查看修改是否生效

1.修改参数
(这里假定 Hook的方法参数只有一个 并且是String类型)
beforeHookedMethod 这样写:
[Java] 纯文本查看 复制代码
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
 String str = (String)param.[0]; //获取第一个参数
  String newstr = "changed string"
 param.[0] = newstr ; //修改第一个参数
  XposedBridge.log("=====Hook Log: Change" +str+"into"+newstr );
                    }



2.修改返回值
(这里假定 Hook方法有返回值 并且是String类型)
afterHookedMethod 这样写:
[Java] 纯文本查看 复制代码
      @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:直接写的 没用编辑器 可能代码跑不起来,自己修改下就行
顺便求评分~~


3#
login 发表于 2016-8-31 19:27
请问楼主知道怎么在Xposed里执行被hook程序中里面的方法吗?  不是我们自己写的方法,而是程序本身自带的方法,我们hook住它的方法后,根据他参数我们进行判断然后来执行它的方法。

如果楼主会的话希望出一篇教程指导一下
4#
 楼主| kali-cc 发表于 2016-9-1 09:02 |楼主
XhyEax 发表于 2016-8-31 18:54
///交流区最好不要设置下载附件,占用论坛空间。

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

收到 学习了
5#
 楼主| kali-cc 发表于 2016-9-1 09:05 |楼主
login 发表于 2016-8-31 19:27
请问楼主知道怎么在Xposed里执行被hook程序中里面的方法吗?  不是我们自己写的方法,而是程序本身自带的方 ...

这个用反编译来做 后面教程会给出的
6#
盈盈一水间cc 发表于 2016-9-1 09:14
很详细,辛苦了
7#
XhyEax 发表于 2016-9-1 12:35
login 发表于 2016-8-31 19:27
请问楼主知道怎么在Xposed里执行被hook程序中里面的方法吗?  不是我们自己写的方法,而是程序本身自带的方 ...

hook其他程序的方法大同小异 确定要hook的方法所在类 参数就行了
头像被屏蔽
8#
pxf15888100343 发表于 2016-9-1 12:40 来自手机
提示: 作者被禁止或删除 内容自动屏蔽
9#
ABCD 发表于 2016-9-2 00:33
mark   菜鸟学习中
10#
PJ头狼 发表于 2016-9-2 15:35
谢谢,自己也玩了一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 09:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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