Tutorial How to hook in new LGL Modmenu

Acer2k5

Platinian
Original poster
Aug 1, 2020
14
12
3
23
Việt Nam
Hi new modder & old modder.
In this thread, I will show you how to hook in new LGL Modmenu

First: Get hex code we need to use. Example:

// RVA: 0x1113FC8 Offset: 0x1113FC8 VA: 0x1113FC8
public void set_ID(int value) { }

This is Offset we need to mod : 0x1113FC8

We need to know some function

Python:
# Hook the function named "FunctionExample" with the address "0x123456" in the library "libFileB.so"
HOOK("str", FunctionExample, old_FunctionExample);

# Hook the function named "FunctionExample" with the address "0x123456" in the library "libFileC.so"
HOOK_LIB("libFileC.so", "0x123456", FunctionExample, old_FunctionExample);

# Hook the function named "__SymbolNameExample" with the address "0x123456" in the library "libFileB.so"
HOOKSYM("__SymbolNameExample", FunctionExample, old_FunctionExample);

# Hook the function named "__SymbolNameExample" with the address "0x123456" in the library "libFileB.so" and do not replace the original function
HOOKSYM_NO_ORIG("__SymbolNameExample", FunctionExample);

# Patch the offset "0x20D3A8" in the library "libFileB.so" with the bytes "00 00 A0 E3 1E FF 2F E1"
PATCH_LIB("libFileB.so", "0x20D3A8", "00 00 A0 E3 1E FF 2F E1");

# Restore the original value of the offset "0x20D3A8" in the library "libFileB.so"
RESTORE_LIB("libFileB.so", "0x20D3A8");

# Get the absolute address of the function named "Ally_ID" in the library "targetLibName"
Ally_ID = (void (*)(void *, int)) getAbsoluteAddress(targetLibName, 0x1113FC8);

# Log a message to indicate that the process is complete
LOGI(OBFUSCATE("Done"));
Ahead of the Main.cpp file in LGLModmenu, we found :

C++:
bool feature1, feature2, featureHookToggle, Health;
int sliderValue = 1, level = 0, Dmg = 1, Defend = 1;
void instanceBtn;
We need to add some code to this, we must pay attention to VOID or INT or BOOL element
IF we need use mod function
Toggle : use
BOOL
Slider : use INT
I don't know how to use VOID with anny mod function, but we still have to pay attention
I need to mod my team =< 3 so i use Slider and use
INT , here is example:


C++:
bool feature1, feature2, featureHookToggle, Health;
int sliderValue = 1, level = 0, Ally = 1;
void instanceBtn;
To use slider, lets write code like this or copy and rewrite for your modmenu:

C++:
void (*old_Ally_ID)(void *instance, int value);
void Ally_ID(void *instance, int value) {
    if (instance != NULL && Ally > 1) {
        return (void) Ally;
    }

    // Move the old_Ally_ID function call here
    old_Ally_ID(instance, value);
}
After you understool Hook functions, you can write code like this:

C++:
    HOOK("str", Ally_ID, old_Ally_ID);
    HOOK_LIB("libFileB.so", "0x1113FC8", Ally_ID, old_Ally_ID);
    HOOK_NO_ORIG("0x1113FC8", Ally_ID);
    
    RESTORE("0x1113FC8");
    RESTORE_LIB("libFileB.so", "0x1113FC8");
    
    Ally_ID = (void (*)(void *, int)) getAbsoluteAddress(targetLibName, 0x1113FC8);
You need a Offucate, lets write it:

C++:
OBFUSCATE("SeekBar_Ally Ally_1_3"), // 0 case
You need case too:

C++:
    switch (featNum) {
        case 0:
            Ally =! Ally
            break;
    }
Congratulation, you had your hook. This code below will show summary of all thread code. Having fun coding =]]

C++:
//Hook example:

int Ally = 1,

void (*old_Ally_ID)(void *instance, int value);
void Ally_ID(void *instance, int value) {
    if (instance != NULL && Ally > 1) {
        return (void) Ally;
    }

    // Move the old_Ally_ID function call here
    old_Ally_ID(instance, value);
}

    HOOK("str", Ally_ID, old_Ally_ID);
    HOOK_LIB("libFileB.so", "0x1113FC8", Ally_ID, old_Ally_ID);
    HOOK_NO_ORIG("0x1113FC8", Ally_ID);
    
    RESTORE("0x1113FC8");
    RESTORE_LIB("libFileB.so", "0x1113FC8");
    
    Ally_ID = (void (*)(void *, int)) getAbsoluteAddress(targetLibName, 0x1113FC8);
    
    jobjectArray GetFeatureList(JNIEnv *env, jobject context) {
    jobjectArray ret;

    const char *features[] = {
            OBFUSCATE("Category_The Category"), //Not counted
            OBFUSCATE("SeekBar_Ally Ally_1_3"), // 0 case
    
    switch (featNum) {
        case 0:
            Ally =! Ally
            break;
    }
 

Muhtoevill

Platinian
Mar 1, 2018
12
1
3
26
Thanks for tutorial :pepe013:

but im still dont understand to use this hook
Code:
HOOKSYM("__SymbolNameExample", FunctionExample, old_FunctionExample);

HOOKSYM_NO_ORIG("__SymbolNameExample", FunctionExample);

HOOK("str", FunctionExample, old_FunctionExample);
 

Acer2k5

Platinian
Original poster
Aug 1, 2020
14
12
3
23
Việt Nam
Thanks for tutorial :pepe013:

but im still dont understand to use this hook
Code:
HOOKSYM("__SymbolNameExample", FunctionExample, old_FunctionExample);

HOOKSYM_NO_ORIG("__SymbolNameExample", FunctionExample);

HOOK("str", FunctionExample, old_FunctionExample);
This turtorial need to remake. Feel free when i remake this turtorial
 

AASIM_456

Support
Staff member
Support
Jan 18, 2023
738
37,349
1,193
a Sperm Cell
tutorial coming for field hooking too ???
Also i have a question :-
suppose im making my player unlimited health which is in "int health" and it's a "Field Offset" and i've used toggle for it. So, i was wondering where should i declare variables at the top ?? in the"int" or the "bool" ??
 

Acer2k5

Platinian
Original poster
Aug 1, 2020
14
12
3
23
Việt Nam
Ex:
// RVA: 0x1113FF8 Offset: 0x1113FF8 VA: 0x1113FF8
public void set_Hp1(int value) { }
You need to use void to call Hp, int to edit HP amount
 

DeathLantern

Approved Modder
Approved Modder
Oct 7, 2017
928
31,511
1,193
isekai
tutorial coming for field hooking too ???
Also i have a question :-
suppose im making my player unlimited health which is in "int health" and it's a "Field Offset" and i've used toggle for it. So, i was wondering where should i declare variables at the top ?? in the"int" or the "bool" ??
You want me to do the tutorial :pepe019:
 
  • Like
Reactions: AASIM_456