Junk Code

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

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

Код:
#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;
}
Так это выглядит с точки зрения инструкций:


теперь, используя самый примитивный JunkCode, немного разнообразим программу:
Код:
#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
Код:
JUNK_CODE
    for (size_t i = 0; i < 1000; i++)
    {
        printf_s("\r%i iterations", i);
    }
    JUNK_CODE
смотрим в отладчик что изменилось:


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

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


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

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

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

Вывод:
В рамках данного примера цифры не значительные, но если брать во внимание применении данного метода в читах, функционал которого требует быстрых и точных вычислений, а количество итераций некоторых может достигать сотен тысяч - потери огромные. Используйте с умом и пониманием)))
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В их любимой кс это не нужно.
 
Пользователь
Статус
Оффлайн
Регистрация
1 Июл 2017
Сообщения
120
Реакции[?]
31
Поинты[?]
0
Часто встречаю(да что там часто? Постоянно) использование, так называемого,"JunkCode".
По прямому переводу("мусорный код") несложно догадаться что делает данное "явление".
Основное назначение это "видоизменение" основного выполняемого кода.
давайте разберемся как это выглядит на деле и стоит ли использовать данный метод?

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

Код:
#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;
}
Так это выглядит с точки зрения инструкций:


теперь, используя самый примитивный JunkCode, немного разнообразим программу:
Код:
#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
Код:
JUNK_CODE
    for (size_t i = 0; i < 1000; i++)
    {
        printf_s("\r%i iterations", i);
    }
    JUNK_CODE
смотрим в отладчик что изменилось:


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

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


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

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

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

Вывод:
В рамках данного примера цифры не значительные, но если брать во внимание применении данного метода в читах, функционал которого требует быстрых и точных вычислений, а количество итераций некоторых может достигать сотен тысяч - потери огромные. Используйте с умом и пониманием)))
Чек, там авто добавление джанка, как тебе?
Пожалуйста, авторизуйтесь для просмотра ссылки.
(не пиар сайта)
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Пользователь
Статус
Оффлайн
Регистрация
1 Июл 2017
Сообщения
120
Реакции[?]
31
Поинты[?]
0
а какая разница? так или иначе "мусор" увеличивает время обработки. хоть что ты туда пихай))
Ну я просто сам не чекал ещё, так как в рашке буду только на след неделе, а вообще это прога как я понял для ленивых) вдруг пригодится)
 
Пользователь
Статус
Оффлайн
Регистрация
15 Июн 2017
Сообщения
81
Реакции[?]
46
Поинты[?]
0
а какая разница? так или иначе "мусор" увеличивает время обработки. хоть что ты туда пихай))
+ есть вероятность , что античиты все-таки смогут найти уникальную сигнатуру для какого-то куска кода (если конечно не вставлять мусор через каждое выражение)
оффтоп : какой отладчик на скриншотах ?
 
Последнее редактирование:
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
+ есть вероятность , что античиты все-таки смогут найти уникальную сигнатуру для какого-то куска кода (если конечно не вставлять мусор через каждое выражение)
оффтоп : какой отладчик на скриншотах ?
x32dbg
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
520
Реакции[?]
95
Поинты[?]
2K
В любом случае увеличение времени не в 2-3 раза, соответственно терпимо с учётом того что этот мусор даёт со стороны уникальности кода до и после добавления мусора
 
Я лучше тебя
Участник
Статус
Оффлайн
Регистрация
31 Июл 2017
Сообщения
383
Реакции[?]
448
Поинты[?]
1K
В любом случае увеличение времени не в 2-3 раза, соответственно терпимо с учётом того что этот мусор даёт со стороны уникальности кода до и после добавления мусора
на самом деле нет, этот мусор ничего ровно не дает кроме потери производительности. мусорный бак не станет уникальней, если в него добавить мусора.
 
Perfect CFG Seller
Забаненный
Статус
Оффлайн
Регистрация
2 Янв 2018
Сообщения
303
Реакции[?]
76
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я лучше тебя
Участник
Статус
Оффлайн
Регистрация
31 Июл 2017
Сообщения
383
Реакции[?]
448
Поинты[?]
1K
Сверху Снизу