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

Поздняков

Новичок
15
23
Решил я, с великого и неповторимого ассемблера, с целью интереса перейти на время на Си
Программа простая
1) Подключаб user32.dll
2) Вызываю оттуда функцию MessageBoxA чтобы вывести на экран сообщение
3) Выделяю виртуальную память в размере 256 байт
4) Создаю указатели типа char, передаю туда байты
5) Использую strcpy с целью заполнения значениями функцию MessageBoxA, чтобы на экране вывело:
Заголовок: ShellCode Works
А текст: test

А далее уже идет сам шеллкод, с ним вроде с норм, основная проблема заключается хер пойми в чем
Сам код:

С:
#include <windows.h>
#include <stdio.h>

int main()
{
    HMODULE hUser32 = LoadLibraryA("user32.dll");
    FARPROC pMessageBoxA = GetProcAddress(hUser32, "MessageBoxA");

    printf("MessageBoxA address: 0x%p\n", pMessageBoxA);
    PVOID pMemory = VirtualAlloc(NULL, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

    char* caption = (char*)pMemory + 100;
    char* text = (char*)pMemory + 120;   

    strcpy(caption, "Shellcode Works!");
    strcpy(text, "test");


    unsigned char shellcode[50];
    int pos = 0;


    shellcode[pos++] = 0x6A; shellcode[pos++] = 0x00;


    shellcode[pos++] = 0x68;
    memcpy(shellcode + pos, &caption, 4); pos += 4;

    shellcode[pos++] = 0x68;
    memcpy(shellcode + pos, &text, 4); pos += 4;


    shellcode[pos++] = 0x6A; shellcode[pos++] = 0x00;

    // тут вызываю messagebox
    shellcode[pos++] = 0xB8;
    memcpy(shellcode + pos, &pMessageBoxA, 4); pos += 4;

    // call eax
    shellcode[pos++] = 0xFF; shellcode[pos++] = 0xD0;

    // ret
    shellcode[pos++] = 0xC3;


    memcpy(pMemory, shellcode, pos);
    HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pMemory, NULL, 0, NULL);

    if (hThread) {
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
        printf("Shellcode executed successfully\n");
    }

    VirtualFree(pMemory, 0, MEM_RELEASE);
    FreeLibrary(hUser32);

    return 0;
}

Ошибка:
1759505882418.png


Я пытался через memcpy передать значения для MessageBox, не помогло


Шатал я ваши языки выше асма)
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
361
791
Решил я, с великого и неповторимого ассемблера, с целью интереса перейти на время на Си
Программа простая
1) Подключаб user32.dll
2) Вызываю оттуда функцию MessageBoxA чтобы вывести на экран сообщение
3) Выделяю виртуальную память в размере 256 байт
4) Создаю указатели типа char, передаю туда байты
5) Использую strcpy с целью заполнения значениями функцию MessageBoxA, чтобы на экране вывело:
Заголовок: ShellCode Works
А текст: test

А далее уже идет сам шеллкод, с ним вроде с норм, основная проблема заключается хер пойми в чем
Сам код:

С:
#include <windows.h>
#include <stdio.h>

int main()
{
    HMODULE hUser32 = LoadLibraryA("user32.dll");
    FARPROC pMessageBoxA = GetProcAddress(hUser32, "MessageBoxA");

    printf("MessageBoxA address: 0x%p\n", pMessageBoxA);
    PVOID pMemory = VirtualAlloc(NULL, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

    char* caption = (char*)pMemory + 100;
    char* text = (char*)pMemory + 120;  

    strcpy(caption, "Shellcode Works!");
    strcpy(text, "test");


    unsigned char shellcode[50];
    int pos = 0;


    shellcode[pos++] = 0x6A; shellcode[pos++] = 0x00;


    shellcode[pos++] = 0x68;
    memcpy(shellcode + pos, &caption, 4); pos += 4;

    shellcode[pos++] = 0x68;
    memcpy(shellcode + pos, &text, 4); pos += 4;


    shellcode[pos++] = 0x6A; shellcode[pos++] = 0x00;

    // тут вызываю messagebox
    shellcode[pos++] = 0xB8;
    memcpy(shellcode + pos, &pMessageBoxA, 4); pos += 4;

    // call eax
    shellcode[pos++] = 0xFF; shellcode[pos++] = 0xD0;

    // ret
    shellcode[pos++] = 0xC3;


    memcpy(pMemory, shellcode, pos);
    HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pMemory, NULL, 0, NULL);

    if (hThread) {
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
        printf("Shellcode executed successfully\n");
    }

    VirtualFree(pMemory, 0, MEM_RELEASE);
    FreeLibrary(hUser32);

    return 0;
}

Ошибка:
Посмотреть вложение 279395

Я пытался через memcpy передать значения для MessageBox, не помогло


Шатал я ваши языки выше асма)
C++:
// Перед подключением всех заголовков / инклюдов

#define _CRT_SECURE_NO_WARNINGS

Либо используй безопасные функции
 
  • Нравится
Реакции: Поздняков

Поздняков

Новичок
15
23
У меня есть некие скопированные данные, как сделать так чтобы эти данные отправлялись моему боту в тг по апи его?
Я пытался через winhttp, но чет не работает.
На Си
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
361
791
У меня есть некие скопированные данные, как сделать так чтобы эти данные отправлялись моему боту в тг по апи его?
Я пытался через winhttp, но чет не работает.
На Си
Жески тип, юзай плюсы https://github.com/reo7sp/tgbotcpp
Весь остальной код можешь писать на си, компилятор спокойно сожрет
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
361
791
Мужики все делают на TCP 😎
Тогда уж на curl + openssl писать, как раз под си, но все апи придется самому реализовывать, параллельно читая доку к бот апи тг. Как по мне, легче взять готовое, отработанное решение, чем городить лясопеды
 
  • Нравится
Реакции: вайега52

swlm

Участник
46
15
Если у кого-то была такая ситуация помогите пожалуйста, это пиздецовая проблема.
При установке тюнинг-деталей (дисков) - игра крашится, за частую краш происходит когда я слишком быстро меняю диски.
Вот так я устанавливаю тюнинг, может это какой-то не правильный способ?


C++:
if (rpcID == 22) {
    uint16_t vehicle_id = 0;
    uint16_t component_id = 0;

    bs.Read(vehicle_id);
    bs.Read(component_id);

    if (!vehicle_id || !component_id) return;

    bool isModelLoaded = false;

    if (component_id == 1077) return;
    if (component_id == 1025) return;
    if (component_id == 1076) return;

    if (component_id >= 1000 && component_id < 20000) {
        int loadState = CStreaming::ms_aInfoForModel[component_id].m_nLoadState;
        isModelLoaded = (loadState == LOADSTATE_LOADED);

        if (!isModelLoaded) {
            CStreaming::RequestVehicleUpgrade(component_id, eStreamingFlags::GAME_REQUIRED);
            CStreaming::LoadAllRequestedModels(false);

            for (int i = 0; i < 30; i++) {
                if (CStreaming::ms_aInfoForModel[component_id].m_nLoadState == LOADSTATE_LOADED) {
                    isModelLoaded = true;
                    break;
                }
                Sleep(1);
            }
        }
    }

    if (!isModelLoaded) {
        return;
    }

    DWORD sampDLL = (DWORD)GetModuleHandleA("samp.dll");
    uintptr_t sampVehicle = CMultiplayer::GetSampVehiclePtr(vehicle_id);
    if (!sampVehicle) return;

    printf("Installing component %d to vehicle %d\n", component_id, vehicle_id);
    reinterpret_cast<int(__thiscall*)(uintptr_t, unsigned short)>
        (sampDLL + 0xB7730)(sampVehicle, component_id);
}
Уже как угодно крутил код, и через нейронку, и сам что-то пытался сделать, в итоге вообще нихуя...
Самое интересное, я удаляю весь клиент-сайд, и краш всё равно остаётся..

У меня вообще пакеты обрабатываются таким образом:


C++:
inline void registerRpcHandler() {
    if (!once && getSampModule() && getRakClientIntf() != nullptr) {
        int mainPacket = 251;
        getRakClientIntf()->RegisterAsRemoteProcedureCall(&mainPacket, &MainPacket);
        once = true;

        printf("init raknet\n");
    }
}

inline void MainPacket(RPCParameters* params) {
    BitStream bs(params->input, BITS_TO_BYTES(params->numberOfBitsOfData), false);

    uint8_t packetID = 0;
    uint32_t rpcID = 0;

    bs.Read(packetID);
    bs.Read(rpcID);

    if (rpcID == 22) {
        uint16_t vehicle_id = 0;
        uint16_t component_id = 0;

        bs.Read(vehicle_id);
        bs.Read(component_id);

        if (!vehicle_id || !component_id) return;

        static auto SetComponentInRenderThread = [](uint16_t veh_id, uint16_t comp_id) { // Попробовал через отдельную функцию, не знаю, правильно это или же нет, подскажите плиз
            DWORD sampDLL = (DWORD)GetModuleHandleA("samp.dll");
            uintptr_t sampVehicle = CMultiplayer::GetSampVehiclePtr(veh_id);
            if (!sampVehicle) return;

            printf("Installing component %d to vehicle %d\n", comp_id, veh_id);
            reinterpret_cast<int(__thiscall*)(uintptr_t, unsigned short)>
                (sampDLL + 0xB7730)(sampVehicle, comp_id);
        };

        SetComponentInRenderThread(vehicle_id, component_id);
    }
}
Типа, может быть мне нужно ставить тюнинг в игровом цикле?

P.S. Всё исправил.
 
Последнее редактирование: