Code Monkey home page Code Monkey logo

zhooklib's Introduction

ZHookLib

A java hook library for android, it contains a so and a jar file.

And the part of the code copy from xposed

It is compatible with android 2.3-4.4.

The art mode support will come soon!

API:

com.morgoo.hook.zhook.ZHook class:

Hook method:

public static MethodHook.Unhook hookMethod(Member hookMethod, MethodHook callback)
    
public static Set<MethodHook.Unhook> hookAllMethods(Class<?> hookClass,
		String methodName, MethodHook callback)
		
public static MethodHook.Unhook findAndHookMethod(Class<?> clazz,
		String methodName, Object... parameterTypesAndCallback)
		
public static MethodHook.Unhook findAndHookMethod(String className,
		ClassLoader classLoader, String methodName,
		Object... parameterTypesAndCallback)

Hook constructor:

public static Set<MethodHook.Unhook> hookAllConstructors(
		Class<?> hookClass, MethodHook callback)           

Check method has been or not hooked:

public static boolean isMethodHooked(Member method)

unhook:

public static void unhookMethod(Member hookMethod, MethodHook callback)

invoke original method:

public static Object invokeOriginalMethod(Member method, Object thisObject,
		Object[] args)

sample:

Define a class in HookTest.java:

public class HookTest{
    
    private static final String TAG = HookTest.class.getSimpleName();
    
    public HookTest() {
        Log.e(TAG,"Create");
    }

    private int test(int i) {
        Log.e(TAG, "i am in test(int i) re=" + i);
        return i;
    }

    private int test(int i, String t) {
        Log.e(TAG, "i am in test(int i, String t) re=" + i + ",t=" + t);
        return i;
    }

    private String test(String t) {
        Log.e(TAG, "i am in test(String t) t=" + t);
        return t;
    }

    private void test(String t, int i) {
        Log.e(TAG, "i am in test(String t, int i) t=" + t);
    } 
}

and write a main method for test:

 public static void main() {
    MethodHook callback = new MethodHook() {
        @Override
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
            super.beforeHookedMethod(param);
            Log.e("HookTest", "beforeHookedMethod " + param.method);
        }

        @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            super.afterHookedMethod(param);
            Object result = param.getResult();
            if (result instanceof String) {
                param.setResult("MyResult");
                Log.e("HookTest",
                        "afterHookedMethod " + param.method + ",getThrowable="
                                + param.getThrowable() + " we fake result as MyResult");
            } else if ((result instanceof Integer)) {
                param.setResult(1986);
                Log.e("HookTest",
                        "afterHookedMethod " + param.method + ",getThrowable="
                                + param.getThrowable() + " we fake result as 1986");
            } else {
                Log.e("HookTest",
                        "afterHookedMethod " + param.method + ",getResultOrThrowable="
                                + param.getResultOrThrowable());
            }

        }
    };
    
    
    Set<Unhook> unhooks1 = ZHook.hookAllConstructors(HookTest.class, callback);
    Set<Unhook> unhooks2 = ZHook.hookAllMethods(HookTest.class, "test", callback);

    HookTest hookTest = new HookTest();
    String msg1 = "i am run on hook: test(1) result=" + hookTest.test(1);
    Log.e("HookTest", msg1);

    String msg2 = "i am run on hook: test(1,fdfdf) result=" + hookTest.test(1, "fdfdf");
    Log.e("HookTest", msg2);

    String msg3 = "i am run on hook: test(1,fdfdf) result=" +
            hookTest.test("fdfdf");
    Log.e("HookTest", msg3);

    hookTest.test("fdfdf", 1);
    String msg4 = "i am run on hook: test(fdfdf,1) result=void";
    Log.e("HookTest", msg4);

    for (Unhook unhook : unhooks1) {
        unhook.unhook();
    }

    for (Unhook unhook : unhooks2) {
        unhook.unhook();
    }

    Log.e("HookTest", "i am run after unhook: test1(1) re=" + hookTest.test(1));
    Log.e("HookTest", "i am run after unhook: test1(1,fdfdf) re=" + hookTest.test(1, "fdfdf"));
    Log.e("HookTest", "i am run after unhook: test1(1,fdfdf) re=" + hookTest.test("fdfdf"));

}

zhooklib's People

Contributors

cmzy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zhooklib's Issues

Xiaomi 2S Hook: java.lang.UnsupportedOperationException: This device not be supported

在小米2s真机(MIUI8 6.11.10开发版)上测试时,报如下错误:
12-07 16:42:17.534 8205-8205/com.cloudpush.baidu.test I/BroadcastHook﹕ 开始Hook sendBroadcast() 方法 12-07 16:42:17.544 8205-8205/com.cloudpush.baidu.test D/AndroidRuntime﹕ Shutting down VM 12-07 16:42:17.554 8205-8205/com.cloudpush.baidu.test E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.cloudpush.baidu.test, PID: 8205 java.lang.UnsupportedOperationException: This device not be supported at com.morgoo.hook.zhook.ZHook.checkSupported(ZHook.java:71) at com.morgoo.hook.zhook.ZHook.hookAllMethods(ZHook.java:272) at com.baidu.push.example.BroadcastHook.hookSendBroadcast(BroadcastHook.java:20) at com.baidu.push.example.PushDemoActivity.onClick(PushDemoActivity.java:191) at android.view.View.performClick(View.java:4760) at android.view.View$PerformClick.run(View.java:19779) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5248) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

请教大神,为什么我运行Demo的时候会出现这个错误Could not find class 'com.morgoo.myjavahook.HookTest$1',

06-11 19:45:25.777: E/dalvikvm(6271): Could not find class 'com.morgoo.myjavahook.HookTest$1', referenced from method com.morgoo.myjavahook.HookTest.main
06-11 19:45:25.783: E/AndroidRuntime(6271): FATAL EXCEPTION: main
06-11 19:45:25.783: E/AndroidRuntime(6271): Process: com.morgoo.zhooklib, PID: 6271
06-11 19:45:25.783: E/AndroidRuntime(6271): java.lang.NoClassDefFoundError: com.morgoo.myjavahook.HookTest$1
06-11 19:45:25.783: E/AndroidRuntime(6271): at com.morgoo.myjavahook.HookTest.main(HookTest.java:57)
06-11 19:45:25.783: E/AndroidRuntime(6271): at com.morgoo.myjavahook.MainActivity.onCreate(MainActivity.java:20)
06-11 19:45:25.783: E/AndroidRuntime(6271): at android.app.Activity.performCreate(Activity.java:5477)
06-11 19:45:25.783: E/AndroidRuntime(6271): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090)
06-11 19:45:25.783: E/AndroidRuntime(6271): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2321)
06-11 19:45:25.783: E/AndroidRuntime(6271): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2418)
06-11 19:45:25.783: E/AndroidRuntime(6271): at android.app.ActivityThread.access$800(ActivityThread.java:151)
06-11 19:45:25.783: E/AndroidRuntime(6271): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
06-11 19:45:25.783: E/AndroidRuntime(6271): at android.os.Handler.dispatchMessage(Handler.java:110)
06-11 19:45:25.783: E/AndroidRuntime(6271): at android.os.Looper.loop(Looper.java:193)
06-11 19:45:25.783: E/AndroidRuntime(6271): at android.app.ActivityThread.main(ActivityThread.java:5365)
06-11 19:45:25.783: E/AndroidRuntime(6271): at java.lang.reflect.Method.invokeNative(Native Method)
06-11 19:45:25.783: E/AndroidRuntime(6271): at java.lang.reflect.Method.invoke(Method.java:515)
06-11 19:45:25.783: E/AndroidRuntime(6271): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
06-11 19:45:25.783: E/AndroidRuntime(6271): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
06-11 19:45:25.783: E/AndroidRuntime(6271): at dalvik.system.NativeStart.main(Native Method)

so cannot load

01-04 07:41:45.335: W/System.err(2611): java.lang.NoSuchMethodError: dvmIsPrimitiveClassComp not found in libdvm.so
01-04 07:41:45.336: W/System.err(2611): at com.morgoo.hook.NativeHelper.nativeHe(Native Method)
01-04 07:41:45.336: W/System.err(2611): at com.morgoo.hook.NativeHelper.(NativeHelper.java:22)
01-04 07:41:45.336: W/System.err(2611): at com.morgoo.hook.zhook.ZHook.hookMethod(ZHook.java:179)
01-04 07:41:45.336: W/System.err(2611): at com.morgoo.hook.zhook.ZHook.hookAllConstructors(ZHook.java:225)
01-04 07:41:45.336: W/System.err(2611): at com.morgoo.myjavahook.HookTest.main(HookTest.java:87)
01-04 07:41:45.336: W/System.err(2611): at com.morgoo.myjavahook.MainActivity.onCreate(MainActivity.java:20)
01-04 07:41:45.336: W/System.err(2611): at android.app.Activity.performCreate(Activity.java:5393)
01-04 07:41:45.336: W/System.err(2611): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
01-04 07:41:45.336: W/System.err(2611): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2501)
01-04 07:41:45.336: W/System.err(2611): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2589)
01-04 07:41:45.337: W/System.err(2611): at android.app.ActivityThread.access$800(ActivityThread.java:169)
01-04 07:41:45.337: W/System.err(2611): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1513)
01-04 07:41:45.337: W/System.err(2611): at android.os.Handler.dispatchMessage(Handler.java:110)
01-04 07:41:45.337: W/System.err(2611): at android.os.Looper.loop(Looper.java:193)
01-04 07:41:45.337: W/System.err(2611): at android.app.ActivityThread.main(ActivityThread.java:5521)
01-04 07:41:45.337: W/System.err(2611): at java.lang.reflect.Method.invokeNative(Native Method)
01-04 07:41:45.337: W/System.err(2611): at java.lang.reflect.Method.invoke(Method.java:515)
01-04 07:41:45.337: W/System.err(2611): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:837)
01-04 07:41:45.337: W/System.err(2611): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653)
01-04 07:41:45.338: W/System.err(2611): at dalvik.system.NativeStart.main(Native Method)

android hook Handler 的dispatchMessage方法的时候没有执行originalMethod

hi,你好。最近在用你的zhooklib的时候遇到一个问题,我的项目在Application onCreate的时候开始hook 系统Handler的dispatchMessage方法,普通的message都可以hook成功,但是在执行一个wifiManager的serviceHandler的dispatchmessage的时候,虽然执行了beforeHookedMethod,但是之后并没有执行原来的dispatchmessage,导致主线程一直在wait产生ANR。简单debug了一下,发现beforeHookMethod并没有抛出异常,不同的是这个handler是执行的远程服务的回调消息,不知道会不会跟这个有关,因为看不到so的代码所以也不好猜测只好来询问一下。谢谢!

请教大神so如何在android8下编译?

之前也拷了xposed hook部分源码,做了个类似的工具,用作服务器动态下发代码.
不过只能在anrdoid15下编译.android8下有各种编译问题,一直没有搞定

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.