Пользователь
			
			
				
					
				
			
		Пользователь
		- Статус
- Оффлайн
- Регистрация
- 13 Май 2023
- Сообщения
- 253
- Реакции
- 30
Давным давно в тридесятом государстве, была  __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))Поменять алгоритм генерации рандомного значения можно в данной строке "fantastic_arg"
Все остальные 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)); }()
			
				Последнее редактирование: 
			
		
	
								
								
									
	
								
							
							 
				 
 
		

 
 
		
 
 
		 
 
		 
 
		 
 
		