🔥 bhook(aka ByteHook) is a PLT hook framework for Android app.

bhook

README 中文版

bhook(aka ByteHook) is a PLT hook framework for Android app.

Most of ByteDance's Android apps use bhook as the PLT hook solution online.

Features

  • Multiple hooks and unhooks for the same function do not conflict with each other.
  • Hook a single, partial or all of the dynamic libraries in the process.
  • Hook the newly loaded dynamic libraries automatically.
  • Avoid recursive-calls and circular-calls between proxy functions automatically.
  • Support unwinding backtrace in proxy function.
  • Support Android 4.1 - 12 (API level 16 - 31).
  • Support armeabi-v7a, arm64-v8a, x86 and x86_64.
  • MIT licensed.

Usage

1. Add dependency in build.gradle

bhook is published on Maven Central, and uses Prefab package format for native dependencies, which is supported by Android Gradle Plugin 4.0+.

allprojects {
    repositories {
        mavenCentral()
    }
}
android {
    buildFeatures {
        prefab true
    }
}

dependencies {
    implementation 'com.bytedance:bytehook:1.0.0'
}

2. Add dependency in CMakeLists.txt or Android.mk

CMakeLists.txt

find_package(bytehook REQUIRED CONFIG)

add_library(mylib SHARED mylib.c)
target_link_libraries(mylib bytehook::bytehook)

Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE           := mylib
LOCAL_SRC_FILES        := mylib.c
LOCAL_SHARED_LIBRARIES += bytehook
include $(BUILD_SHARED_LIBRARY)

$(call import-module,prefab/bytehook)

3. Specify one or more ABI(s) you need

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }
    }
}

4. Add packaging options

If you are using bhook in an SDK project, you may need to avoid packaging libbytehook.so into your AAR, so as not to encounter duplicate libbytehook.so file when packaging the app project.

android {
    packagingOptions {
        exclude '**/libbytehook.so'
    }
}

On the other hand, if you are using bhook in an APP project, you may need to add some options to deal with conflicts caused by duplicate libbytehook.so file.

android {
    packagingOptions {
        pickFirst '**/libbytehook.so'
    }
}

5. Initialize

import com.bytedance.android.bytehook.ByteHook;

public class MySdk {
    public static synchronized void init() {
        ByteHook.init();
    }
}

6. Hook and Unhook

#include "bytehook.h"
bytehook_stub_t bytehook_hook_single(
    const char *caller_path_name,
    const char *callee_path_name,
    const char *sym_name,
    void *new_func,
    bytehook_hooked_t hooked,
    void *hooked_arg);

bytehook_stub_t bytehook_hook_partial(
    bytehook_caller_allow_filter_t caller_allow_filter,
    void *caller_allow_filter_arg,
    const char *callee_path_name,
    const char *sym_name,
    void *new_func,
    bytehook_hooked_t hooked,
    void *hooked_arg);

bytehook_stub_t bytehook_hook_all(
    const char *callee_path_name,
    const char *sym_name,
    void *new_func,
    bytehook_hooked_t hooked,
    void *hooked_arg);

int bytehook_unhook(bytehook_stub_t stub);

These three hook functions are used to hook single, partial, and all caller dynamic libraries in the process.

Notice:

  • If you need to call the original function in the proxy function, please always use the BYTEHOOK_CALL_PREV() macro.
  • Make sure to call BYTEHOOK_POP_STACK() macro before proxy function returning. In the CPP source file, you can also call BYTEHOOK_STACK_SCOPE() macro at the beginning of the proxy function instead.
  • bhook proxies dlopen() and android_dlopen_ext() internally, so please do not try to hook these two functions. If you want to monitor the loading of ELF, please use bytehook_add_dlopen_callback() and bytehook_del_dlopen_callback().

There is a sample app in the bytehook-sample folder you can refer to.

Contributing

Contributing Guide

License

MIT License

Owner
Comments
  • 请问安卓9的open函数hook不到是什么原因。同样代码安卓10是没有问题的。

    请问安卓9的open函数hook不到是什么原因。同样代码安卓10是没有问题的。

    Android层测试代码: File file = new File("/storage/emulated/0/1.txt"); try { FileInputStream fileInputStream = new FileInputStream(file); byte[] buf = new byte[(int)file.length()]; fileInputStream.read(buf); fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); }

    c层hook代码: bytehook_hook_single("libjavacore.so", NULL, "open", open_proxy, open_hooked_callback, NULL); bytehook_hook_single("libjavacore.so", NULL, "stat", stat_proxy, stat_hooked_callback, NULL); bytehook_hook_single("libjavacore.so", NULL, "read", read_proxy_auto, read_hooked_callback, NULL);

    安卓9的回调显示hook成功了。 bytehook_tag: >>>>> hooked. stub: c6b93ac0, status: 0, caller_path_name: /system/lib/libjavacore.so, sym_name: open, new_func: c5e08ebd, prev_func: e756aefd, arg: 0 安卓10的回调也类似。 bytehook_tag: >>>>> hooked. stub: ba5d3480, status: 0, caller_path_name: /apex/com.android.runtime/lib/libjavacore.so, sym_name: open, new_func: c04afebd, prev_func: edaa2299, arg: 0 但是实际测试中在open入口打印,只有安卓10的设备有响应。 LOG("open hooked path("%s")", pathname);

  • 通过hook pthread_create 来获取(java+native)线程的创建,但是有大部分的线程没有被hook到,是什么原因呢?

    通过hook pthread_create 来获取(java+native)线程的创建,但是有大部分的线程没有被hook到,是什么原因呢?

    在应用启动的时候开始hook,还是有大部分的线程没有被hook到,是什么原因呢? bytehook_hook_all(nullptr, "pthread_create", reinterpret_cast<void*>(pthread_create_hook), nullptr,nullptr);

  • Android 11 没有命中自己App中加载的so

    Android 11 没有命中自己App中加载的so

    bytehook Version

    1.0.5

    Android OS Version

    11

    Android ABIs

    arm64-v8a

    Device Manufacturers and Models

    oppo

    Describe the Bug

    df702b1fadb03cf625d6cb43ef172f1

    我使用bhook去hook自己加载的另一个so,发现没有hook到,map中没找到这个so,pc命中的是base.apk,打印bhook中的bh_elf_manager_iterate_cb,没看到这个so,这个是Android 11的特性?

  • 关于符号查找的一个小建议

    关于符号查找的一个小建议

    https://github.com/bytedance/bhook/blob/19f99d96c5e561b8e3598498024ef1285ee59c83/bytehook/src/main/cpp/bh_elf.c#L499

    大佬,你好 关于符号的查找,个人觉得xhook的写法更好: 布隆过滤器对于item存在是有误判的,但对于item不存在是有精准保障的。 所以存在gnu_hash段、sym_name确实不存在于gnu_hash布隆过滤器时,不应该继续查找。

  • 有人遇到开启hook后native heap明显增加的问题吗

    有人遇到开启hook后native heap明显增加的问题吗

    bytehook Version

    1.0.0

    Android OS Version

    10.0

    Android ABIs

    armeabi-v7a, arm64-v8a

    Device Manufacturers and Models

    oppo r17

    Describe the Bug

    用一个demo应用跑的。hook的是mmap malloc等函数。 跳板函数仅调用了BYTEHOOK_STACK_SCOPE 和BYTEHOOK_CALL_PREV。 但是开启后heap native增加了非常多。在真实项目中更明显,多了大几百M 未开启hook image

    开启hook image

  • android 4.4 等版本找不到符号 sigfillset

    android 4.4 等版本找不到符号 sigfillset

    hi: 之前使用 xhook,看到推荐准备使用 bhook。我看介绍说是支持 android 5 一下的版本的。但是在实际运行过程中出现问题: cannot locate symbol "sigfillset"

    我看代码的确是使用了 sigfillset,网上看了下这个符号是在 android 5 才引入。所以是不是 bhook 其实只支持 android 5 及其以上版本?

  • 夜神模拟器跑unity应用,hook libunity.so

    夜神模拟器跑unity应用,hook libunity.so

    我现在在夜神模拟器7.0.0.8 32位上跑bhook,hook了libunity的fseek函数或者其他函数,fopen等等。我单纯调用bytehook_init没问题,但是一旦调用了bytehook_hook_single去hook函数,也是显示hook成功的,但是后面就闪退了: 2021-12-17 12:12:00.127 5510-5510/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xfff33011 in tid 5510 (xxx.xxx.xxx) 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: Build fingerprint: 'samsung/dream2qltezh/dream2qltechn:7.1/N2G48H/G9550ZHU1AQEE:user/release-keys' 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: Revision: '12' 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: ABI: 'x86' 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: pid: 5510, tid: 5510, name: xxx.xxx.xxx >>> xxx.xxx.xxx <<< 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xfff33011 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: eax f66d4127 ebx 98724ff4 ecx 00000001 edx fff32e99 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: esi 989a720c edi fff32e99 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: xcs 00000073 xds 0000007b xes 0000007b xfs 0000003b xss 0000007b 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: eip 984fa373 ebp 988c67e4 esp bfa9c334 flags 00010282 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: backtrace: 2021-12-17 12:12:00.133 5567-5567/? A/DEBUG: #00 pc 00238373 /system/lib/libhoudini.so

    我的应用是只打了arm32和arm64的,没打x86,在模拟器上应该是跑的arm32。应该是libhoudini.so转码导致的。用你的demo只打arm32和arm64,在模拟器上跑却没问题。

  • @caikelun hook时机

    @caikelun hook时机

    @caikelun 感谢回复!这两天我尝试了一下,但没有找到比较好的方案。 原因是linker内部的dl_iterate_phdr和dlopen是有互斥锁的,而.init和.init_array调用是在dlopen内部,所以直到dlopen结束前是无法读取到elf的 😭

    是否可以从导出符号__dl__ZN6soinfo17call_constructorsEv入手

  • 老哥,BYTESIG_TRY好像不能生效

    老哥,BYTESIG_TRY好像不能生效

    bytehook Version

    1.0.6

    Android OS Version

    13

    Android ABIs

    arm64-v8a

    Device Manufacturers and Models

    Pixel 5

    Describe the Bug

    老哥,我尝试使用BYTESIG_TRY,发现不能捕获异常,下面是我的测试代码

    void init_once(void) {
    //    bytesig_init(SIGSEGV);
    //    bytesig_init(SIGBUS);
    //    bytesig_init(SIGILL);
        bytesig_init(SIGTRAP);
        // ......
    }
    
    void crashTest1(void) {
        int i;
        init_once();
        LOG("crashTest");
        int *p = NULL;
        BYTESIG_TRY(SIGABRT)
                {
    //                call_some_native_function();
                    *p = 2;
                }
            BYTESIG_CATCH(signum, code)
                {
                    LOG("signum %d (code %d)", signum, code);
                }
                BYTESIG_EXIT
    }
    

    使用这测试代码后,发现还是会出现崩溃 image

  • hook jni 方法失败

    hook jni 方法失败

    bytehook Version

    1.0.6

    Android OS Version

    12

    Android ABIs

    armeabi-v7a

    Device Manufacturers and Models

    mix4

    Describe the Bug

    我尝试hook jni 方法的时候,无法hook jni 方法

    这是我的JNI方法

    JNIEXPORT void JNICALL
    Java_com_lyy_crashhook_NativeLib_stringFromJNI(JNIEnv *env, jobject thiz) {
        LOG("Java_com_lyy_crashhook_NativeLib_stringFromJNI");
    }
    

    这是我的Hook代码

        bytehook_hook_single("libhookee.so", NULL, "Java_com_lyy_crashhook_NativeLib_stringFromJNI",
                             (void *) open_proxy_manual,
                             crash_hooked_callback,
                             NULL);
    

    返回结果总是:

    hooked. stub: b4000072fbc7f100, status: 13, caller_path_name: /data/app/~~rQpm4GQxSoUuAhD1gtXleA==/com.lyy.invorkhook-qoYvtStS3UiRqUyF-62m4Q==/lib/arm64/libhookee.so, sym_name: Java_com_lyy_crashhook_NativeLib_stringFromJNI, new_func: 72edc6e958, prev_func: 0, arg: 0
    
    
  • hook so库的open函数在访问/apex/com.android.runtime/lib64/bionic/libc.so出现崩溃

    hook so库的open函数在访问/apex/com.android.runtime/lib64/bionic/libc.so出现崩溃

    bytehook Version

    1.0.4

    Android OS Version

    13

    Android ABIs

    arm64-v8a

    Device Manufacturers and Models

    Google Pixel 5(Android 13)

    Describe the Bug

    问题描述:

    你好! 我新建了一个空的Unity工程(版本: 2018.4.36f1),导出了Android工程,导出的工程中有三个so,我需要hook libunity.so的所有open函数从而修改文件路径。我发现在Google Pixel 5手机上,我hook以后会出现崩溃,如果我不hook就不会崩溃,其他手机(包括小米8、小米max2、HUAWEI nova7、HUAWEI Mate 10等)没有出现这个问题。

    代码片段:

    因为open函数有多个,我在代理函数中用可变参数来调用,不知道是否正确。

    image

    崩溃堆栈:

    image

    附件是详细的日志和我的工程,解压AndroidUnity2018EmptyFor50.zip导入Android studio可以复现问题。 crash.log

    AndroidUnity2018EmptyFor50.zip

  • armeabi-v7a hook失败,用xhook库能成功

    armeabi-v7a hook失败,用xhook库能成功

    bytehook Version

    1.0.5

    Android OS Version

    6.0

    Android ABIs

    armeabi-v7a

    Device Manufacturers and Models

    模拟器

    Describe the Bug

    ANDROID_API < 21, 运行时apilevel=23,尝试修改,默认没走/proc/self/maps,改成走/proc/self/maps部分能成功,不过app会闪退

  • bhook 的dlopen未监控到加载的so

    bhook 的dlopen未监控到加载的so

    bytehook Version

    1.0.5

    Android OS Version

    6

    Android ABIs

    armeabi-v7a

    Device Manufacturers and Models

    xiaomi 4

    Describe the Bug

    我通过注册回调函数: bytehook_add_dlopen_callback(dlopen_pre_callback, dlopen_callback, NULL); 发现加载so后未被监控到。 于是我修改bh_hook_manager_verify_got_value输出了一下日志

    rs = dladdr(*((void **)got_addr), &info); BH_LOG_INFO("dladdr: %s got_addr=%p callee: %s %s", got_addr, info.dli_fname, info.dli_sname); ... if (NULL == info.dli_sname) {    ElfW(Sym) *sym = bh_elf_find_export_func_symbol_by_symbol_name(callee_elf, task->sym_name);    BH_LOG_INFO("callee: %s(%s), sym:%p", callee_elf->pathname, task->sym_name, sym);    if (NULL != sym && STT_GNU_IFUNC == ELF_ST_TYPE(sym->st_info)) {       BH_LOG_INFO("hook chain: verify bypass ifunc: %s in %s", task->sym_name, info.dli_fname);       r = 0;    } }

    日志如下: 06-22 18:23:57.609 32110-32110/? I/bhook: hook symbol(dlopen) in /system/lib/libart.so 06-22 18:23:57.609 32110-32110/? I/bhook: trampo: created for GOT b4abcbf0 at b5de608c, size 20 + 8 = 28 06-22 18:23:57.609 32110-32110/? I/bhook: hook chain: created for GOT b4abcbf0, orig func ab53e961 06-22 18:23:57.609 32110-32110/? I/bhook: hook chain: add(new) func, GOT b4abcbf0, func b377cf61 06-22 18:23:57.610 32110-32110/? I/bhook: dladdr got_addr=b4abcbf0 callee: /system/lib/libsechook.so (null) 06-22 18:23:57.610 32110-32110/? I/bhook: /system/lib/libsechook.so(dlopen), sym:0x0 06-22 18:23:57.610 32110-32110/? I/bhook: hook chain: del func, GOT b4abcbf0, func b377cf61

    这个问题可能是因为dlopen已经被别的库(/system/lib/libsechook.so)hook了,然后bhook就不处理了?

  • 自动hook新加载的动态库可能没被hook的问题

    自动hook新加载的动态库可能没被hook的问题

    我在线上使用 bhook,版本 v1.0.3,想 hook 一个动态下载的 so,发现会有 so 已经加载好,但是 bhook 没有自动去 hook 的问题,出现概率比较低。

    我找到了一种复现场景,发现是 bhook 没有立即监听到动态库的加载,所以也没有 hook 了: 1.线程 1 去初始化 bhook,调用 Bytehook.init,并且调用 bytehook_hook_single; 2.线程 2 加载某一个 so;

    复现的环境和代码我也贴出来:

    bhook 版本:v1.0.3 机型:OnePlus6,Android 10

    我改了一些代码,让问题复现:

    void bh_task_manager_hook(bh_task_manager_t *self, bh_task_t *task)
    {
        if(bh_dl_monitor_is_initing())
        {
            static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
            static bool oneshot_refreshed = false;
            if(!oneshot_refreshed)
            {
                bool hooked = false;
                pthread_mutex_lock(&lock);
                if(!oneshot_refreshed)
                {
                    BH_LOG_INFO("task_id:%u, hit init", task->id);
                    bh_dl_monitor_dlclose_rdlock();
                    bh_elf_manager_refresh(bh_core_global()->elf_mgr, false, NULL, NULL);
                    BH_LOG_INFO("sleep start...");  // 获取完 maps 停一会,然后 APP 另一个线程去加载新的 so,模拟动态 so 随机加载的场景
                    sleep(10);
                    BH_LOG_INFO("sleep end...");
                    bh_task_hook(task);
                    bh_dl_monitor_dlclose_unlock();
                    oneshot_refreshed = true;
                    hooked = true;
                }
                pthread_mutex_unlock(&lock);
                if(hooked) return;
            }
        }
        else
        {
            // start & check dl-monitor
            if(0 != bh_task_manager_init_dl_monitor(self))
            {
                // For internal tasks in the DL monitor, this is not an error.
                // But these internal tasks do not set callbacks, so there will be no side effects.
                bh_task_hooked(task, BYTEHOOK_STATUS_CODE_INITERR_DLMTR, NULL, NULL);
                return;
            }
        }
    
        BH_LOG_INFO("task_id:%u start hook", task->id);
    
        bh_dl_monitor_dlclose_rdlock();
        bh_task_hook(task);
        bh_dl_monitor_dlclose_unlock();
    }
    

    大致的流程是 bhook 会先 hook dlopen 系列函数,会先调用一遍 bh_elf_manager_refresh 把当前的 so 信息缓存起来,然后执行 hook dlopen 的任务;如果中途有别的 so 加载,bhook 会漏掉这些新的 so,相当于没监听到。 有个补救措施是 如果后续有新的 so 加载会调用 dlopen,就会触发 bh_elf_manager_refresh 再刷一遍缓存,之前漏掉的 so 也会加进来并且执行它们的 hook 任务,这样表现的情况就是 hook 被延后了。假如后续没有触发 bh_elf_manager_refresh,那么这次的 hook 就失败了

    我感觉这种情况无法完全避免,如果对可靠性要求高的话,我可以每隔一段时间调用 refresh 吗?就像 xhook 的那种用法一样

  • 是否可以对.init_array中的调用进行hook

    是否可以对.init_array中的调用进行hook

    从原理上来看,bhook执行的时机应该是在dlopen之后?现在有个需求是:dlopen里会执行.init和.init_array区块的代码,我需要hook一个在.init_array区块中执行的函数,从本地尝试来看hook是无效的,原因是dlopen阶段hook还未执行,是否有其他办法可以做到呢?

    image

  • Android 5.1.1 AUTO模式时,后加载so无法hook

    Android 5.1.1 AUTO模式时,后加载so无法hook

    手机:Xiaomi MI NOTE Pro 系统:Android 5.1.1 bhook: 1.0.3

    bytehook_init(BYTEHOOK_MODE_AUTOMATIC, true);
    bytehook_hook_all(nullptr, "getaddrinfo", (void*)MY_getaddrinfo, hookCallbac, nullptr);
    

    以上代码执行完后再加载webview,无法hook libwebviewchromium.so 但是,先在加载webview后再执行以上代码,则可以hook到libwebviewchromium.so

Framework for Enterprise Application Development in c++, HTTP1/HTTP2/HTTP3 compliant, Supports multiple server backends

The ffead-cpp Framework ffead-cpp is a web-framework, application framework, utilities all bundled into one. It also provides an embedded HTTP/Web-Soc

Nov 26, 2022
JUCE is an open-source cross-platform C++ application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, RTAS and AAX audio plug-ins.
JUCE is an open-source cross-platform C++ application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, RTAS and AAX audio plug-ins.

JUCE is an open-source cross-platform C++ application framework used for rapidly developing high quality desktop and mobile applications, including VS

Dec 1, 2022
An eventing framework for building high performance and high scalability systems in C.

NOTE: THIS PROJECT HAS BEEN DEPRECATED AND IS NO LONGER ACTIVELY MAINTAINED As of 2019-03-08, this project will no longer be maintained and will be ar

Nov 20, 2022
Idle is an asynchronous and hot-reloadable C++ dynamic component framework
Idle is an asynchronous and hot-reloadable C++ dynamic component framework

Idle is an asynchronous, hot-reloadable, and highly reactive dynamic component framework similar to OSGI that is: ?? Modular: Your program logic is en

Nov 29, 2022
PYNQ Framework for ANTSDR
 PYNQ Framework for ANTSDR

PYNQ Framework for ANTSDR This project was inspired by PYNQ and PlutoSDR. There are already many SDR platforms based on ZYNQ and AD9361, so does ANTSD

Oct 20, 2022
android analysis tools, jni trace by native hook, libc hook, write log with caller's addr in file or AndroidLog

编译方法 unix like mkdir "build" cd build cmake .. -DNDK=your_ndk_path/Android/sdk/ndk/22.0.7026061 -DANDROID_ABI=armeabi-v7a make -j8 或者使用andriod studio编

Nov 25, 2022
Using PLT trampolines to provide a BLAS and LAPACK demuxing library.

libblastrampoline All problems in computer science can be solved by another level of indirection Using PLT trampolines to provide a BLAS and LAPACK de

Oct 17, 2022
Take Damage hook hook made to increase weapon damage, the game I made is Free Fire in version 1.65

Take-Damage Simple Take Damage hook hook made to increase weapon damage, the game I made is Free Fire in version 1.65 Bool bool isTakeDemageBool = fal

Jan 1, 2022
Flutter-Clock-and-Reminder-App - a highly functional clock and reminder app developed on flutter framework.

clock_app A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if thi

Aug 4, 2022
🎉 A framework for improving android 32bit app stability. (Alleviate crashes caused by insufficient virtual memory)

Patrons ?? A framework for improving android 32bit app stability. (Alleviate crashes caused by insufficient virtual memory) 一行代码解决 Android 32位应用因虚拟内存不

Nov 8, 2022
Modify Android linker to provide loading module and hook function

fake-linker Chinese document click here Project description Modify Android linker to provide loading module and plt hook features.Please check the det

Nov 14, 2022
codeless Android hook (experimental)

AppInspect Download app-inspect-v0.0.1.zip AppInspect-0.0.1.apk Install: install Riru module adb push app-inspect-v0.0.1.zip /data/local/tmp adb shel

Oct 21, 2022
Simple Android ARM&ARM64 GOT Hook

Simple Android ARM&ARM64 GOT Hook 基于链接视图和执行视图,解析ELF,查找导入函数偏移值,替换函数地址。 详见:简易Android ARM&ARM64 GOT Hook (一) 简易Android ARM&ARM64 GOT Hook (二) 编译 使用Androi

Nov 11, 2022
shadowhook is an inline hook library for Android apps.

shadowhook is an inline hook library for Android apps.

Nov 30, 2022
If the button pressed esp will reset and App mode will on. App mode will on then led will on, network is connected led will off.

DHT22-to-Google-sheet-Reset-Using-ESP8266-LED-Switch If button pressed esp will reset and App mode will on. App mode will on then led will on, network

Aug 17, 2022
The DirectX Tool Kit (aka DirectXTK) is a collection of helper classes for writing DirectX 11.x code in C++

DirectX Tool Kit for DirectX 11 http://go.microsoft.com/fwlink/?LinkId=248929 Copyright (c) Microsoft Corporation. All rights reserved. January 9, 202

Nov 29, 2022
AstoriaCore is a customized Version of AzerothCore and the private source of WaloriaCore by Fractional aka Fred.
AstoriaCore is a customized Version of AzerothCore and the private source of WaloriaCore by Fractional aka Fred.

Community driven Classless MMO Framework. Proudly founded by Lushen and based on AzerothCore and TrinityCore ??

Apr 22, 2021
Manual map shellcode (aka byte array) injector

ShellJector This little tool can download DLL from the internet and inject it as shellcode (aka byte array) into process with manual map injection. Th

Nov 20, 2022
An 'embedded-friendly' (aka Arduino) JPEG image encoding library

Starting in the late 80's I wrote my own imaging codecs for the existing standards (CCITT G3/G4 was the first). I soon added GIF, JPEG and not long after that, the PNG specification was ratified. All of this code was "clean room" - written just from the specification. I used my imaging library in many projects and products over the years and recently decided that some of my codecs could get a new lease on life as open source, embedded-friendly libraries for microcontrollers.

Oct 16, 2022
hotcaKey is the global shortcut (aka hotkey) module for node.js and electron.

?? hotcaKey is the global shortcut (aka hotkey) module for node.js and electron. hotcakey is now actively under deploment, so api may have

Jun 20, 2022