Vector, углы обзора, неправильный подход к записи памяти. И много чего.Хочу сделать свой собственный чит,
Чтоб не детектился. Я слышал, что valve детектит External читы по сигнатурам. Это их единственный способ узнать, читерю я или нет?
А как тогда реализовать обычный bhop? Там без хэндла и записи памяти никак. Все externalы в пуб. доступе используют handle.Вальв дампят все процессы которые имеют открытые хендлы к ксго. даже если там нет флага на запись
Из драйвера можно без хэндла.А как тогда реализовать обычный bhop? Там без хэндла и записи памяти никак. Все externalы в пуб. доступе используют handle.
Не сможешь. На bhop только как-то реализовать через mouse scroll input или эмулировать нажатие.. Чуваки писали что можно через Arduino.Из драйвера можно без хэндла.
Arduino для VAC куда катиться мирНе сможешь. На bhop только как-то реализовать через mouse scroll input или эмулировать нажатие.. Чуваки писали что можно через Arduino.
Arduino для VAC куда катиться мир
Я не изучал VAC,но знаю, что он просматривает открытые HANDLE к своему процессу(что и сказал Blick1337) т.к это единственный способ обнаружить присоединённый HANDLE к вашему процессу.Хочу сделать свой собственный чит,
Чтоб не детектился. Я слышал, что valve детектит External читы по сигнатурам. Это их единственный способ узнать, читерю я или нет?
typedef struct _OBJECT_FULL_HANDLE_INFORMATION
{
HANDLE handle;
INT ObjectTypeIndex;
PVOID Object;
} OBJECT_FULL_HANDLE_INFORMATION, * POBJECT_FULL_HANDLE_INFORMATION;
INLINE auto is_object_exist_proc(PSYSTEM_HANDLE_INFORMATION handle_info, PVOID Object, INT pid, ULONG access = NULL) -> ULONG
{
ULONG number = NULL;
for (ULONG i = NULL; i < handle_info->NumberOfHandles; i++)
{
SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = handle_info->Handles[i];
if (handleInfo.UniqueProcessId == pid)
{
if (handleInfo.Object == Object && access)
{
if ((handleInfo.GrantedAccess & access) != NULL)
{
std::cout << "handle value ->\t" << std::hex << handleInfo.HandleValue << '\n';
number++;
}
}
else if (handleInfo.Object == Object)
{
std::cout << "handle value ->\t" << std::hex << handleInfo.HandleValue << '\n';
number++;
}
}
}
return number;
}
//Only mutate code
class handle_attached
{
private:
PVOID nt_close = NULL;
PVOID nt_query_system_information = NULL;
PVOID nt_query_object = NULL;
PVOID nt_dublicate_object = NULL;
OBJECT_FULL_HANDLE_INFORMATION process_query_inf = { NULL };
INLINE auto init_struct() -> bool
{
if (nt_close && nt_query_system_information)
return TRUE;
nt_close = LI_FN(NtClose).nt_cached();
nt_query_system_information = LI_FN(NtQuerySystemInformation).nt_cached();
nt_query_object = LI_FN(NtQueryObject).nt_cached();
nt_dublicate_object = LI_FN(NtDuplicateObject).nt_cached();
return nt_close && nt_query_system_information && nt_query_object && nt_dublicate_object;
}
public:
NO_INLINE auto is_handle_attached() -> VOID
{
bool is_detect = FALSE;
ULONG access_process = PROCESS_VM_WRITE | PROCESS_VM_READ;
INT old_pid = NULL;
ULONG ret_lenght = NULL;
PVOID buffer = NULL;
NTSTATUS nt_status = STATUS_UNSUCCESSFUL;
if (!init_struct())
return;
if (
process_query_inf.ObjectTypeIndex
)
{
process_query_inf.handle= NULL;
goto start_check;
}
process_query_inf.handle= OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, (DWORD)NtCurrentTeb()->ClientId.UniqueProcess);
if (process_query_inf.handle)
{
start_check:
nt_status = reinterpret_cast<decltype(&NtQuerySystemInformation)>(nt_query_system_information)(SystemHandleInformation, &ret_lenght, ret_lenght, &ret_lenght);
while (nt_status == STATUS_INFO_LENGTH_MISMATCH)
{
if (buffer != NULL)
crt_wrapper::free(buffer);
buffer = crt_wrapper::malloc(ret_lenght);
nt_status = reinterpret_cast<decltype(&NtQuerySystemInformation)>(nt_query_system_information)(SystemHandleInformation, buffer, ret_lenght, &ret_lenght);
}
if (!NT_SUCCESS(nt_status))
{
goto close_handle;
}
//Get informathion about object
auto handle_info = reinterpret_cast<PSYSTEM_HANDLE_INFORMATION>(buffer);
//We have type
if (
!process_query_inf.ObjectTypeIndex
)
{
for (ULONG i = NULL; i < handle_info->NumberOfHandles; i++)
{
SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = handle_info->Handles[i];
if (handleInfo.UniqueProcessId == reinterpret_cast<USHORT>(NtCurrentTeb()->ClientId.UniqueProcess))
{
if (handleInfo.HandleValue == reinterpret_cast<USHORT>(process_query_inf.handle))
{
process_query_inf.ObjectTypeIndex = handleInfo.ObjectTypeIndex;
process_query_inf.Object = handleInfo.Object;
}
}
}
}
handle_info = reinterpret_cast<PSYSTEM_HANDLE_INFORMATION>(buffer);
for (ULONG i = NULL; i < handle_info->NumberOfHandles; i++)
{
SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = handle_info->Handles[i];
if (old_pid != handleInfo.UniqueProcessId && handleInfo.UniqueProcessId != reinterpret_cast<USHORT>(NtCurrentTeb()->ClientId.UniqueProcess))//Try optimizathion by don't check not corrupted PID
{
old_pid = handleInfo.UniqueProcessId;
if(
is_object_exist_proc(handle_info, process_query_inf.Object, handleInfo.UniqueProcessId, access_process)
)
{
std::cout << "PID attached ->\t" << std::dec << handleInfo.UniqueProcessId << '\n';
}
}
}
}
close_handle:
crt_wrapper::free(buffer);
if (process_query_inf.handle)
reinterpret_cast<decltype(&NtClose)>(nt_close)(process_query_inf.handle);
return;
}
В чём проблема юзать в ядреНе сможешь. На bhop только как-то реализовать через mouse scroll input или эмулировать нажатие.. Чуваки писали что можно через Arduino.
СпасибоПеред тем как писать чит для начала изучи как работает античит.
Вальв дампят все процессы которые имеют открытые хендлы к ксго. даже если там нет флага на запись
спасибо огромное за информацию!Я не изучал VAC,но знаю, что он просматривает открытые HANDLE к своему процессу(что и сказал Blick1337) т.к это единственный способ обнаружить присоединённый HANDLE к вашему процессу.
Пояснение работы обнаружение:
В NtQuerySystemInformation существуют классы SystemHandleInformation/SystemExtendedHandleInformation,который передают информацию об открытых HANDLE'ах.
Всякий раз,когда вы вызываете OpenProcess/NtOpenProcess вызываетсяПожалуйста, авторизуйтесь для просмотра ссылки.,который вызываетПожалуйста, авторизуйтесь для просмотра ссылки..
Вот сам пример кода обнаружение открытого HANDLE к вас:
При написания чита, просто помните, что не нужно поднимать красные флаги AC(особенно на серверной части)Посмотреть вложение 238160C++:typedef struct _OBJECT_FULL_HANDLE_INFORMATION { HANDLE handle; INT ObjectTypeIndex; PVOID Object; } OBJECT_FULL_HANDLE_INFORMATION, * POBJECT_FULL_HANDLE_INFORMATION; INLINE auto is_object_exist_proc(PSYSTEM_HANDLE_INFORMATION handle_info, PVOID Object, INT pid, ULONG access = NULL) -> ULONG { ULONG number = NULL; for (ULONG i = NULL; i < handle_info->NumberOfHandles; i++) { SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = handle_info->Handles[i]; if (handleInfo.UniqueProcessId == pid) { if (handleInfo.Object == Object && access) { if ((handleInfo.GrantedAccess & access) != NULL) { std::cout << "handle value ->\t" << std::hex << handleInfo.HandleValue << '\n'; number++; } } else if (handleInfo.Object == Object) { std::cout << "handle value ->\t" << std::hex << handleInfo.HandleValue << '\n'; number++; } } } return number; } //Only mutate code class handle_attached { private: PVOID nt_close = NULL; PVOID nt_query_system_information = NULL; PVOID nt_query_object = NULL; PVOID nt_dublicate_object = NULL; OBJECT_FULL_HANDLE_INFORMATION process_query_inf = { NULL }; INLINE auto init_struct() -> bool { if (nt_close && nt_query_system_information) return TRUE; nt_close = LI_FN(NtClose).nt_cached(); nt_query_system_information = LI_FN(NtQuerySystemInformation).nt_cached(); nt_query_object = LI_FN(NtQueryObject).nt_cached(); nt_dublicate_object = LI_FN(NtDuplicateObject).nt_cached(); return nt_close && nt_query_system_information && nt_query_object && nt_dublicate_object; } public: NO_INLINE auto is_handle_attached() -> VOID { bool is_detect = FALSE; ULONG access_process = PROCESS_VM_WRITE | PROCESS_VM_READ; INT old_pid = NULL; ULONG ret_lenght = NULL; PVOID buffer = NULL; NTSTATUS nt_status = STATUS_UNSUCCESSFUL; if (!init_struct()) return; if ( process_query_inf.ObjectTypeIndex ) { process_query_inf.handle= NULL; goto start_check; } process_query_inf.handle= OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, (DWORD)NtCurrentTeb()->ClientId.UniqueProcess); if (process_query_inf.handle) { start_check: nt_status = reinterpret_cast<decltype(&NtQuerySystemInformation)>(nt_query_system_information)(SystemHandleInformation, &ret_lenght, ret_lenght, &ret_lenght); while (nt_status == STATUS_INFO_LENGTH_MISMATCH) { if (buffer != NULL) crt_wrapper::free(buffer); buffer = crt_wrapper::malloc(ret_lenght); nt_status = reinterpret_cast<decltype(&NtQuerySystemInformation)>(nt_query_system_information)(SystemHandleInformation, buffer, ret_lenght, &ret_lenght); } if (!NT_SUCCESS(nt_status)) { goto close_handle; } //Get informathion about object auto handle_info = reinterpret_cast<PSYSTEM_HANDLE_INFORMATION>(buffer); //We have type if ( !process_query_inf.ObjectTypeIndex ) { for (ULONG i = NULL; i < handle_info->NumberOfHandles; i++) { SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = handle_info->Handles[i]; if (handleInfo.UniqueProcessId == reinterpret_cast<USHORT>(NtCurrentTeb()->ClientId.UniqueProcess)) { if (handleInfo.HandleValue == reinterpret_cast<USHORT>(process_query_inf.handle)) { process_query_inf.ObjectTypeIndex = handleInfo.ObjectTypeIndex; process_query_inf.Object = handleInfo.Object; } } } } handle_info = reinterpret_cast<PSYSTEM_HANDLE_INFORMATION>(buffer); for (ULONG i = NULL; i < handle_info->NumberOfHandles; i++) { SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = handle_info->Handles[i]; if (old_pid != handleInfo.UniqueProcessId && handleInfo.UniqueProcessId != reinterpret_cast<USHORT>(NtCurrentTeb()->ClientId.UniqueProcess))//Try optimizathion by don't check not corrupted PID { old_pid = handleInfo.UniqueProcessId; if( is_object_exist_proc(handle_info, process_query_inf.Object, handleInfo.UniqueProcessId, access_process) ) { std::cout << "PID attached ->\t" << std::dec << handleInfo.UniqueProcessId << '\n'; } } } } close_handle: crt_wrapper::free(buffer); if (process_query_inf.handle) reinterpret_cast<decltype(&NtClose)>(nt_close)(process_query_inf.handle); return; }
В чём проблема юзать в ядреПожалуйста, авторизуйтесь для просмотра ссылки.или Ke/KiStackAttachProcess +SEH + ProceForRead/Write (или просто проверить Address + Length < MmUserProbeAddress) или перейти на чтение/записиПожалуйста, авторизуйтесь для просмотра ссылки.в крайнем случае.
У меня есть один вопрос. А если я украду HANDLE у lsass.exe, и буду использовать его для чтения памяти, то обнаружит ли меня VAC?Я не изучал VAC,но знаю, что он просматривает открытые HANDLE к своему процессу(что и сказал Blick1337) т.к это единственный способ обнаружить присоединённый HANDLE к вашему процессу.
Пояснение работы обнаружение:
В NtQuerySystemInformation существуют классы SystemHandleInformation/SystemExtendedHandleInformation,который передают информацию об открытых HANDLE'ах.
Всякий раз,когда вы вызываете OpenProcess/NtOpenProcess вызываетсяПожалуйста, авторизуйтесь для просмотра ссылки.,который вызываетПожалуйста, авторизуйтесь для просмотра ссылки..
Вот сам пример кода обнаружение открытого HANDLE к вас:
При написания чита, просто помните, что не нужно поднимать красные флаги AC(особенно на серверной части)Посмотреть вложение 238160C++:typedef struct _OBJECT_FULL_HANDLE_INFORMATION { HANDLE handle; INT ObjectTypeIndex; PVOID Object; } OBJECT_FULL_HANDLE_INFORMATION, * POBJECT_FULL_HANDLE_INFORMATION; INLINE auto is_object_exist_proc(PSYSTEM_HANDLE_INFORMATION handle_info, PVOID Object, INT pid, ULONG access = NULL) -> ULONG { ULONG number = NULL; for (ULONG i = NULL; i < handle_info->NumberOfHandles; i++) { SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = handle_info->Handles[i]; if (handleInfo.UniqueProcessId == pid) { if (handleInfo.Object == Object && access) { if ((handleInfo.GrantedAccess & access) != NULL) { std::cout << "handle value ->\t" << std::hex << handleInfo.HandleValue << '\n'; number++; } } else if (handleInfo.Object == Object) { std::cout << "handle value ->\t" << std::hex << handleInfo.HandleValue << '\n'; number++; } } } return number; } //Only mutate code class handle_attached { private: PVOID nt_close = NULL; PVOID nt_query_system_information = NULL; PVOID nt_query_object = NULL; PVOID nt_dublicate_object = NULL; OBJECT_FULL_HANDLE_INFORMATION process_query_inf = { NULL }; INLINE auto init_struct() -> bool { if (nt_close && nt_query_system_information) return TRUE; nt_close = LI_FN(NtClose).nt_cached(); nt_query_system_information = LI_FN(NtQuerySystemInformation).nt_cached(); nt_query_object = LI_FN(NtQueryObject).nt_cached(); nt_dublicate_object = LI_FN(NtDuplicateObject).nt_cached(); return nt_close && nt_query_system_information && nt_query_object && nt_dublicate_object; } public: NO_INLINE auto is_handle_attached() -> VOID { bool is_detect = FALSE; ULONG access_process = PROCESS_VM_WRITE | PROCESS_VM_READ; INT old_pid = NULL; ULONG ret_lenght = NULL; PVOID buffer = NULL; NTSTATUS nt_status = STATUS_UNSUCCESSFUL; if (!init_struct()) return; if ( process_query_inf.ObjectTypeIndex ) { process_query_inf.handle= NULL; goto start_check; } process_query_inf.handle= OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, (DWORD)NtCurrentTeb()->ClientId.UniqueProcess); if (process_query_inf.handle) { start_check: nt_status = reinterpret_cast<decltype(&NtQuerySystemInformation)>(nt_query_system_information)(SystemHandleInformation, &ret_lenght, ret_lenght, &ret_lenght); while (nt_status == STATUS_INFO_LENGTH_MISMATCH) { if (buffer != NULL) crt_wrapper::free(buffer); buffer = crt_wrapper::malloc(ret_lenght); nt_status = reinterpret_cast<decltype(&NtQuerySystemInformation)>(nt_query_system_information)(SystemHandleInformation, buffer, ret_lenght, &ret_lenght); } if (!NT_SUCCESS(nt_status)) { goto close_handle; } //Get informathion about object auto handle_info = reinterpret_cast<PSYSTEM_HANDLE_INFORMATION>(buffer); //We have type if ( !process_query_inf.ObjectTypeIndex ) { for (ULONG i = NULL; i < handle_info->NumberOfHandles; i++) { SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = handle_info->Handles[i]; if (handleInfo.UniqueProcessId == reinterpret_cast<USHORT>(NtCurrentTeb()->ClientId.UniqueProcess)) { if (handleInfo.HandleValue == reinterpret_cast<USHORT>(process_query_inf.handle)) { process_query_inf.ObjectTypeIndex = handleInfo.ObjectTypeIndex; process_query_inf.Object = handleInfo.Object; } } } } handle_info = reinterpret_cast<PSYSTEM_HANDLE_INFORMATION>(buffer); for (ULONG i = NULL; i < handle_info->NumberOfHandles; i++) { SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = handle_info->Handles[i]; if (old_pid != handleInfo.UniqueProcessId && handleInfo.UniqueProcessId != reinterpret_cast<USHORT>(NtCurrentTeb()->ClientId.UniqueProcess))//Try optimizathion by don't check not corrupted PID { old_pid = handleInfo.UniqueProcessId; if( is_object_exist_proc(handle_info, process_query_inf.Object, handleInfo.UniqueProcessId, access_process) ) { std::cout << "PID attached ->\t" << std::dec << handleInfo.UniqueProcessId << '\n'; } } } } close_handle: crt_wrapper::free(buffer); if (process_query_inf.handle) reinterpret_cast<decltype(&NtClose)>(nt_close)(process_query_inf.handle); return; }
В чём проблема юзать в ядреПожалуйста, авторизуйтесь для просмотра ссылки.или Ke/KiStackAttachProcess +SEH + ProceForRead/Write (или просто проверить Address + Length < MmUserProbeAddress) или перейти на чтение/записиПожалуйста, авторизуйтесь для просмотра ссылки.в крайнем случае.
На сколько я знаю в лсас просто так не попасть, так же в лсас нет хендла к кс если я не ошибсяспасибо огромное за информацию
У меня есть один вопрос. А если я украду HANDLE у lsass.exe, и буду использовать его для чтения памяти, то обнаружит ли меня VAC?
что вектор? вектор - это три флоата.Vector, углы обзора, неправильный подход к записи памяти. И много чего.
Open handle to CSGO = detection vector for VAC. Не тот вектор про который ты подумал.что вектор? вектор - это три флоата.
"как вак обнаруживает читы? через вектора обнаружения читов брат, обращайся"Open handle to CSGO = detection vector for VAC. Не тот вектор про который ты подумал.
Что тут сложного? Открыл хандл к процессу = вектор обнаружения. А не "через вектор обнаружения". "Лагична" ?"как вак обнаруживает читы? через вектора обнаружения читов брат, обращайся"
лагична
открыл хендл - вектор обнаружения, согласен. он один? этот вектор?) если нет, то через эти вектора обнаружения идет детекшн - и я прав. либо же, он действительно один - и тогда ты можешь называть хендлы Vector'ами (нахуя?) - и я тоже прав.Что тут сложного? Открыл хандл к процессу = вектор обнаружения. А не "через вектор обнаружения". "Лагична" ?
Начнем с того, что экстернал читы вообще не могут работать хорошо как интернал.Не сможешь.
Что не требует никакого хэндла, но здесь про это видимо впервые слышат.чтение/записиПожалуйста, авторизуйтесь для просмотра ссылки.в крайнем случае.
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz