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

DolgorukovGTA

Известный
Проверенный
652
345
@DolgorukovGTA @RTD оценку?

C++:
        DWORD one = 0x4BA3B9;
        DWORD two = 0x4BA3BA;
        DWORD three = 0x4BA3BB;
        DWORD four = 0x4BA3BF;
       
        one = 0xE9;
        two = 0xA7;
        three = 0x03;

        ReadProcessMemory(hProcess, (LPVOID)0x4BA3B9, &one, sizeof(one), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BA, &two, sizeof(two), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BB, &three, sizeof(three), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BF, &four, sizeof(four), 0);

        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3B9, &one, 1 , nullptr);
        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3BA, &two, 1, nullptr);
        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3BB, &three, 1, nullptr);
        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3BF, &four, 1, nullptr);

        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)(0x4BA3BF +0x90), &four, 1, nullptr);

        const int i = 0x90;
        const void* newi = &i;

        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BC, 0x00, 2, nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4B3296, newi, 3, nullptr);
    }
Ты же указатель передаёшь.
 

DolgorukovGTA

Известный
Проверенный
652
345
😭

C++:
        const int i = 0x90;
        const void*i = &i;

        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BC, 0x00, 2, nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4B3296, &i , 3, nullptr);
Зачем многоуровневый указатель? И у тебя переменная имеет такой же идентификатор (имя), что и указатель на неё. Обычно к переменным-указателям добавляют "ptr" в конец или "p" в начало.
 

DolgorukovGTA

Известный
Проверенный
652
345
Посмотреть вложение 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

Известный
Проверенный
652
345
@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;
}
 

Fuexie

Известный
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

Новичок
18
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,362
2,545
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,362
2,545
спс большое. у меня получилось скомпилировать, но скрипт неработает. какой адресс памяти отвечает за анлок фпса? я слышал что samp.dll + 0x9D9D0, но не работает почимуто
ты в unsigned char пытаешься записать unsigned long
и вроде надо убрать защиту от перезаписи (virual protect)