📖 учебник Базовое руководство по подключению

Sbenny.com доверяют 1,331,378 XNUMX XNUMX счастливых пользователей с 2014 года.
Зарегистрируйтесь

Гуров

Дмитрий Петренко
✌️ Команда сообщества
Участник 5 лет
Привет всем 👋 . Надеюсь, у всех все в порядке. Сегодня я делаю этот урок в соответствии с @DDeveloperЗапрос. В этом уроке я покажу вам, как использовать базовые хуки.
Давайте начнем ....

Допустим, мы собираемся перехватить функцию get_Coins.

Screenshot_15.png


Прежде всего нам нужно скопировать исходный экземпляр этой функции.
C ++:
int (*org_getCoins)(void *instance);

Далее нам нужно заставить нашу функцию заменить эту старую функцию в игре после перехвата.
C ++:
int getCoins(void *instance) {

}

Теперь мы можем изменить функцию по своему желанию. Но в большинстве случаев мы просто возвращаем значение. Давайте сделаем это для этого урока.
Сначала нам нужно проверить правильность этой функции во время выполнения. Для этого мы можем просто использовать оператор «if».
C ++:
int getCoins(void *instance) {
    
    if (instance != NULL) {
        
    }
    
}

Теперь Здесь мы можем, если экземпляр действителен, мы можем просто вернуть наше значение. (Знания о типах данных немного помогут).
C ++:
int getCoins(void *instance) {

    if (instance != NULL) {
        return 99999;
    }
    
}

Но когда он недействителен (и в некоторых других случаях), мы должны вернуть тот исходный экземпляр, который мы скопировали.
C ++:
int getCoins(void *instance) {

    if (instance != NULL) {
        return 99999;
    }
    return org_getCoins(instance);
}

Теперь код должен выглядеть так.
C ++:
int (*org_getCoins)(void *instance);

int getCoins(void *instance) {
    
    if (instance != NULL) {
        return 99999;
    }
    return org_getCoins(instance);
}

Теперь, если вы используете меню Mod, вы можете просто использовать здесь логический переключатель.
C ++:
int getCoins(void *instance) {

    if (instance != NULL) {

        if (feature1){        //your switch boolean
            return 99999;
        }

    }
    return org_getCoins(instance);
}

На последнем крючке вы смещаете ветку взлома (LGL Menu) с помощью MSHook или A64InlineHook.
C ++:
MSHookFunction((void *) getAbsoluteAddress(targetLibName, string2Offset(OBFUSCATE_KEY("0x123456", 'a'))), (void *) getCoins, (void **) &org_getCoins);

Для других возвращаемых типов просто измените тип данных ваших функций ловушки. Нравиться ...
C ++:
float (*org_getCoins)(void *instance);

float getCoins(void *instance) {
    
    if (instance != NULL) {
        return 99999.0f;
    }
    return org_getCoins(instance);
}
C ++:
bool (*org_isUnlocked)(void *instance);

bool isUnlocked(void *instance) {

    if (instance != NULL) {
        return true;
    }
    return org_isUnlocked(instance);
}


Это все на сегодня. Надеюсь, этот урок вам немного поможет. :)
 

Вложения

Гуров

Дмитрий Петренко
✌️ Команда сообщества
Участник 5 лет
Касами, который не понимает, что это значит:
ВСТУПЛЕНИЕ ... xD
И Касами понятия не имеет, что она использует универсальные соглашения об именах для программирования xD.
 

PixelYT

Ученик Уровень 2️⃣
Участник 5 лет
Хорошее руководство, но вы упустили одну важную вещь: не забудьте подключить функцию Update или LateUpdate из этого класса с помощью MSHook.
 

Sbenny

Сумасшедший ученый
Штатный сотрудник
Администратор
Отряд СБ Мод ⭐
✔ Утвержденный релизер
Активный пользователь
Хорошее руководство, но вы упустили одну важную вещь: не забудьте подключить функцию Update или LateUpdate из этого класса с помощью MSHook.
В приведенных им примерах в этом нет необходимости, не забывайте, что функции Update и LateUpdate продолжают рассылать спам каждый кадр, что означает, что вы запускаете его примерно 60 раз в секунду, что является пустой тратой ресурсов, когда вы просто стремитесь изменить количество монет, которые у вас есть, или если вы хотите что-то разблокировать.
 

Гуров

Дмитрий Петренко
✌️ Команда сообщества
Участник 5 лет
Хорошее руководство, но вы упустили одну важную вещь: не забудьте подключить функцию Update или LateUpdate из этого класса с помощью MSHook.
В приведенных им примерах в этом нет необходимости, не забывайте, что функции Update и LateUpdate продолжают рассылать спам каждый кадр, что означает, что вы запускаете его примерно 60 раз в секунду, что является пустой тратой ресурсов, когда вы просто стремитесь изменить количество монет, которые у вас есть, или если вы хотите что-то разблокировать.
Кроме того, это не так уж и необходимо, поскольку здесь мы не подключаем указатели на поля или функции.
 

PixelYT

Ученик Уровень 2️⃣
Участник 5 лет
вау, я не знал этого, так как я подключаю только поля, потому что для методов я просто выполняю обычное шестнадцатеричное исправление, которое мы не можем сделать с полями (переменными экземпляра).
 

Полярный медведь

Начинающий Уровень 1️⃣
Участник 2 лет
Гуров
куда вставить этот код? и все коды выше?
MSHookFunction((void *) getAbsoluteAddress(targetLibName, string2Offset(OBFUSCATE_KEY("0x123456", 'a'))), (void *) getCoins, (void **) &org_getCoins);
а где вы взяли это смещение от 0x123456 и еще это 'а'???
 

Гуров

Дмитрий Петренко
✌️ Команда сообщества
Участник 5 лет
Гуров
куда вставить этот код? и все коды выше?
MSHookFunction((void *) getAbsoluteAddress(targetLibName, string2Offset(OBFUSCATE_KEY("0x123456", 'a'))), (void *) getCoins, (void **) &org_getCoins);
а где вы взяли это смещение от 0x123456 и еще это 'а'???
Вы когда-нибудь модифицировали игру?
 

Гуров

Дмитрий Петренко
✌️ Команда сообщества
Участник 5 лет

Полярный медведь

Начинающий Уровень 1️⃣
Участник 2 лет
Тогда вы должны знать, что такое смещение, также использовали какой-либо шаблон раньше? Например, LGL или Octwolves?
приятель, я знаю, что такое смещение, но я запутался, потому что ты внезапно использовал смещение, о котором раньше не упоминал в этой теме + нет
 

Гуров

Дмитрий Петренко
✌️ Команда сообщества
Участник 5 лет
приятель, я знаю, что такое смещение, но я запутался, потому что ты внезапно использовал смещение, о котором раньше не упоминал в этой теме + нет
Хм, тогда плохо... Ну, вам следует сначала научиться использовать шаблон LGL или Octwolve с патчем памяти. Я предпочитаю LGL, потому что он проще.
 

Полярный медведь

Начинающий Уровень 1️⃣
Участник 2 лет
Хм, тогда плохо... Ну, вам следует сначала научиться использовать шаблон LGL или Octwolve с патчем памяти. Я предпочитаю LGL, потому что он проще.
любые уроки будут полезны+Спасибо за урок
 

Асоул Моддер

Hardcore Уровень 9️⃣
Отряд СБ Мод ⭐
✔ Утвержденный релизер
Активный пользователь
Участник 2 лет
у меня есть такой крючок, но он не работает
IMG_20221222_114332.png

IMG_20221222_114418.png

IMG_20221222_114448.png

IMG_20221222_114759.png



Я сделал так, но не работает, можете ли вы мне помочь мне, что не так
 
Топовое