• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Junk Code

Эксперт
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
994
Реакции
1,209
Часто встречаю(да что там часто? Постоянно) использование, так называемого,"JunkCode".
По прямому переводу("мусорный код") несложно догадаться что делает данное "явление".
Основное назначение это "видоизменение" основного выполняемого кода.
давайте разберемся как это выглядит на деле и стоит ли использовать данный метод?

для теста и наглядного примера пишем небольшую консольную программу, которая циклом будет выводить сообщение в консоль. При этом измерим скорость выполнения нужного участка кода при помощи двух методов: "точные часы"(std::chrono) и "счетчика высокого разрешения"(QueryPerformance*).

Код:
Expand Collapse Copy
#include <Windows.h>
#include <conio.h>
#include <chrono>
#include <iostream>

class IQueryTimer
{
public:
    IQueryTimer()
    {
        QueryPerformanceFrequency(&mqFreq);
    }
    ~IQueryTimer() {}

    void Start()
    {
        QueryPerformanceCounter(&mqStart);
    }
    void End()
    {
        QueryPerformanceCounter(&mqEnd);
    }
    double GetTimeInSeconds()
    {
        return (mqEnd.QuadPart - mqStart.QuadPart) / static_cast<double>(mqFreq.QuadPart);
    }
    double GetTimeInMilliseconds()
    {
        return (mqEnd.QuadPart - mqStart.QuadPart) / static_cast<double>(mqFreq.QuadPart)*1000.0;
    }
private:
    LARGE_INTEGER mqStart;
    LARGE_INTEGER mqEnd;
    LARGE_INTEGER mqFreq;
};
 
int main(int argc, char** argv)
{
    SetConsoleTitleA("Console");
    IQueryTimer Time; //задаем объект для теймера QueryPerformance   
    Time.Start(); //стартуем получая первое значение счетчика
        
    auto begin = std::chrono::steady_clock::now(); //получаем текущее значение с помощью точных часов
    
    //выполняем цикл
    for (size_t i = 0; i < 1000; i++)
    {   
        printf_s("\r%i iterations", i);
    }

    auto end = std::chrono::steady_clock::now();//получаем новое значение с помощью точных часов
    Time.End();//получаем новое значение счетчика
    
    auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin); //высчитываем потраценое время в мс


//выводим результаты
    std::cout << std::endl;
    std::cout << "Chrono Time: " << elapsed_ms.count() << " ms" << std::endl;
    std::cout << "Query  Time: " << Time.GetTimeInMilliseconds()  << " ms" << std::endl;
    _getch();
    return EXIT_SUCCESS;
}

Так это выглядит с точки зрения инструкций:
uwtqjrTeRtWAbAEZlnCfWw.png


теперь, используя самый примитивный JunkCode, немного разнообразим программу:
Код:
Expand Collapse Copy
#define JUNK_CODE        \
    __asm push eax            \
    __asm xor eax, eax         \
    __asm setpo al             \
    __asm push edx            \
    __asm xor edx, eax        \
    __asm sal edx, 2         \
    __asm xchg eax, edx     \
    __asm pop edx             \
    __asm or eax, ecx         \
    __asm pop eax

Код:
Expand Collapse Copy
JUNK_CODE
    for (size_t i = 0; i < 1000; i++)
    {
        printf_s("\r%i iterations", i);
    }
    JUNK_CODE

смотрим в отладчик что изменилось:
PQtF8nhrSm6w6fnfE_XRwg.png


Как видим в теле основного выполнения появились "левые" инструкции, что повлекло за собой видоизменение сигнатуры участка кода.

теперь будем вообще "брутальными" и добавим "мусора" в цикл:
Код:
Expand Collapse Copy
JUNK_CODE
    for (size_t i = 0; i < 1000; i++)
    {
        JUNK_CODE
        printf_s("\r%i iterations", i);
    }
    JUNK_CODE

смотрим:
XLi5mA__Tfa9vLNcZfowtw.png


вообще красота! Детектил бы какой-нибудь античит наш участок памяти в котором выполняется цикл, то после всех манипуляций он бы "ОфЕгел".

А теперь об огромном минусе, который перечеркивает на нет все выше предоставленное: режется скорость))
сравниваем:
cRcnvGDcRXujtZto_foizw.png

1) чистая программа - 32 мс
2) "Мусор вокруг" цикла - 37 мс
2) "Мусор вокруг и внутри" цикла - 41 мс
Цифры будут варьироваться, но увеличении скорости обработки будет расти с количеством добавленного "мусора".

Вывод:
В рамках данного примера цифры не значительные, но если брать во внимание применении данного метода в читах, функционал которого требует быстрых и точных вычислений, а количество итераций некоторых может достигать сотен тысяч - потери огромные. Используйте с умом и пониманием)))
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В их любимой кс это не нужно.
 
Часто встречаю(да что там часто? Постоянно) использование, так называемого,"JunkCode".
По прямому переводу("мусорный код") несложно догадаться что делает данное "явление".
Основное назначение это "видоизменение" основного выполняемого кода.
давайте разберемся как это выглядит на деле и стоит ли использовать данный метод?

для теста и наглядного примера пишем небольшую консольную программу, которая циклом будет выводить сообщение в консоль. При этом измерим скорость выполнения нужного участка кода при помощи двух методов: "точные часы"(std::chrono) и "счетчика высокого разрешения"(QueryPerformance*).

Код:
Expand Collapse Copy
#include <Windows.h>
#include <conio.h>
#include <chrono>
#include <iostream>

class IQueryTimer
{
public:
    IQueryTimer()
    {
        QueryPerformanceFrequency(&mqFreq);
    }
    ~IQueryTimer() {}

    void Start()
    {
        QueryPerformanceCounter(&mqStart);
    }
    void End()
    {
        QueryPerformanceCounter(&mqEnd);
    }
    double GetTimeInSeconds()
    {
        return (mqEnd.QuadPart - mqStart.QuadPart) / static_cast<double>(mqFreq.QuadPart);
    }
    double GetTimeInMilliseconds()
    {
        return (mqEnd.QuadPart - mqStart.QuadPart) / static_cast<double>(mqFreq.QuadPart)*1000.0;
    }
private:
    LARGE_INTEGER mqStart;
    LARGE_INTEGER mqEnd;
    LARGE_INTEGER mqFreq;
};
 
int main(int argc, char** argv)
{
    SetConsoleTitleA("Console");
    IQueryTimer Time; //задаем объект для теймера QueryPerformance  
    Time.Start(); //стартуем получая первое значение счетчика
       
    auto begin = std::chrono::steady_clock::now(); //получаем текущее значение с помощью точных часов
   
    //выполняем цикл
    for (size_t i = 0; i < 1000; i++)
    {  
        printf_s("\r%i iterations", i);
    }

    auto end = std::chrono::steady_clock::now();//получаем новое значение с помощью точных часов
    Time.End();//получаем новое значение счетчика
   
    auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin); //высчитываем потраценое время в мс


//выводим результаты
    std::cout << std::endl;
    std::cout << "Chrono Time: " << elapsed_ms.count() << " ms" << std::endl;
    std::cout << "Query  Time: " << Time.GetTimeInMilliseconds()  << " ms" << std::endl;
    _getch();
    return EXIT_SUCCESS;
}

Так это выглядит с точки зрения инструкций:
uwtqjrTeRtWAbAEZlnCfWw.png


теперь, используя самый примитивный JunkCode, немного разнообразим программу:
Код:
Expand Collapse Copy
#define JUNK_CODE        \
    __asm push eax            \
    __asm xor eax, eax         \
    __asm setpo al             \
    __asm push edx            \
    __asm xor edx, eax        \
    __asm sal edx, 2         \
    __asm xchg eax, edx     \
    __asm pop edx             \
    __asm or eax, ecx         \
    __asm pop eax

Код:
Expand Collapse Copy
JUNK_CODE
    for (size_t i = 0; i < 1000; i++)
    {
        printf_s("\r%i iterations", i);
    }
    JUNK_CODE

смотрим в отладчик что изменилось:
PQtF8nhrSm6w6fnfE_XRwg.png


Как видим в теле основного выполнения появились "левые" инструкции, что повлекло за собой видоизменение сигнатуры участка кода.

теперь будем вообще "брутальными" и добавим "мусора" в цикл:
Код:
Expand Collapse Copy
JUNK_CODE
    for (size_t i = 0; i < 1000; i++)
    {
        JUNK_CODE
        printf_s("\r%i iterations", i);
    }
    JUNK_CODE

смотрим:
XLi5mA__Tfa9vLNcZfowtw.png


вообще красота! Детектил бы какой-нибудь античит наш участок памяти в котором выполняется цикл, то после всех манипуляций он бы "ОфЕгел".

А теперь об огромном минусе, который перечеркивает на нет все выше предоставленное: режется скорость))
сравниваем:
cRcnvGDcRXujtZto_foizw.png

1) чистая программа - 32 мс
2) "Мусор вокруг" цикла - 37 мс
2) "Мусор вокруг и внутри" цикла - 41 мс
Цифры будут варьироваться, но увеличении скорости обработки будет расти с количеством добавленного "мусора".

Вывод:
В рамках данного примера цифры не значительные, но если брать во внимание применении данного метода в читах, функционал которого требует быстрых и точных вычислений, а количество итераций некоторых может достигать сотен тысяч - потери огромные. Используйте с умом и пониманием)))
Чек, там авто добавление джанка, как тебе?
Пожалуйста, авторизуйтесь для просмотра ссылки.
(не пиар сайта)
 
а какая разница? так или иначе "мусор" увеличивает время обработки. хоть что ты туда пихай))
Ну я просто сам не чекал ещё, так как в рашке буду только на след неделе, а вообще это прога как я понял для ленивых) вдруг пригодится)
 
а какая разница? так или иначе "мусор" увеличивает время обработки. хоть что ты туда пихай))
+ есть вероятность , что античиты все-таки смогут найти уникальную сигнатуру для какого-то куска кода (если конечно не вставлять мусор через каждое выражение)
оффтоп : какой отладчик на скриншотах ?
 
Последнее редактирование:
+ есть вероятность , что античиты все-таки смогут найти уникальную сигнатуру для какого-то куска кода (если конечно не вставлять мусор через каждое выражение)
оффтоп : какой отладчик на скриншотах ?
x32dbg
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
В любом случае увеличение времени не в 2-3 раза, соответственно терпимо с учётом того что этот мусор даёт со стороны уникальности кода до и после добавления мусора
 
В любом случае увеличение времени не в 2-3 раза, соответственно терпимо с учётом того что этот мусор даёт со стороны уникальности кода до и после добавления мусора
на самом деле нет, этот мусор ничего ровно не дает кроме потери производительности. мусорный бак не станет уникальней, если в него добавить мусора.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Джанк помогает в андетекте, я так понял ?
 
Назад
Сверху Снизу