S.a. TürkHackTeam ailesi. Yazdığım dll'yi oyuna inject ettiğimde 1-2 dk içinde oyun kapanıyor. Bende biraz araştırdım ve dll'nin görünmemesi için birkaç api buldum. Detours kütüphanesini kullanarak bunların birkaçını hooklamayı denedim ve şöyle bişey ortaya çıktı:
Ama bunları hookladığımda oyun direk kapanıyor. Bulduğum Api'lerin dışında başka Api'leri denedim ve onlarda sorun olmuyor, tabi yine 1-2 dakikaya oyun kapanıyor. Sanırım hook yönteminde problem, oyun bu apileri koruyor olmalı. Biraz daha araştırma yaptım ama işler iyice karıştı
Birisi IAT hooking dene demiş ve denedim olmadı.
Başka biri o detourla hook yapılan gerçek pointer değilde gerçek fonksiyonu saran fonksiyonun pointerı demiş. Bu konuda başkasıda bir video yapmıştı ve Olly'le exe'sinden o fonksiyonun gerçek pointerını bulup patern ve maskını çıkarmıştı ve bunlarla api'yi çalışma zamanında tekrar bulup hookluyordu. Bende bu yolu deniyim dedim. Exe'yi unpack ettim ama fonksiyonu bulmak o kadar kolay değilmiş
Hala denemeye devam ediyorum fakat gözüme o yolun ucuda aynı görünüyor.
Son olarakta Extreme Injector v3.6 kullanıyorum ve özellik olarak Manual Map ile Erase Pe ve Hide module işaretli.
Bana hook konusunda doğru yolda olup olmadığımı söyleyebilecek bir üstat var mı? Aşırı zorluyomuş insanı bu işler
Birde doğru yoldaysam olly'de aradığım fonksiyonu nasıl bulabileceğime dair ışık tutabilecek bir üstat var mı? Şu yöntemi dene, şununla oluyor veya şu konuya bak anlarsın gibi?
Kod:
#pragma region NtQueryVirtualMemory
FARPROC _NtQueryVirtualMemory = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryVirtualMemory");
typedef NTSTATUS(NTAPI *T_NtQueryVirtualMemory)(
HANDLE ProcessHandle,
P**** BaseAddress,
MEMORY_INFORMATION_CLASS Type,
P**** Out,
SIZE_T Length,
PSIZE_T NumberOfBytesRead
);
T_NtQueryVirtualMemory O_NtQueryVirtualMemory = (T_NtQueryVirtualMemory)(_NtQueryVirtualMemory);
NTSTATUS NTAPI F_NtQueryVirtualMemory(HANDLE& ProcessHandle, P****& BaseAddress, MEMORY_INFORMATION_CLASS& Type, P****& Out, SIZE_T& Length, PSIZE_T& NumberOfBytesRead)
{
#ifdef DEBUG
char buffer[255];
sprintf_s(buffer, "[DllModule] - NtQueryVirtualMemory(%p, %d, %d, %d, %l, %l)", ProcessHandle, BaseAddress, Type, Out, Length, NumberOfBytesRead);
OutputDebugString(buffer);
#endif // DEBUG
NTSTATUS Temp;
Temp = O_NtQueryVirtualMemory(ProcessHandle, BaseAddress, Type, Out, Length, NumberOfBytesRead);
return NULL;
}
#pragma endregion
#pragma region NtQueryInformationProcess
FARPROC _NtQueryInformationProcess = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationProcess ");
typedef NTSTATUS(WINAPI *T_NtQueryInformationProcess)(
HANDLE ProcessHandle,
PROCESSINFOCLASS ProcessInformationClass,
P**** ProcessInformation,
ULONG ProcessInformationLength,
PULONG ReturnLength
);
T_NtQueryInformationProcess O_NtQueryInformationProcess = (T_NtQueryInformationProcess)(_NtQueryInformationProcess);
NTSTATUS NTAPI F_NtQueryInformationProcess(HANDLE ProcessHandle, PROCESSINFOCLASS ProcessInformationClass, P**** ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength)
{
#ifdef DEBUG
char buffer[255];
sprintf_s(buffer, "[DllModule] - NtQueryInformationProcess(%p, %d, %p, %l, %p)", ProcessHandle, ProcessInformationClass, ProcessInformation, ProcessInformationLength, ReturnLength);
OutputDebugString(buffer);
#endif // DEBUG
DWORD dwResult = O_NtQueryInformationProcess(ProcessHandle, ProcessInformationClass, ProcessInformation, ProcessInformationLength, ReturnLength);
return dwResult;
}
#pragma endregion
**** detour()
{
#ifdef DEBUG
char buffer[255];
sprintf_s(buffer, "[DllModule] - Detour Functions");
OutputDebugString(buffer);
#endif // DEBUG
Detours::X86::DetourFunction((PBYTE)O_NtQueryVirtualMemory, (PBYTE)F_NtQueryVirtualMemory);
Detours::X86::DetourFunction((PBYTE)O_NtQueryInformationProcess, (PBYTE)F_NtQueryInformationProcess);
}
**** undetour()
{
#ifdef DEBUG
char buffer[255];
sprintf_s(buffer, "[DllModule] - UnDetour Functions");
OutputDebugString(buffer);
#endif // DEBUG
Detours::X86::DetourRemove((PBYTE)F_NtQueryVirtualMemory);
Detours::X86::DetourRemove((PBYTE)F_NtQueryInformationProcess);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LP**** lpReserved)
{
DisableThreadLibraryCalls(hModule);
HideModule(hModule);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
detour();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
undetour();
break;
}
return TRUE;
}
Ama bunları hookladığımda oyun direk kapanıyor. Bulduğum Api'lerin dışında başka Api'leri denedim ve onlarda sorun olmuyor, tabi yine 1-2 dakikaya oyun kapanıyor. Sanırım hook yönteminde problem, oyun bu apileri koruyor olmalı. Biraz daha araştırma yaptım ama işler iyice karıştı
Birisi IAT hooking dene demiş ve denedim olmadı.
Başka biri o detourla hook yapılan gerçek pointer değilde gerçek fonksiyonu saran fonksiyonun pointerı demiş. Bu konuda başkasıda bir video yapmıştı ve Olly'le exe'sinden o fonksiyonun gerçek pointerını bulup patern ve maskını çıkarmıştı ve bunlarla api'yi çalışma zamanında tekrar bulup hookluyordu. Bende bu yolu deniyim dedim. Exe'yi unpack ettim ama fonksiyonu bulmak o kadar kolay değilmiş
Hala denemeye devam ediyorum fakat gözüme o yolun ucuda aynı görünüyor.
Son olarakta Extreme Injector v3.6 kullanıyorum ve özellik olarak Manual Map ile Erase Pe ve Hide module işaretli.
Bana hook konusunda doğru yolda olup olmadığımı söyleyebilecek bir üstat var mı? Aşırı zorluyomuş insanı bu işler
Birde doğru yoldaysam olly'de aradığım fonksiyonu nasıl bulabileceğime dair ışık tutabilecek bir üstat var mı? Şu yöntemi dene, şununla oluyor veya şu konuya bak anlarsın gibi?