Другое С/С++ Вопрос - Ответ

DolgorukovGTA

Известный
Проверенный
651
349
Посмотреть вложение 56066

C++:
       typedef unsigned char BYTE;

        BYTE one = 0xE9;
        BYTE two = 0xA7;
        BYTE three = 0x03;
        BYTE four = (0x4BA3BF + 0x90);

        WriteProcessMemory(hProcess, (LPVOID)0x4BA3B9, &one, 1 , nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BA, &two, 1, nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BB, &three, 1, nullptr);
     
        const int i = 0x90;
        const void* iptr = &i;

        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BC, 0x00, 2, nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4B3296, &i , 3, nullptr);


        WriteProcessMemory(hProcess, (LPVOID)(0x4BA3BF + 0x90),&four, 1, nullptr);
Что ты творишь? Я тебе такого не советовал. Передавай в функцию указатель, он берётся при помощи операнда &. Либо же создай переменную-указатель и передавай её.
upd: @T4yz1e, почувствуй разницу на этом примере:
C:
uint8_t number = 8;
uint8_t* pNumber = &number;

printf("%p\n", pNumber); // выведет адрес переменной, на которую ссылается указатель
printf("%i\n", number); // выведет значение переменной
printf("%i\n", *pNumber); // разыменуем указатель, выведет значение
 
Последнее редактирование:

DolgorukovGTA

Известный
Проверенный
651
349
@T4yz1e, небольшой пример для тебя:
C:
#include <stdio.h>
#include <stdint.h>


void f(void* param)
{
    uint8_t* pNumber = (uint8_t*)param; // типизируем указатель
    uint8_t number = *pNumber; // разыменовываем указатель
    printf("%i\n", number);
}


int main()
{
    uint8_t number = 88;
    void* pNumber = (void*)&number; // типизируем указатель
    f(pNumber); // вызываем функцию
    return 0;
}
 

hxte

Известный
108
30
Недавно задался вопросом возможно ли написать свой плагин Emergency Light'ов, как подобный модуль в ImVehFt. Просто у последнего ограничения давят (до 16 разных материалов+корон и только 1 конфигурация загораний, я искренне верю что можно больше 16 сделать собственно лайтов и больше одного конфига, но пока не знаю как это реализовать). И вопрос такой, возможно ли и вообще имеет смысл писать подобный плагин? Может это потолок возможностей пожилого сап идораса, а не самого дмитрия, прекрасного автора мода ImVehFt. Было бы хорошо если бы вышеупомянутый имел опенсурс, но его бл*ин нету, так что придется велосипед изобретать в случае положительном.
 

2Shae

Известный
149
8
Данный код постоянно выбирает первый пункт диалога, почему?
Код:
void SendDialogResponse(WORD wDialogID, BYTE bButtonID, WORD wListBoxItem = 65535, char* szInputResp = "")
{
    BitStream bs;
    bs.ResetWritePointer();
    bs.Write(wDialogID);
    bs.Write(bButtonID);
    bs.Write(wListBoxItem);
    bs.Write((BYTE)strlen(szInputResp));
    bs.Write(szInputResp, strlen(szInputResp));
    SF->getRakNet()->SendRPC(RPCEnumeration::RPC_DialogResponse, &bs);
}

SendDialogResponse(dialogID, 1, 4);
 

ucciModd

Новичок
17
2
Решил под себя подстроить ип ченжер от наруто, взяв его исходники, но в его исходниках отсутствовал urmem.h. Я нашел на гх urmem от urShadow, но там уже новая версия. Я адаптировал версию, но крашит при хуке.

C++:
bool test(unsigned short maxConnections, unsigned short localPort, int _threadSleepTimer, const char* forceHostAddress)
{
    return hook.call<urmem::calling_convention::cdeclcall, bool>(maxConnections, localPort, _threadSleepTimer, forceHostAddress);
}

void SetHook(const urmem::address_t addr)
{
    hook.install(addr, urmem::get_func_addr(&test));
}
 
D

Deleted member 240777

Гость
1. пытаюсь написать скрипт который будет читать и изменять участок памяти, при компиляции вылазят две ошибки линкера, хз как исправить
код:
#include <Windows.h>
#include <process.h>

void __cdecl MainThread(void* pArg)
{
    DWORD dwSAMPBase = (DWORD)GetModuleHandle("samp.dll");
    unsigned char settingsFpsLimitStatus = 0;
    if (dwSAMPBase)
    {
        while (true)
        {
            Sleep(500);
            settingsFpsLimitStatus = *reinterpret_cast<unsigned char*>(0xBA6794);
            if (settingsFpsLimitStatus)
                *reinterpret_cast<unsigned char*>(dwSAMPBase + 0x9D9D0) = 369054032;
            else
                *reinterpret_cast<unsigned char*>(dwSAMPBase + 0x9D9D0) = -392431617;
        }
    }
}

BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr);
        return TRUE;
}
1590224712344.png
 

imring

Ride the Lightning
Всефорумный модератор
2,363
2,566
1. пытаюсь написать скрипт который будет читать и изменять участок памяти, при компиляции вылазят две ошибки линкера, хз как исправить
код:
#include <Windows.h>
#include <process.h>

void __cdecl MainThread(void* pArg)
{
    DWORD dwSAMPBase = (DWORD)GetModuleHandle("samp.dll");
    unsigned char settingsFpsLimitStatus = 0;
    if (dwSAMPBase)
    {
        while (true)
        {
            Sleep(500);
            settingsFpsLimitStatus = *reinterpret_cast<unsigned char*>(0xBA6794);
            if (settingsFpsLimitStatus)
                *reinterpret_cast<unsigned char*>(dwSAMPBase + 0x9D9D0) = 369054032;
            else
                *reinterpret_cast<unsigned char*>(dwSAMPBase + 0x9D9D0) = -392431617;
        }
    }
}

BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr);
        return TRUE;
}
в свойстах выбери динамическая библиотека
1590226110534.png
 
  • Нравится
Реакции: Deleted member 240777
D

Deleted member 240777

Гость

imring

Ride the Lightning
Всефорумный модератор
2,363
2,566
спс большое. у меня получилось скомпилировать, но скрипт неработает. какой адресс памяти отвечает за анлок фпса? я слышал что samp.dll + 0x9D9D0, но не работает почимуто
ты в unsigned char пытаешься записать unsigned long
и вроде надо убрать защиту от перезаписи (virual protect)
 

loganhackerdff

Известный
868
521
Как зарегистрировать windproc handler без SF api
 
Последнее редактирование:
D

Deleted member 240777

Гость
пытаюсь написать фпс анлок который выключается при включение лимита в настройках.
код:
#include <Windows.h>
#include <process.h>
#include <stdint.h>

enum SA_Mem
{
    settingsFPSLimit = 0xBA6794,
    FPSLimit = 0x9D9D0
};

void WriteMemory(void* address, void* bytes, int byteSize)
{
    DWORD NewProtection;
    VirtualProtect(address, byteSize, PAGE_EXECUTE_READWRITE, &NewProtection);
    memcpy(address, bytes, byteSize);
    VirtualProtect(address, byteSize, NewProtection, &NewProtection);
}

void __cdecl MainThread(void* pArg)
{
    DWORD dwSamp = DWORD(GetModuleHandleA("samp.dll"));
    uint8_t* old = 0;
    unsigned char settingsFPSLimitStatus = 0, oldSettingsFPSLimitStatus = 120;
    if (dwSamp)
    {
        old = reinterpret_cast<uint8_t*>(dwSamp + SA_Mem::FPSLimit);
        while (true)
        {
            Sleep(500);
            settingsFPSLimitStatus = *reinterpret_cast<unsigned char*>(SA_Mem::settingsFPSLimit);
            if (settingsFPSLimitStatus != oldSettingsFPSLimitStatus)
            {
                if(settingsFPSLimitStatus == 1)
                    WriteMemory((void*)(dwSamp + SA_Mem::FPSLimit), old, 4);
                else
                    WriteMemory((void*)(dwSamp + SA_Mem::FPSLimit), (uint8_t*)"0x5051FF15", 4);
                oldSettingsFPSLimitStatus = settingsFPSLimitStatus;
            }
        }
    }
}

BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr);
    return TRUE;
}
если захожу с включенным лимитом, то анлока нет и могу использовать /fpslimit (если выключаю лимит в настройках, то все как во втором случае).
если захожу с выключенным лимитом, то анлок есть. включая лимит в настройках, фпс анлок остаётся (проверял через чит енжин), соотвественном управление /fpslimit не работает. не могу понять в чем проблема.