吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 31811|回复: 28
收起左侧

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

[复制链接]
kali-cc 发表于 2016-8-31 18:37
传送门 : [Xposed框架]Android Hook 菜鸟入门教程一

上面是这个系列的第一篇

本教程用到工具

    Android studio
    神模拟器
    Xposed框架


这次我们自己用Android Studio写一个简单的登录注册界面 在本地比较账号密码 代码如下
MainActivity.java

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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] 纯文本查看 复制代码
1
2
3
private boolean isOK(String uname, String pass) {
        return uname.equals(Uname)&&pass.equals(Passw);
    }


截图如下:

11_1.png
登录跳转
11_2.png


下面开始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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 输入账号密码登录 然后查看一下日志

11_3.png


下面开始Hook test_02 Hook onClick方法 用来修改用户的登录信息  演示而已


这个由于个人的粗心  导致一下午都在百度 Google


由于菜鸟写登录APK的时候 etU 获取的密码输入框 etP获取的账号的输入框 Hook的时候想修改etU的值 为admin 碰巧我每次都输入密码的值为admin
刚好这样的巧合一直没发现问题,写代码能力太差 尴尬啊 已经修改过来了
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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());
 
                    }
                });
    }
}




截图如下

11_46.png

第一个 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] 纯文本查看 复制代码
1
2
3
4
5
6
7
                   @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] 纯文本查看 复制代码
1
2
3
4
5
6
7
@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
///交流区最好不要设置下载附件,占用论坛空间。

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

收到 学习了
 楼主| 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
谢谢,自己也玩了一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-1 20:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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