• 使用Cydia Substrate Hook Android Java世界


    从来没接触过Android的HOOK,在看雪上找到了一篇HOOK 的文章,但是太复杂了,应该是本地环境问题,测试不成功。

    后来搜到Cydia Substrate,看了几篇文章,进入官网查看了一下文档,简直是神器,HOOK过程简洁,总共就几个关键API,使用起来特别方便。

    于是在blog记录一下。

    一、手机端配置

    1.手机必须Root,我这里使用的是模拟器。(安利一波Genymotion模拟器,太好用了)

    2.下载cydiasubstrate APK。(官网下载地址

    二、测试代码

    使用官网提供的例子。字少图多,我就不重述了。写下几个我遇到的错误:

    1.新建安卓工程时不要默认添加的Activity。

    2.Manifest文件application段的meta-data必须填写。

    3.manifest节点需要填写package(官网没填写package,可能是eclipse版本问题,我装的eclipse默认填写了package,并且不可删除),主函数所在文件必须在这个package下,否则代码不会执行。

    4.无论更新HOOK,还是卸载HOOK,最好都重启一下手机。(再次安利一波Genymotion模拟器,重启速度太快了)

    三、效果图

    image

    四、附件

    Manifest文件

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.cydiahookjava"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <application android:label="@string/app_name" >
            <meta-data
                android:name="com.saurik.substrate.main"
                android:value=".Main" />
        </application>
    
        <uses-permission android:name="cydia.permission.SUBSTRATE" />
    
    </manifest>

    Java文件

    package com.example.cydiahookjava;
    
    import java.lang.reflect.Method;
    
    import com.saurik.substrate.MS;
    
    public class Main {
        static void initialize() {
            MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {
                public void classLoaded(Class<?> resources) {
                    Method getColor;
                    try {
                        getColor = resources.getMethod("getColor", Integer.TYPE);
                    } catch (NoSuchMethodException e) {
                        getColor = null;
                    }
    
                    if (getColor != null) {
                        final MS.MethodPointer old = new MS.MethodPointer();
    
                        MS.hookMethod(resources, getColor, new MS.MethodHook() {
                            public Object invoked(Object resources, Object... args) throws Throwable {
                                //先调用原函数
                                int color = (Integer) old.invoke(resources, args);
                                //再修改返回值
                                return color & ~0x0000ff00 | 0x00ff0000;
                            }
                        }, old);
                    }
                }
            });
        }
    }

    测试工程下载地址

  • 相关阅读:
    listener中@Autowired无法注入bean的一种解决方法
    PBKDF2加密的实现
    springmvc集成shiro后,session、request是否发生变化
    java加密解密工具类
    springMVC中controller层方法中使用private和public问题
    密码强度正则表达式 – 必须包含大写字母,小写字母和数字,至少8个字符等
    Java判断两个时间相差的天数
    Java中Date、String、Calendar类型之间的转化
    JavaScript前端和Java后端的AES加密和解密(转)
    JS前端加密JAVA后端解密详解
  • 原文地址:https://www.cnblogs.com/Reyzal/p/5203238.html
Copyright © 2020-2023  润新知