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

Методы обхода AV в исходниках c++

kseGB

HDD-drive
Пользователь
Регистрация
10.01.2020
Сообщения
39
Реакции
11
Прошу делиться методами обхода AV через исходники в C++
вот мой первый метод
в начале файла добавляем рандомизированную функцию задержки + вычисление
C++:
int n = rand() % 10;
    int r = 1;

              if (n == 0);
              r = +11;
              r = n * 400;
              Sleep(155);
              if (n == 1);
              r = +12;
              r = n * 300;
              Sleep(145);
              if (n == 2);
              r = +13;
              r = n * 200;
              Sleep(135);
              if (n == 3);
              r = +14;
              r = n * 190;
              Sleep(125);
              if (n == 4);
              r = +15;
              r = n * 180;
              Sleep(115);
              if (n == 5);
              r = +16;
              r = n * 160;
              Sleep(105);
              if (n == 6);
              r = +17;
              r = n * 150;
              Sleep(85);
              if (n == 7);
              r = +18;
              r = n * 140;
              Sleep(65);
              if (n == 8);
              r = +19;
              r = n * 130;
              Sleep(55);
              if (n == 9);
              r = +20;
              r = n * 120;
              Sleep(45);
              if (n == 10);
              r = +21;
              r = n * 110;
              Sleep(35);
 
Прошу делиться методами обхода AV через исходники в C++
вот мой первый метод
в начале файла добавляем рандомизированную функцию задержки + вычисление
C++:
int n = rand() % 10;
    int r = 1;

              if (n == 0);
              r = +11;
              r = n * 400;
              Sleep(155);
              if (n == 1);
              r = +12;
              r = n * 300;
              Sleep(145);
              if (n == 2);
              r = +13;
              r = n * 200;
              Sleep(135);
              if (n == 3);
              r = +14;
              r = n * 190;
              Sleep(125);
              if (n == 4);
              r = +15;
              r = n * 180;
              Sleep(115);
              if (n == 5);
              r = +16;
              r = n * 160;
              Sleep(105);
              if (n == 6);
              r = +17;
              r = n * 150;
              Sleep(85);
              if (n == 7);
              r = +18;
              r = n * 140;
              Sleep(65);
              if (n == 8);
              r = +19;
              r = n * 130;
              Sleep(55);
              if (n == 9);
              r = +20;
              r = n * 120;
              Sleep(45);
              if (n == 10);
              r = +21;
              r = n * 110;
              Sleep(35);
Это максимум обход эмулятора, и тот кривой.
 
Это максимум обход эмулятора, и тот кривой.
Главное что рабочий и обходит AV !
По поводу кривой, объясните! Или у Вас ума хватило только на слово 'кривой'?
В теме ведь указано : Прошу делиться методами обхода AV ! а не обсирать чужой код !!! с целю набивания постов !
 
Главное что рабочий и обходит AV !
По поводу кривой, объясните! Или у Вас ума хватило только на слово 'кривой'?
В теме ведь указано : Прошу делиться методами обхода AV ! а не обсирать чужой код !!! с целю набивания постов !
И какие av он обходит? А почему кривой:
1. Все нормальные эмуляторы просто пропускают команду sleep
2. Как команда sleep, так и rand, настараживают антивирус
3. Все арифметические операции забиты руками, вместо этого в это место лучшее трешген поставить
 
И какие av он обходит? А почему кривой:
1. Все нормальные эмуляторы просто пропускают команду sleep
2. Как команда sleep, так и rand, настараживают антивирус
3. Все арифметические операции забиты руками, вместо этого в это место лучшее трешген поставить
можно пример трешген
 
Пожалуйста, обратите внимание, что пользователь заблокирован
вот мой первый метод
Надо совершенствовать метод,
1) добавить максимальную рендомизацию чисел.
2) слип заменить на что-то другое, в винде есть множество вариантов сделать задержку (посмотри книгу Рихтера, конкретно про разные таймеры и коллбеки). Потому как sleep аверы реально могут легко обойти даже автоматикой, а вот если добавить какие-то апи вида WaitableTimer + вызов функции по окончании, с проверкой сколько же реально прошло времени - то уже чуть посложнее.
 
Делай задержку мат вычислениями. Это самый неявный способ. И результат мат вычислений используй в реальной работе дешифровщика полезной нагрузки. Таким образом убиваешь 2 зайцев сразу - мат вычисления это некий трешген, а сам подсчёт, если он вычислительно сложный - антиэмуль. Если сделаешь мат выражения разные, но при этом дающие один и тот же результат - получаешь полиморфный мусор и антиэмуль. Потом уже над этим полиморфным мусором (твоим мат выражением) проводишь операции разбиения на более сложные сущности. Например у тебя в мат выражении фигурирует цифра 5. Преврати ее в вид
parseInt('opf4opf5opf6'.split('opf')[2])
и ты это вставишь вместо инта в исходник. При этом разделитель делаешь рандомный. И мусорные 4,6 - тоже должны быть рандомные. Таким образом ты с 1 инта в твоём полиморфном мат выражении породил уже вызов апи и операцию со строкой, породив при этом новую строку 'opf4opf5opf6'. Операцию над которой тоже можешь выполнить полиморфным способом. И так далее.
2) второй алгоритм. Мусорных вызовов апи. Получаешь ту же пятерку на предыдущем шаге. А заранее у тебя ассоциативный массив составлен, где ключ это число, а значения к этому ключу - различные апи вызовы, которые дают это число. Часто тот же вин апи может возвращать 0 или 1. Апи по работе со строками может возвращать вообще любые числа, если в аргументах ты передаёшь строку и поиск позиции какого то символа в ней. Делаешь в общем такой ассоциативный массив, чем больше значений, у ключей, тем лучше. Но ты скажешь, какова вероятность вообще, что для нужной нам 5, в нашем ассоциативном массиве будет подходящий ключ? Правильно, никакой. По этому мы 5 разбиваем на слагаемые, так, чтобы одно слагаемое было существующим ключом в твоём ассоциативном массиве, а второе слагаемое - недостающей разницей, чтобы получилось 5. Таким образом получаешь вид api call + k = n. Где n это твоя 5. А api call это opaque predicate. k - слагаемое, просчитанное на основе opaque predicate, чтобы в итоге получить n.


Подробно тут: https://xss.pro/threads/34637/
 
Последнее редактирование модератором:
них не понял, но очень интересно
Делай задержку мат вычислениями. Это самый неявный способ. И результат мат вычислений используй в реальной работе дешифровщика полезной нагрузки. Таким образом убиваешь 2 зайцев сразу - мат вычисления это некий трешген, а сам подсчёт, если он вычислительно сложный - антиэмуль. Если сделаешь мат выражения разные, но при этом дающие один и тот же результат - получаешь полиморфный мусор и антиэмуль. Потом уже над этим полиморфным мусором (твоим мат выражением) проводишь операции разбиения на более сложные сущности. Например у тебя в мат выражении фигурирует цифра 5. Преврати ее в вид
parseInt('opf4opf5opf6'.split('opf')[2])
и ты это вставишь вместо инта в исходник. При этом разделитель делаешь рандомный. И мусорные 4,6 - тоже должны быть рандомные. Таким образом ты с 1 инта в твоём полиморфном мат выражении породил уже вызов апи и операцию со строкой, породив при этом новую строку 'opf4opf5opf6'. Операцию над которой тоже можешь выполнить полиморфным способом. И так далее.
2) второй алгоритм. Мусорных вызовов апи. Получаешь ту же пятерку на предыдущем шаге. А заранее у тебя ассоциативный массив составлен, где ключ это число, а значения к этому ключу - различные апи вызовы, которые дают это число. Часто тот же вин апи может возвращать 0 или 1. Апи по работе со строками может возвращать вообще любые числа, если в аргументах ты передаёшь строку и поиск позиции какого то символа в ней. Делаешь в общем такой ассоциативный массив, чем больше значений, у ключей, тем лучше. Но ты скажешь, какова вероятность вообще, что для нужной нам 5, в нашем ассоциативном массиве будет подходящий ключ? Правильно, никакой. По этому мы 5 разбиваем на слагаемые, так, чтобы одно слагаемое было существующим ключом в твоём ассоциативном массиве, а второе слагаемое - недостающей разницей, чтобы получилось 5. Таким образом получаешь вид api call + k = n. Где n это твоя 5. А api call это opaque predicate. k - слагаемое, просчитанное на основе opaque predicate, чтобы в итоге получить n.
 
Что именно не ясно?
Выложи реализацию хотя-бы на псевдокоде тогда понятний будет. Человеку который в программировании сложной математикой не занимался как это реализовать трудно преставить.
 
Последнее редактирование:
Выложи реализацию хотя-бы на псевдокоде тогда понятний будет. Человеку который в программировании сложной математикой не занимался как это реализовать трудно преставить.
Простой пример. Есть полезная нагрузка в зашифрованном виде. Она зашифрована по какому-то алгоритму с ключом 634734. Ключа нет нигде в явном виде. На EP стоит куча математических действий, занимающих определённое время ( допустим 15 секунд. ), в итоге вычисляющих ключ. Ключ и используется для расшифровки полезной нагрузки. Если АВ скипнет математику - полезная нагрузка не выполнится и логика программы сломается. Надеюсь, доступно обьяснил.
 


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