Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Замена Dproto

Статус пользователя Boo
сообщение 5.6.2024, 20:06
Сообщение #1


Стаж: 17 лет

Сообщений: 468
Благодарностей: 22
Полезность: 73

В общем, раньше помню был простой патч который апдейтит пару файлов в корне сервера и начинает пускать No-Steam клиентов, в моем случаи Dproto не подходит

Вопрос, есть ли что то такое актуальное сейчас ? если да то что? нужно под Linux

возможно не самое свежее , но что бы работало .


Мне нужно для запуска сервера без metamod, зачем и почему, не спрашивайте :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Gecko
сообщение 6.6.2024, 2:45
Сообщение #2
Стаж: 7 лет 4 месяца

Сообщений: 1247
Благодарностей: 518
Полезность: 345

Boo, revemu

https://bir3yk.net/forum/topic_2642/


Не отвечаю на ЛС.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Boo
сообщение 6.6.2024, 6:38
Сообщение #3


Стаж: 17 лет

Сообщений: 468
Благодарностей: 22
Полезность: 73

ДА! точно блин, я же даже помню этот сайт, лет 10 + назад я на нем был зареган. Спасибо

Вопрос (чисто по дискутировать), там всё как раньше ? он накатывается на чистый hlds , заменой файлов и но-стим клиентов пускает ?

ДПрото я так понимаю по больше функционала имеет, но все же, в моем случаи он не подходит


Тогда ещё вопрос, где можно выкачать наиболее свежую версию hlds под линукс, может где то есть, не особо хочу стим клиент ставить что б качать , мне чисто для эксперимента в основном , не для реального сервера

Отредактировал: Boo, - 6.6.2024, 6:41
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Gecko
сообщение 6.6.2024, 8:40
Сообщение #4
Стаж: 7 лет 4 месяца

Сообщений: 1247
Благодарностей: 518
Полезность: 345

Boo,
Цитата
Тогда ещё вопрос, где можно выкачать наиболее свежую версию hlds под линукс

с помощью SteamCMD
Есть 2 самых простых варианта установки:
LGSM
либо в докере, конфиг могу тебе скинуть.


Не отвечаю на ЛС.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Boo
сообщение 6.6.2024, 8:44
Сообщение #5


Стаж: 17 лет

Сообщений: 468
Благодарностей: 22
Полезность: 73

Да это всё шарю)) ну ок, придется вспоминать как там через SteamCMD вытягивать

докер образ вроде есть
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Gecko
сообщение 6.6.2024, 10:01
Сообщение #6
Стаж: 7 лет 4 месяца

Сообщений: 1247
Благодарностей: 518
Полезность: 345

Цитата(Boo @ 6.6.2024, 8:44) *
Да это всё шарю)) ну ок, придется вспоминать как там через SteamCMD вытягивать

докер образ вроде есть

]А только так, ИСКЛЮЧИТЕЛЬНО и только с официального сайта. В противном случае ты рискуешь получить "подарок" в типа чистой сборке. Например, элементарно я могу вшить в сборку свою программу которая будет получать команды из внешнего ресурса (из текстового файла) хотя сам файл будет абсолютно безобидным на первый взгляд обычная html страница либо файл отвечающий за работу API в форамате json (например обновления), и этого вполне хватит чтобы управлять твоим сервером (ПК) с правами того пользователя от которого запущен игровой сервер, ддос с такой сборки это самое безобидное что может быть, потому как эти все сборки (как клиента так и сервера) это клондайк для "мамкиных" хацкеров.
Если интересно как это работает ставь спасибку в этой теме , я покажу наглядно как взламывают ваши сервера и как ваш ПК элементарно превратить в послушного бота как под виндой так и под линукс. Выявить такой троян невозможно, тем более доказать противозаконность таких действий.


Не отвечаю на ЛС.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Boo
сообщение 6.6.2024, 10:07
Сообщение #7


Стаж: 17 лет

Сообщений: 468
Благодарностей: 22
Полезность: 73

Это все я знаю, по тому делаю всё исключительно на изоллированых средах) и отдельных серверах ))
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Gecko
сообщение 6.6.2024, 10:20
Сообщение #8
Стаж: 7 лет 4 месяца

Сообщений: 1247
Благодарностей: 518
Полезность: 345

К стати, по поводу безопасности своей сборки игрового сервера, как минимум сервер должен быть до последнего файла скачать с официальных источников, с сайта разработчика. Все плагины/модули обязательно собирать из исходного кода компилятором amxx собранным также из исходного кода.

Докер это один из самых лучших вариантов для запуска игрового сервера, также я рекомендую всегда делать слепки всех файлов сервера.
Есть такая программа как Affick (на perl), но я написал упрощенный (на 200 строк кода) её аналог на go, который работает в разы быстрее и удобнее.
Если нужно могу поделиться в отдельной теме этой программой, я её писал под linux, но под винду она тоже может работать, немного нужно поправить исходный код.

checksum
Код
package main

import (
    "bufio"
    "crypto/md5"
    "encoding/hex"
    "flag"
    "fmt"
    "io"
    "os"
    "path/filepath"
    "strings"
)

// FileEntry хранит информацию о файле или каталоге
type FileEntry struct {
    Path string
    Hash string
}

// Функция для создания слепка системы для указанного пути и записи его в файл
func createAndSaveSnapshot(rootPath, filename string, excludeDirs []string, verbose bool) ([]FileEntry, error) {
    var newSnapshot []FileEntry
    excludeMap := make(map[string]struct{})
    for _, dir := range excludeDirs {
        absDir, err := filepath.Abs(dir)
        if err == nil {
            excludeMap[absDir] = struct{}{}
        }
    }

    err := filepath.Walk(rootPath, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            if verbose {
                fmt.Printf("Skipping %s due to error: %v\n", path, err)
            }
            return nil
        }

        if info.Mode()&os.ModeSymlink != 0 {
            // Пропуск символических ссылок ВАЖНО!!!
            if verbose {
                fmt.Printf("Skipping symlink: %s\n", path)
            }
            return nil
        }

        absPath, err := filepath.Abs(path)
        if err != nil {
            if verbose {
                fmt.Printf("Skipping %s due to error: %v\n", path, err)
            }
            return nil
        }

        for excludeDir := range excludeMap {
            if absPath == excludeDir || strings.HasPrefix(absPath, excludeDir+string(os.PathSeparator)) {
                return nil
            }
        }

        if !info.IsDir() {
            // Если это файл, происходит вычисление его хэш-суммы
            fileHash, err := hashFile(path)
            if err != nil {
                if verbose {
                    fmt.Printf("Skipping file %s due to error: %v\n", path, err)
                }
                return nil
            }
            newSnapshot = append(newSnapshot, FileEntry{Path: path, Hash: fileHash})
        } else {
            // Если это каталог, добавляет его только в список
            newSnapshot = append(newSnapshot, FileEntry{Path: path})
        }

        return nil
    })
    if err != nil {
        return nil, err
    }

    // Открывает файл для записи слепка системы
    file, err := os.Create(filename)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    // Записывает слепок системы в файл
    for _, entry := range newSnapshot {
        _, err := fmt.Fprintf(file, "%s|%s\n", entry.Path, entry.Hash)
        if err != nil {
            return nil, err
        }
    }
    return newSnapshot, nil
}

// Функция для считывания слепка системы из файла
func readSnapshotFromFile(filename string) ([]FileEntry, error) {
    var snapshot []FileEntry

    file, err := os.Open(filename)
    if err != nil {
        if os.IsNotExist(err) {
            return nil, nil
        }
        return nil, err
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        line := scanner.Text()
        parts := strings.SplitN(line, "|", 2)
        if len(parts) != 2 {
            fmt.Printf("Skipping malformed line: %s\n", line)
            continue // Пропуск строк с неправильным форматом
        }
        snapshot = append(snapshot, FileEntry{Path: parts[0], Hash: parts[1]})
    }

    if err := scanner.Err(); err != nil {
        return nil, err
    }

    return snapshot, nil
}

// Функция для расчета хэш-суммы файла
func hashFile(filePath string) (string, error) {
    file, err := os.Open(filePath)
    if err != nil {
        return "", err
    }
    defer file.Close()

    hash := md5.New()
    if _, err := io.Copy(hash, file); err != nil {
        return "", err
    }

    hashSum := hex.EncodeToString(hash.Sum(nil))
    return hashSum, nil
}

// Функция для сравнения двух слепков системы
func compareSnapshots(oldSnapshot, newSnapshot []FileEntry) {
    if len(oldSnapshot) == 0 {
        fmt.Println("Previous snapshot not found. Skipping comparison.")
        return
    }

    // Преобразует новый слепок в словарь для более эффективного сравнения
    newMap := make(map[string]string)
    for _, entry := range newSnapshot {
        newMap[entry.Path] = entry.Hash
    }

    // Сравнивает файлы в предыдущем слепке с файлами в новом слепке
    for _, entry := range oldSnapshot {
        newPath := entry.Path
        newHash, ok := newMap[newPath]
        if !ok {
            fmt.Printf("[-] %s\n", newPath)
            continue
        }
        if entry.Hash != newHash {
            fmt.Printf("[m] %s\n", newPath)

        }
        // Удаляет файл из newMap, чтобы оставшиеся файлы можно было проверить на добавление
        delete(newMap, newPath)
    }

    // Проверяет, были ли добавлены новые файлы
    for path := range newMap {
        fmt.Printf("[+] %s\n", path)
    }
}

func main() {
    
    var (
        rootPath    string
        filename    = "snapshot.txt"
        verbose     = flag.Bool("verbose", false, "Enable verbose output")
        excludeDirs = flag.String("excludeDirs", "", "Comma-separated list of directories to exclude")
    )

    flag.StringVar(&rootPath, "rootPath", "/", "Root path for creating the snapshot")
    flag.Parse()

    // Проверка существования указанного rootPath
    _, err := os.Stat(rootPath)
    if os.IsNotExist(err) {
        fmt.Printf("Error: rootPath %s does not exist\n", rootPath)
        return
    } else if err != nil {
        fmt.Printf("Error checking rootPath %s: %v\n", rootPath, err)
        return
    }

    excludeDirList := strings.Split(*excludeDirs, ",")

    oldSnapshot, err := readSnapshotFromFile(filename)
    if err != nil {
        fmt.Printf("Error reading previous snapshot from file: %v\n", err)
        return
    }

    var newSnapshot []FileEntry

    if oldSnapshot == nil {
        // Создает новый слепок, если предыдущий не найден
        newSnapshot, err = createAndSaveSnapshot(rootPath, filename, excludeDirList, *verbose)
        if err != nil {
            fmt.Printf("Error creating and saving new snapshot: %v\n", err)
            return
        }
        fmt.Printf("Snapshot created and saved to %s\n", filename)
    } else {
        // Проверяет текущие файлы с предыдущим слепком
        newSnapshot, err = createAndSaveSnapshot(rootPath, "/tmp/current_snapshot.txt", excludeDirList, *verbose)
        if err != nil {
            fmt.Printf("Error creating and saving new snapshot: %v\n", err)
            return
        }
        // fmt.Println("Comparing current state with the previous snapshot:")
        compareSnapshots(oldSnapshot, newSnapshot)
        // Отложенное удаление временного файла
        defer os.Remove("/tmp/current_snapshot.txt")
    }
}




И к стати, вот это вот https://bir3yk.net/forum/topic_2642/ уже дыра в твоём сервере. Так что думай.
На свой страх и риск.


Не отвечаю на ЛС.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя Boo
сообщение 6.6.2024, 11:21
Сообщение #9


Стаж: 17 лет

Сообщений: 468
Благодарностей: 22
Полезность: 73

понял, спасибо! это лишь для теста мне )) не более а так ты прав на все 100
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Boo
сообщение 6.6.2024, 11:35
Сообщение #10


Стаж: 17 лет

Сообщений: 468
Благодарностей: 22
Полезность: 73

в целом это даже проще чем искать ссылки

Код
docker run -it -v $PWD:/data steamcmd/steamcmd:latest +login anonymous +force_install_dir /data +app_update 90 +quit




Но какая то шляпа )


Код
Connecting anonymously to Steam Public...OK
Waiting for client config...OK
Waiting for user info...OK
Please use force_install_dir before logon!
Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
Update state (0x61) downloading, progress: 6.21 (7137481 / 114978584)
Update state (0x61) downloading, progress: 31.83 (36596148 / 114978584)
Update state (0x61) downloading, progress: 70.49 (81043724 / 114978584)
Update state (0x61) downloading, progress: 100.00 (114978584 / 114978584)
Error! App '90' state is 0x10E after update job.


Отредактировал: Boo, - 6.6.2024, 11:46
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Boo
сообщение 6.6.2024, 12:44
Сообщение #11


Стаж: 17 лет

Сообщений: 468
Благодарностей: 22
Полезность: 73

ещё вопрос, может есть какой то аналог dproto для metamod ?

Отредактировал: Boo, - 6.6.2024, 13:15
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Gecko
сообщение 6.6.2024, 13:39
Сообщение #12
Стаж: 7 лет 4 месяца

Сообщений: 1247
Благодарностей: 518
Полезность: 345

Boo,
Цитата
Код
Connecting anonymously to Steam Public...OK
Waiting for client config...OK
Waiting for user info...OK
Please use force_install_dir before logon!
...


Код
steamcmd.sh +login ${STEAM_LOGIN} ${STEAM_PASSWORD} +force_install_dir

Попробуй указать реального пользователя и пароль вместо анонимного входа.
Чуть позже скину готовый конфиг в отдельной теме.


Цитата
ещё вопрос, может есть какой то аналог dproto для metamod ?

Для metamod-r - reunion, для metamod не подскажу.


Не отвечаю на ЛС.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: