Code Monkey home page Code Monkey logo

lighthook's Introduction

logo

Single-header, minimalistic, cross-platform hook library written in pure C for x86-64 based systems.

But... why?

While other well-written libraries that do exactly the same already exist, I wanted to have something simple that would not use an entire disassembler engine which can sometimes be painful to include in a project.

Pros of this library:

  • Written in pure C
  • No dependencies (no full disassembler engine)
  • Single header
  • Works in both kernelmode/usermode
  • Cross-platform (Windows/Linux/EFI)
  • Easily portable (3 functions to allocate/free/protect memory that are platform specific)

Cons of this library:

  • Breaks when a function starts with unsupported instructions (ex. AVX)

Showcase

linux wink winu efi

Usage

Include the header file in your project. Initialise hook structure by calling CreateHook. Perform the actual hook by calling EnableHook and optionally revert the hook with a call to DisableHook.

HookInformation info = CreateHook((void*)&FunctionToHook, (void*)&FunctionToCall);
int status = EnableHook(&info);
if (!status)
    return;

// Call the original function with info.Trampoline
FunctionToHook(10, 20);

DisableHook(&info)

License

This repository is licensed under MIT if not stated otherwise in subfolders.

lighthook's People

Contributors

cyclonering avatar samueltulach 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

lighthook's Issues

Will not work on functions with jmp/cmp/nearcall/ any relative offset in the first 14 bytes

Hey, while overall a great and simple library, it seem to break if a target function has a nearcall (E8 ? ? ? ?) in the first 14 bytes.
Possibly also will break on jmp and cmp if relative displacement is used.
Reason being this:

MemoryCopy(information.OriginalBuffer, originalFunction, size);

But, considering not having to bring a fullass disassembler to use LH, not an issue per se, just letting you know ;)
Thanks for a great project!

PlatformFree not called in DisableHook?

First off, let me say that of all the hooking libraries I tried recently LightHook is first one I got completely working. ๐Ÿ˜„

A couple issues regarding compiling, but I may file separate issues for those.
(Mainly in regard to -Wall -Werror and could not get around those with clang++)
Also, no arm, arm64 or risc-v support, but I may have a friend help me get LightHook working with those architectures.

I was able to compile with g++ -Wall -Werror -Os -std=gnu++17 -Wno-pointer-arith -Wno-error=parentheses -Wno-parentheses -Wno-error=sign-compare -Wno-sign-compare and that is how I noticed that PlatformFree was never being called (as I got an error about that, and was not going to disable that warning/error).

I'm using this with Free Pascal (FPC) and there was no way it could import LightHook.h (without major surgery) so I did not bother, I just wrote a wrapper C unit and created a much smaller header file that FPC could import.

In my wrapper I'm calling PlatformFree immediately after DisableHook.

Despite functions I tried hooking not being C compatible as far as calling, LightHook had no problem hooking them.

So, should I be calling PlatformFree immediately after DisableHook each time? I noticed I could enable and disable more than once and it performed as expected.

LH incorrectly hooks DLLs that transition into ARM64

Use case: Running WinARM (from MAC using Parallels for example, or a native MSFT ARM based notebook)

Module = KERNELBASE.sys
Function = CreateFileW

pseudo code: HMODULE mod=(HMODULE)LoadLibraryA("kernelbase.sys")
void * origPtr = GetProcAddress("CreateFileW")

... use LH to "hook" and make a call to anything that gets to CreateFileW (fopen is fine, or use CreateFileW)

calling the ORIGINAL hook will crash/fault... along the lines of:

typedef HANDLE (*pfnCFW)( ...the..args...to...CFW);

HANDLE myCreateFileW( ..args ..)
{
pfnCFW orig = (pfwCFW)LH.trampoline;
return orig( .. args ..); <-- CRASH
}

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.