• XSS.stack #1 – первый литературный журнал от юзеров форума

прочее Дерева переписыватель

Какие бы патерны не были. Оптимизация все равно будет ты ведь не сможешь обойти IR этап. Даже если ты укажешь флаг.

Другими словами нужен скриншот как это работает на практике. Поэтому я подожду, когда кто-нибудь зальет скрин =)
Оптимизатор вырезать будет то что может предсказать, как же так сделать что бы оптимизатор не смог предсказать содержимое переменной или результат функции? Волатильность, экспорты, pragma, ответ апи, что еще упускаю?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Оптимизатор вырезать будет то что может предсказать, как же так сделать что бы оптимизатор не смог предсказать содержимое переменной или результат функции? Волатильность, экспорты, pragma, ответ апи, что еще упускаю?
В IR приходит уже готовое от AST. Там уже всё построено. Даже если переменная не определена и таких переменных много он просто сократит их.
 
В IR приходит уже готовое от AST. Там уже всё построено. Даже если переменная не определена и таких переменных много он просто сократит их.
int x = GetLastError();
if (x == 123) {
..
exported_variable += x - 30;
}
else {
api(x ^ (x * 5));
}
Ну и че он тут сократит?

Или тут?
int x = PragmaNotOptimizedFunction(17);
exported_variable += x - 30;

а тут?
if (exported_variable){
(exported_variable = PragmaNotOptimizedFunction(17);
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Другими словами нужен скриншот как это работает на практике. Поэтому я подожду, когда кто-нибудь зальет скрин
Скриншоты уже были, в частности, здесь при включенной оптимизации компилятор ничего не вырезает потому, что мусорный код оперирует глобальными переменными, состояние которых, очевидно, не известно на этапе компиляции, поэтому и свернуть их через constant folding и другие алгоритмы не возможно: https://xss.pro/threads/42944/

Не говоря уже о непрозрачных предикатах и других вещах, которые в том числе будут использоваться и в морферах на базе IR. И кто сказал, что IR не оптимизируется? В LLVM очень много оптимизаций на базе IR.
 
Как то была дисскуссия между мной, дилдой и жопкой(вот это я пизданул, сам в ахуе), про IR где он был бы хорош, но там совсем не про обфускацию там про год мод посылания всех аверов с реверсерами.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну и че он тут сократит?
Я не компилятор =)
 
Я не компилятор =)
Вот нифига себе! В дебри компиля залез, в самое нутро и прикидываеться не компилятором.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Как то была дисскуссия между мной, дилдой и жопкой(вот это я пизданул, сам в ахуе)
"Шептун, Дилда и Жопка" - звучит, как такой своебразный порнофильм, стилизованный под сказки братьев Гримм...
 
"Шептун, Дилда и Жопка" - звучит, как такой своебразный порнофильм, стилизованный под сказки братьев Гримм...
Прям как у Дюма. Ну или как картинка про богатырей. Хз вот если я на святого духа начну претендовать не нарушит ли это правило форума. А так то да, романтика.
 
Я не компилятор =)
Смотри что он оптимизирует
exported_variable += x - 30;
будет
exported_variable += 93;
потому что известно что x == 123
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А ну да точно он подставит значение.
 
Интересно, но спорно, да можно замусорить какой-то самописный алгоритм типа RC4 (на который лютый стояк у АВ). Зачастую сигнатуры вешают на какой-то код вокруг вызова WinAPI, надо морфить последовательность push, mov, call, константы этих операторов и т.д.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
ASCII-строку*
ASCII - 7ми битовая строка, ANSI - 8ми битовая, на российских вендах кодировки 1251 и 866 - это ANSI-строки.
 
Интересно, но спорно, да можно замусорить какой-то самописный алгоритм типа RC4 (на который лютый стояк у АВ). Зачастую сигнатуры вешают на какой-то код вокруг вызова WinAPI, надо морфить последовательность push, mov, call, константы этих операторов и т.д.
C++:
#include <cstdio>
#include <cstring>
#include <forward_list>

// Struct to hold RC4 state
struct rc4_state {
    int x, y;
    int m[256];
};

// Function to initialize the RC4 state using a key
void rc4_setup(rc4_state* state, const unsigned char* key, const int length) {
    int i, j = 0, k = 0;
    auto& m = state->m;

    // Initialize permutation array
    for (i = 0; i < 256; ++i) {
        m[i] = i;
    }

    // Randomize permutation array using key
    for (i = 0; i < 256; ++i) {
        j = j + m[i] + key[k] & 0xFF; // Use bitwise AND for wrapping
        std::swap(m[i], m[j]); // Swap elements in the array
        if (++k >= length) k = 0;
    }

    state->x = 0;
    state->y = 0;
}

// Function to encrypt/decrypt data using the RC4 state
void rc4_crypt(rc4_state* state, unsigned char* data, int length) {
    int x = state->x, y = state->y;
    auto& m = state->m;

    for (int i = 0; i < length; ++i) {
        x = x + 1 & 0xFF; // Use bitwise AND for wrapping
        const int a = m[x];
        y = y + a & 0xFF; // Use bitwise AND for wrapping
        const int b = m[y];
        m[x] = b;
        m[y] = a;
        data[i] ^= m[a + b & 0xFF]; // XOR data with permuted array value
    }

    state->x = x;
    state->y = y;
}

// Main function demonstrating usage of RC4 encryption/decryption
int main() {
    const auto key = "12345678";
    char data[] = "hello";
    rc4_state state;

    rc4_setup(&state, reinterpret_cast<const unsigned char*>(key), strlen(key));
    rc4_crypt(&state, reinterpret_cast<unsigned char*>(data), strlen(data));
    printf("Encrypted: %s\n", data);

    rc4_setup(&state, reinterpret_cast<const unsigned char*>(key), strlen(key));
    rc4_crypt(&state, reinterpret_cast<unsigned char*>(data), strlen(data));
    printf("Decrypted: %s\n", data);

    return  0;
}

ок. где тут нужно вставлять треш тогда?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
ок. где тут нужно вставлять треш тогда?
Ну, учитывая, что в алгоритме нет прям слишком говорящих констант, я бы просто вставил какой-то базовый мусорный код в каждую строчку и посмотрел, как это повлияет на детекты.
 
Интересно, но спорно, да можно замусорить какой-то самописный алгоритм типа RC4 (на который лютый стояк у АВ). Зачастую сигнатуры вешают на какой-то код вокруг вызова WinAPI, надо морфить последовательность push, mov, call, константы этих операторов и т.д.
Кстати морф констант это важная тема, как это решает наш ТС? Проблема ведь не в том что бы ее морфить а в том что бы опознать что это константа которую стоить морфить, с уровня сорца уже не тривиальная задача.
Антиреверс и антидект это разные штуки, накидать масок на константы самое простое.
На самом деле реально хорошая для малвары тема всплывала именно в той порно дискуссии.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Кстати морф констант это важная тема, как это решает наш ТС? Проблема ведь не в том что бы ее морфить а в том что бы опознать что это константа которую стоить морфить, с уровня сорца уже не тривиальная задача
Ты у меня спрашиваешь? Я человек простой, встретил литерал внутри функции/метода - заморфил его. Какие-то типичные литералы, типа 0 (если мы говорим о числах), наверное, можно не трогать, так как они часто компилятся во что-то типа условного "xor eax, eax", но опять же это зависит от ситуации.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх