Skocz do zawartości

Margonem - szczegóły nowego antybota


misha6969
# CSH External VIP Project

Masz dosyć problemów z czynnikiem zaufania w CS2 lub notorycznymi banami?

Sprawdź CSH External VIP Project.


Więcej informacji  

Rekomendowane odpowiedzi

Dzień dobry wszystkim, podczas mojej spokojnej i legalnej gry w Margonem zauważyłem, że serwer mnie zaśmiecia jakimiś podejrzanymi skryptami. Co kilka(naście) minut wysyła kawałek Javascripta i go wykonuje, oto on:

 

Spoiler
(function() {
    const _gFunc = window._g; // _g to funkcja wysyłająca dane do serwera
    let G = window["g"];
    let HERO = window["hero"];
    let MAP = window["map"];
    const f1 = HERO["go"]; // oryginalna funkcja hero.go (potem będzie zastąpiona inną)
    const f2 = window["saveLastCords"]; // analogicznie jak wyżej
    const f3 = MAP["manageClickMCLC"]; // jw.
    const f4 = HERO["searchPath"]; // jw.
    let funcWasCall = false;
    let sendInNextRequest = false;
    const engineToString = function(e) { // to po prostu zwraca e.ev.toString()
        let asd = e["ev"].toString() + "i";
        return asd.slice(0, -1);
    };
    const crazy = function(e) { // funkcja hashująca stringa
        for (var r = 0, i = 0; i < e.length; i++) r = (r << 5) - r + e.charCodeAt(i), r &= r;
        return r;
    };
    const mousedown = function(e) {
        if (!e.isTrusted) return;
        if (funcWasCall) return;
        HERO["go"] = function(d) {
            f1(d);
            afterUseOverrideFunc("aaaaaaaaaaaaaaaa"); // w miejsce "aaaaaa" jest jakiś unikalny token
        };
        window["saveLastCords"] = function(e) {
            f2(e);
            afterUseOverrideFunc("aaaaaaaaaaaaaaaa");
        };
        MAP["manageClickMCLC"] = function() {
            f3();
            afterUseOverrideFunc("aaaaaaaaaaaaaaaa");
        };
        HERO["searchPath"] = function(dx, dy) {
            f4(dx, dy);
            afterUseOverrideFunc("aaaaaaaaaaaaaaaa");
        };
    };
    const keydown = function(e) {
        if (!e.isTrusted) return;
        if (funcWasCall) return;
        HERO["go"] = function(d) {
            f1(d);
            afterUseOverrideFunc("aaaaaaaaaaaaaaaa");
        };
    };
    const mouseup = function(e) {
        if (!e.isTrusted) return;
        delayComeBackToNormal();
    };
    const keyup = function(e) {
        if (!e.isTrusted) return;
        delayComeBackToNormal();
    };
    const delayComeBackToNormal = function() {
        setTimeout(function() {
            funcWasCall = false;
            backAllFunc();
            if (funcWasCall) removeAllListeners();
        }, 0);
    };
    const override_qFunc = function(token) {
        window._g = function(task, callback) {
            if (G["heroIdle"]) { // jeśli się obecnie nie ruszamy...
                if (HERO["ml"].length) { // i mamy jakieś oczekujące ruchy...
                    let c = crazy(token + HERO["ml"].join(";"));
                    G["tmpParams"].push("mlsig=" + c);
                    _gFunc(task, callback); // wysyłamy mlsig
                    back_qFunc();
                    backAllFunc();
                    removeAllListeners();
                    return;
                }
                if (!sendInNextRequest) {
                    sendInNextRequest = true;
                    _gFunc(task, callback);
                    addAllListeners();
                    return;
                }
            }
            _gFunc(task, callback);
            back_qFunc();
            if (!sendInNextRequest) addAllListeners();
            sendInNextRequest = false;
        };
    };
    const back_qFunc = function() { // nadpisuje _g, żeby móc wstrzyknąć mlsig do następnego żądania
        window._g = _gFunc;
    };
    const afterUseOverrideFunc = function(token) {
        if (funcWasCall) return;
        funcWasCall = true;
        override_qFunc(token);
    };
    const backAllFunc = function() { // przywraca nadpisane funkcje do ich oryginalnych wariantów
        HERO["go"] = f1;
        window["saveLastCords"] = f2;
        MAP["manageClickMCLC"] = f3;
        HERO["searchPath"] = f4;
    };
    const removeAllListeners = function() {
        document.removeEventListener("mouseup", mouseup);
        document.removeEventListener("mousedown", mousedown, true);
        document.removeEventListener("keydown", keydown);
        document.removeEventListener("keyup", keyup);
    };
    const addAllListeners = function() {
        document.addEventListener("mouseup", mouseup);
        document.addEventListener("mousedown", mousedown, true);
        document.addEventListener("keydown", keydown);
        document.addEventListener("keyup", keyup);
    };
    const pushToParams = function(c) { // tmpParams to jednorazowe dane wysyłane do serwera; ta funkcja dodaje acksig= do następnego żądania
        G["tmpParams"].push("acksig=" + c);
    };
    const sendFirstVerify = function() { // dane wysyłane do serwera automatycznie po uruchomieniu tego skryptu: prawdopodobnie taka "informacja" dla serwera żeby oczekiwał od nas kolejnych danych (mlsig)
        pushToParams(crazy("aaaaaaaaaaaaaaaa" + engineToString(G)));
    };
    addAllListeners();
    sendFirstVerify();
}());

 

Pozwoliłem sobie wyczyścić skrypt ze śmieci i dodać kilka komentarzy, naturalnie ich nie było w pierwotnym kodzie. W każdym razie Garmory ostatnio na forum Margonem chwaliło się, że działania przeciwko botom zostały wzmożone, więc naturalnym jest sądzić, że powyższy skrypt jest częścią tej walki.

 

Skrypt pokrótce opisany (według mojej niewielkiej znajomości JS-a, opis niekoniecznie musi być poprawny)
1. Skrypt wykonuje się po cichu podczas gry w losowych momentach (jest wysyłany przez serwer)
2. Skrypt dodaje callbacki na mysz i klawiaturę, a w nich nadpisuje funkcja używane do poruszania się postacią (hero.go, hero.searchPath itp.)
3. Gdy się ruszysz, skrypt hashuje Twoje oczekujące ruchy (parametr "ml") i doczepia hash (parametr "mlsig") do żądania.

 

Ten skrypt prawdopodobnie ma służyć walce z botami, które ręcznie manipulują żądaniami (parametrem "ml", żeby się ruszać) albo bezpośrednio wywołują chronione funkcje (co skutkuje niewysłaniem parametru mlsig). Jeśli jesteś autorem botów do Margonem, to miej na uwadze powyższe zabezpieczenie!

Odnośnik do komentarza

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Regulamin. Polityka prywatności