Начинающий
-
Автор темы
- #1
Давным давно в тридесятом государстве, была __asm функция junk_code. Но с переходом на х64 про нее все забыли и забили, а может про нее многие и не знали, пешком под стол ходили в то время.
junk_code - добавляет в функцию рандомные байты не влияющие на ее работоспособность, как-бы.
Используя разные версии VS те или иные аналоги junk_code менялись. Одни переставали включаться в компоновку, другие в одной функции включались, в другой не включались.
И в один прекрасный день, я придумал как это решить, с использованием определенной функции, взятой с гита.
Данный код был внедрен в драйвер, динамическую библиотеку и приложение.
Тесты были произведены под действием античита MRAC. Но возможно код будет работать и под другие античиты, которые чекают сигнатуру функций.
На данном примере рассмотрим простую, стандартную функцию без junk_code и с junk_code
Вот пример стандартной функции без использования junk_code
А вот тут уже с использованием junk_code
Как мы можем видеть, сигнатура функции сильно поменялась.
Аргументы макрос может принимать любые, в данном случае это LINE - которая возвращает номер строки в которой она прописана. Но можно заменить на свои значения.
Сам макрос и его функции
Поменять алгоритм генерации рандомного значения можно в данной строке "fantastic_arg"
Все остальные constexpr служат для генерации тех или иных параметров при компиляции проекта.
Тегну тру кодеров данного раздела, что-бы услышать их величайшее мнение.
Amelechkin01
PasteSquad
desccc
Yesgoter
Tramadolid
Я про бонус забыл.
Обновлено 12.04.2024
junk_code - добавляет в функцию рандомные байты не влияющие на ее работоспособность, как-бы.
Используя разные версии VS те или иные аналоги junk_code менялись. Одни переставали включаться в компоновку, другие в одной функции включались, в другой не включались.
И в один прекрасный день, я придумал как это решить, с использованием определенной функции, взятой с гита.
Данный код был внедрен в драйвер, динамическую библиотеку и приложение.
Тесты были произведены под действием античита MRAC. Но возможно код будет работать и под другие античиты, которые чекают сигнатуру функций.
На данном примере рассмотрим простую, стандартную функцию без junk_code и с junk_code
Вот пример стандартной функции без использования junk_code
А вот тут уже с использованием junk_code
Как мы можем видеть, сигнатура функции сильно поменялась.
Аргументы макрос может принимать любые, в данном случае это LINE - которая возвращает номер строки в которой она прописана. Но можно заменить на свои значения.
Сам макрос и его функции
C++:
constexpr auto _s1 = __TIME__[6] - 48;
constexpr auto _s2 = __TIME__[7] - 48;
constexpr auto _h1 = __TIME__[0] - 48;
constexpr auto _h2 = __TIME__[1] - 48;
constexpr auto _m1 = __TIME__[3] - 48;
constexpr auto _m2 = __TIME__[4] - 48;
constexpr auto __tvtodw(__int64 high, __int64 low) { return high * 10 + low; }
constexpr auto _HOURS = __tvtodw(_h1, _h2) + 1;
constexpr auto _MINUTES = __tvtodw(_m1, _m2);
constexpr auto _SECONDS = __tvtodw(_s1, _s2);
constexpr auto _TIMEVAL = (_SECONDS + (_MINUTES * 60) + (_HOURS * 60 * 60));
inline auto fantastic(volatile __int64 _param_value)
{
volatile auto x = _param_value ^ _SECONDS;
volatile auto part1 = _SECONDS;
volatile auto part2 = (_MINUTES ^ _m2) * _s2;
volatile auto part3 = (_s1 * _MINUTES / _HOURS);
volatile auto partEnd1 = (part1 + part2 + 1);
volatile auto partEnd2 = x - part3;
volatile auto partEnd = partEnd2 / partEnd1;
return partEnd;
}
#define fantastic_arg(x) (((x * _SECONDS) + (x * (_MINUTES ^ _m2) * _s2) + (_s1 * _MINUTES / _HOURS) + x) ^ _SECONDS)
#define xor_fantastic(x) (fantastic(fantastic_arg(x)))
#define junk_code(x) (xor_fantastic(x+_TIMEVAL))
Все остальные constexpr служат для генерации тех или иных параметров при компиляции проекта.
Тегну тру кодеров данного раздела, что-бы услышать их величайшее мнение.
Amelechkin01
PasteSquad
desccc
Yesgoter
Tramadolid
Я про бонус забыл.
Многие использую так называемые "спуфы вызовов" spoofcall
У всех одна и таже сигнура кода.
Вот в этом и причина ваших банов. Меняйте ее.
spoofasm.asm:
PUBLIC _spoofer_stub
.code
_spoofer_stub PROC
mov r10, r10
xchg r11, r11
pop r11
xchg rdi, rdi
nop
add rsp, 8
xchg rax, rax
jmp next
nop
xchg r10, r10
nop
next:
xchg rax, rax
mov rax, [rsp + 24]
nop
nop
mov r10, [rax]
xchg r11, r11
mov [rsp], r10
nop
jmp next2
mov r10, [rax + 8]
nop
next2:
mov r10, [rax + 8]
nop
mov [rax + 8], r11
xchg r15, r15
mov [rax + 16], rdi
xchg rdi, rdi
lea rdi, fixup
nop
xchg rax, rax
mov [rax], rdi
jmp next3
mov [rax + 16], rdi
mov [rax + 8], r11
nop
next3:
mov rdi, rax
xchg rdi, rdi
mov rdi, rdi
xchg rdi, rdi
mov r10, r10
jmp r10
fixup:
xchg rdi, rdi
sub rsp, 16
xchg rcx, rcx
mov rcx, rdi
nop
mov rdi, [rcx + 16]
mov rcx, rcx
jmp QWORD PTR [rcx + 8]
_spoofer_stub ENDP
END
Вот в этом и причина ваших банов. Меняйте ее.
Обновлено 12.04.2024
C++:
inline auto fantastic(volatile __int64 _param_value)
{
xor_int(123456);
volatile auto x = _param_value ^ _SECONDS;
volatile auto part1 = _SECONDS;
volatile auto part2 = (_MINUTES ^ _m2) * _s2;
volatile auto part3 = (_s1 * _MINUTES / _HOURS);
volatile auto partEnd1 = (part1 + part2 + 1);
volatile auto partEnd2 = x - part3;
volatile auto partEnd = partEnd2 / partEnd1;
return partEnd;
}
C++:
static int mini_ttoi(const char* str)
{
int ret = xor_value_1(0);
while (*str >= '0' && *str <= '9')
{
ret *= xor_value_1(10);
ret += *str - '0';
str++;
}
return ret;
}
#define xor_int(v) [&](){ return mini_ttoi(xor_s(#v)); }()
Последнее редактирование: