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

Поздняков

Участник
19
39
Решил я, с великого и неповторимого ассемблера, с целью интереса перейти на время на Си
Программа простая
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

Адский дрочер
Друг
369
810
Решил я, с великого и неповторимого ассемблера, с целью интереса перейти на время на Си
Программа простая
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

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

Поздняков

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

AdCKuY_DpO4uLa

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

AdCKuY_DpO4uLa

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

0xff65

Участник
31
2
Приветствую, пытаюсь собрать загрузчик состоящих из двух частей - серверной и клиентской, с клиентской стороны все нормально клиент лоадер собран, а вот с серверной возникли проблемы, собрал директорию с помощью cmake, далее пытался собрать sln решение, но как мне подсказал интернет оно написано для linux -
C++:
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
Как мне быть? Скачать образ и накатить на виртуальную машину? Или собрать через Windows Subsystem for Linux? Какого формата будет скомпилированный файл и как его запустить на локалке?

Или я движусь совсем не в том направлении? Типо как мне собрать sln файл на линукс (этого я не понимаю) если там 2к ошибок, что-то не так явно

Сурс (https://github.com/EquiNoxAdv/loader-master)
 
Последнее редактирование:

AdCKuY_DpO4uLa

Адский дрочер
Друг
369
810
Приветствую, пытаюсь собрать загрузчик состоящих из двух частей - серверной и клиентской, с клиентской стороны все нормально клиент лоадер собран, а вот с серверной возникли проблемы, собрал директорию с помощью cmake, далее пытался собрать sln решение, но как мне подсказал интернет оно написано для linux -
C++:
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
Как мне быть? Скачать образ и накатить на виртуальную машину? Или собрать через Windows Subsystem for Linux? Какого формата будет скомпилированный файл и как его запустить на локалке?

Или я движусь совсем не в том направлении? Типо как мне собрать sln файл на линукс (этого я не понимаю) если там 2к ошибок, что-то не так явно

Сурс (https://github.com/EquiNoxAdv/loader-master)
Все инструкции есть в репозитории. Ставь WSL с ubuntu какой-нибудь и на ней собирай
 
  • Нравится
Реакции: 0xff65 и вайега52

fuldic

Новичок
27
4
Скиньте основу ASI плагина для Visual Studio
 
Последнее редактирование:

malonex

Новичок
4
1
Как проверить, была ли отпущена определённая клавиша? Например: wasKeyReleased(vkeys.VK_RBUTTON)
 

yorenov

Участник
57
42
Альт как прожать? Так не воркает:

С++:
RakNet::BitStream bs;
    bs.ResetWritePointer();
    Synchronization::OnfootData onfootData{};
    std::memcpy(&onfootData,
                &RefNetGame()->GetPlayerPool()->GetLocalPlayer()->m_onfootData,
                sizeof(Synchronization::OnfootData));
    onfootData.m_controllerState.m_bPedWalk = 1;
    onfootData.m_controllerState.m_value = static_cast<uint8_t>(1024);
    bs.Write(static_cast<BYTE>(ID_PLAYER_SYNC));
    bs.Write(reinterpret_cast<PCHAR>(&onfootData), sizeof(Synchronization::OnfootData));
    rakhook::send(&bs, HIGH_PRIORITY, RELIABLE_SEQUENCED, 1);
    
    onfootData.m_controllerState.m_bPedWalk = 0;
    onfootData.m_controllerState.m_value = static_cast<uint8_t>(0);
    bs.Write(static_cast<BYTE>(ID_PLAYER_SYNC));
    bs.Write(reinterpret_cast<PCHAR>(&onfootData), sizeof(Synchronization::OnfootData));
    rakhook::send(&bs, HIGH_PRIORITY, RELIABLE_SEQUENCED, 1);
А так прожимает только 1 раз + ко всему - костыль
C++:
input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = 0;
    input[0].ki.dwFlags = KEYEVENTF_SCANCODE;
    input[0].ki.wScan = 0x38;

    input[1].type = INPUT_KEYBOARD;
    input[1].ki.wVk = 0;
    input[1].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    input[1].ki.wScan = 0x38;

    SendInput(2, input, sizeof(INPUT));
 

undefine

Участник
37
15
Альт как прожать? Так не воркает:

С++:
RakNet::BitStream bs;
    bs.ResetWritePointer();
    Synchronization::OnfootData onfootData{};
    std::memcpy(&onfootData,
                &RefNetGame()->GetPlayerPool()->GetLocalPlayer()->m_onfootData,
                sizeof(Synchronization::OnfootData));
    onfootData.m_controllerState.m_bPedWalk = 1;
    onfootData.m_controllerState.m_value = static_cast<uint8_t>(1024);
    bs.Write(static_cast<BYTE>(ID_PLAYER_SYNC));
    bs.Write(reinterpret_cast<PCHAR>(&onfootData), sizeof(Synchronization::OnfootData));
    rakhook::send(&bs, HIGH_PRIORITY, RELIABLE_SEQUENCED, 1);
   
    onfootData.m_controllerState.m_bPedWalk = 0;
    onfootData.m_controllerState.m_value = static_cast<uint8_t>(0);
    bs.Write(static_cast<BYTE>(ID_PLAYER_SYNC));
    bs.Write(reinterpret_cast<PCHAR>(&onfootData), sizeof(Synchronization::OnfootData));
    rakhook::send(&bs, HIGH_PRIORITY, RELIABLE_SEQUENCED, 1);
А так прожимает только 1 раз + ко всему - костыль
C++:
input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = 0;
    input[0].ki.dwFlags = KEYEVENTF_SCANCODE;
    input[0].ki.wScan = 0x38;

    input[1].type = INPUT_KEYBOARD;
    input[1].ki.wVk = 0;
    input[1].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    input[1].ki.wScan = 0x38;

    SendInput(2, input, sizeof(INPUT));
ратку опять кинь, прожмется алт