Ultima modifica da un moderatore:
Impero Degli Anti-Cheats
"AHNLAB'S HACKSHIELD"
Guida completa al suo funzionamento, tips & tricks firmati d3vil401 & InForge.
ATTENZIONE: Le seguenti informazioni provengono dalle esperienze personali del sottoscritto e dalle informazioni date dalla community del reverse engineering mondiale.
L'intera guida è a solo scopo informativo per comprendere al meglio questi famosi softwares che ogni giorno ci ritroviamo nei nostri F2P.
Introduzione
"AHNLAB'S HACKSHIELD"
Guida completa al suo funzionamento, tips & tricks firmati d3vil401 & InForge.
ATTENZIONE: Le seguenti informazioni provengono dalle esperienze personali del sottoscritto e dalle informazioni date dalla community del reverse engineering mondiale.
L'intera guida è a solo scopo informativo per comprendere al meglio questi famosi softwares che ogni giorno ci ritroviamo nei nostri F2P.
Introduzione
Casa sviluppatrice: Ahnlab
Pagina ufficiale prodotto: In inglese | Hackshield
Logo:
Descrizione:
Hackshield è un software di prevenzione d'uso di software di terzi per la modifica della memoria (più conosciuti come cheats o hacks) del processo di un gioco MMORPG.
E' munito di numerose funzioni di prevenzione intelligente che impediscono i metodi di attacco già conosciuti e cerca di bloccare le basi stesse delle altre varianti di attacco, presentando inoltre un sistema di protezione del processo stesso di Hackshield per identificare tentativi di patching e la funzione di tracciamento delle attività del kernel (Kernel32.dll).
Inoltre, è munito di driver sia per OS a 32 bit sia a 64 bit, permettendogli di controllare a pieni privilegi le attività del malintenzionato.
Comprendiamo meglio
Hackshield è un sistema di anti-cheating molto famoso e anche molto temuto, essendo uno dei più ben realizzati engine intelligenti per la rilevazione di vari tipi di attacchi conosciuti o meno.
La particolarità di Hackshield è l'implementazione di un forte sistema crittografico dei dati, utilizzando Advanced Encryption Standard 256 (AES-256) per la cifratura di tutti i dati trasmessi tra client e server, la cui chiave di autenticazione è unica sia per criptare sia per decriptare i dati; ed il sussidio del famoso packer Themida (EvOlUtIoN_OGM sicuramente sa come trattare l'argomento) unito al suo sistema di scannerizzazione della memoria dalle firme degli hacks o malwares, oltre alla verifica della validità della libreria (.dll) in tempo reale con il server.
Meccaniche interne
Le meccaniche di funzionamento sono fondamentali per capire come riuscire ad intercettare le funzioni di Hackshield e come manipolarle.
HSUpdate
Innanzitutto, da come avrete notato ogni volta che avviate il gioco, compare una finestra di HS con una progress bar: ebbene quello è HSUpdate.exe ovvero il sistema di aggiornamento autonomo.
Questo sistema si basa su 2 protocolli: FTP e WEB.
FTP
Il protocollo FTP è personalizzato secondo gli sviluppatori di hackshield, HSUpdate si connetterà al server del nostro MMORPG dove si è installato la parte server e con questo si scambierà i files dopo aver controllato con gli hash CRC (Anche l'algoritmo CRC si HS è stato modificato).
WEB
Semplicemente manderà delle Web Requests di tipo GET o POST (modificabile dalla configurazione) per recuperare le informazioni ed i files, questo metodo è intercettabile con normali HTTP Proxy Sniffer come Fiddler 2.
Nel frattempo verranno avviati gli engine di scannerizzazione della memoria e caricate le firme digitali degli hacks.
Dopo l'aggiornamento il client di gioco procederà a caricare (Kernel32.LoadLibraryA) la libreria di HS, il cuore del suo funzionamento.
EHSvc
EHSvc è la libreria di interfacciamento con server, scanners, metodi di prevenzione vari ed invio dei logs al server, tutti i bypass si concentrano su questa libreria..
Questa, oltre a loggare tutte le operazioni interne, invierà i logs al server HSMS "HackShield Monitoring Server", l'intero traffico è criptato.
Per questo a volte il bypassing di HS richiede l'interruzione delle comunicazioni o l'invio di falsi logs per evitare il ban dallo staff del gioco.
Ci concentreremo qui per capire il funzionamento di HS.
Eagle
Eagle è il driver di tracciamento del kernel per evitare modifiche sulla libreria.
Non c'è molto da dire su di esso, ma esamineremo alcuni dettagli più avanti.
V3Pro32
Non è altro che l'engine che scannerizza la memoria da eventuali infezioni di malware, non viene mai considerato per i bypass dato che l'obbiettivo di quest'ultimo non è infettare gli utenti (Forse?).
L'implementazione
Implementare Hackshield, dalla parte degli sviluppatori del gioco, non è affatto difficile.
Innanzitutto va chiamato l'updater (se lo si vuole implementare).
Esempio:
PHP:
DWORD ReturnCode = NULL;
ReturnCode = _AhnHS_HSUpdateEx( szFullFilePath, // Percorso cartella hshield
1000 * 600, // Timeout tra un update e l'altro
1234, // Codice di gioco (Fornito per la licenza)
AHNHSUPDATE_CHKOPT_HOSTFILE| AHNHSUPDATE_CHKOPT_GAMECODE, // Opzioni aggiuntive
HsExtError, // Codice errore
1000* 20 // Timeout connessione al server
);
switch (ReturnCode)
{
case HSERROR_ENVFILE_NOTREAD:
// HSUpdate.env non può essere letto
break;
case HSERROR_ENVFILE_NOTWRITE:
// HSUpdate.env non può essere scritto
break;
case HSERROR_NETWORK_CONNECT_FAIL:
// Impossibile connettersi al server
break;
[Eccetera per i vari e vari errori]
}
Da come abbiamo notato, HS per avvertirci di un errore e chiudere il gioco spesso ci fa vedere una MessageBox, ebbene queste sono gestite dalla CallBack (lo switch) del client di gioco.
Se interrompiamo la CallBack o la hookiamo non bypassaremo HS! (Questo metodo funzionava fino a qualche anno fa).
Per quanto riguarda EHSvc, l'avvio è molto simile ma la chiamata è differente.
EHSvc prima di tutto deve essere avviato con una valida licenza acquistata dagli sviluppatori, queste informazioni vengono precisate al momento stesso del caricamento della libreria.
PHP:
BOOL HS_Init()
{
// [...]
// Evitiamo alcune dichiarazioni di variabili.
DWORD dwOption = AHNHS_CHKOPT_ALL; // Controlliamo tutto
nRet = _AhnHS_Initialize ( szFullFilePath, // Percorso della cartella di HS
HS_CallbackProc, // Come nel caso precedente, ma la CallBack viene chiamata dal modulo EHSvc stesso, non viene gestita dal client con un loop di verifica
1234, // Codice de gioco
“B228F291B7D7FAD361D7A4B7”, // Chiave di licenza
dwOption, // Flag di opzioni
AHNHS_SPEEDHACK_SENSING_RATIO_NORMAL // Impostazione del rateo di verifica dello speedhack
);
if (nRet != HS_ERROR_OK)
// ...
}
Quando esaminiamo il client gioco non è difficile trovare le chiavi di licenza e il codice di gioco.
Spesso l'errore che commettiamo quando siamo alle prime armi è pensare che impedire il caricamento di EHSvc semplicemente NOPpando l'inizializzatione sia sufficiente: niente di più sbagliato e capiremo presto il perché!
Dopo l'inizializzazione di EHSvc, il client di gioco dovrà chiamare la funzione di avvio del servizio di monitoraggio con una semplice funzione _AhnHS_StartService().
Esaminare Hackshield
Prima di tutto, per esaminare Hackshield per un eventuale bypass dobbiamo eseguire un dump della memoria di EHSvc.dll dal processo del gioco oppure unpackare Themida (leggete il tutorial di Evo o aiutatevi con degli script) che risulta essere sempre la scelta migliore.
In questa guida utilizzerà l'ultima versione di HS in giro, che ho trovato nel gioco "ElSword".
La versione è 5.6.28.404 e potete scaricarla già unpackata personalmente da d3vsite.org.
I tool indispensabili per esaminare qualsiasi software:
- IDA (Interactive DisAssembler)
- Olly (Con i dovuti plugins di anti-anti-detection come StrongOD o PhantOm)
- PEiD con Krypto Analyzer
Per programmare un bypass:
- Conoscenza della struttura dei PE
- Conoscenza del linguaggio C o C++
- Microsoft Detours 3 (o 1.5)
- Conoscenza delle funzioni di editing di memoria.
- Un injector (io uso RemoteDLL)
Dopo aver completato l'analisi di IDA, dovremo prima di tutto renderci conto di come è strutturato.
Se osserviamo la Export Table noteremo subito il nome delle funzioni che non sono altro che dei numeri.
Spesso la Ahnlab scambia le funzioni ad ogni aggiornamento, alcune di queste sono inutili, altre sono fondamentali per un bypass, come quella di return d'errore che chiama la CallBack.
Se invece osserviamo la Import Table, noteremo alcune funzioni, alcune di queste saranno utilissime per identificare le funzioni da modificare.
Codice:
Address Ordinal Name Library
------- ------- ---- -------
10115000 AddAce ADVAPI32
10115004 GetLengthSid ADVAPI32
10115008 CopySid ADVAPI32
1011500C GetTokenInformation ADVAPI32
10115010 RegOpenKeyA ADVAPI32
10115014 RegDeleteValueA ADVAPI32
10115018 OpenThreadToken ADVAPI32
1011501C RegEnumValueA ADVAPI32
10115020 RegQueryInfoKeyA ADVAPI32
10115024 RegEnumKeyExA ADVAPI32
10115028 OpenProcessToken ADVAPI32
1011502C LookupPrivilegeValueA ADVAPI32
10115030 AdjustTokenPrivileges ADVAPI32
10115034 RegCreateKeyExA ADVAPI32
10115038 RegCloseKey ADVAPI32
1011503C RegOpenKeyExA ADVAPI32
10115040 RegSetValueExA ADVAPI32
10115044 RegQueryValueExA ADVAPI32
10115048 AllocateAndInitializeSid ADVAPI32
1011504C LookupAccountSidA ADVAPI32
10115050 FreeSid ADVAPI32
10115054 InitializeSecurityDescriptor ADVAPI32
10115058 SetSecurityDescriptorDacl ADVAPI32
1011505C InitializeAcl ADVAPI32
10115060 EqualSid ADVAPI32
10115064 GetExplicitEntriesFromAclA ADVAPI32
10115068 GetNamedSecurityInfoA ADVAPI32
1011506C GetAce ADVAPI32
10115070 GetAclInformation ADVAPI32
10115074 IsValidSid ADVAPI32
10115078 GetSidSubAuthority ADVAPI32
1011507C GetSidSubAuthorityCount ADVAPI32
10115080 CloseServiceHandle ADVAPI32
10115084 CreateServiceA ADVAPI32
10115088 OpenSCManagerA ADVAPI32
1011508C DeleteService ADVAPI32
10115090 OpenServiceA ADVAPI32
10115094 StartServiceA ADVAPI32
10115098 ControlService ADVAPI32
1011509C QueryServiceStatus ADVAPI32
101150A0 UnlockServiceDatabase ADVAPI32
101150A4 ChangeServiceConfigA ADVAPI32
101150A8 LockServiceDatabase ADVAPI32
101150AC RegSetValueExW ADVAPI32
101150B0 GetKernelObjectSecurity ADVAPI32
101150B4 SetNamedSecurityInfoA ADVAPI32
101150BC CryptMsgUpdate CRYPT32
101150C0 CryptQueryObject CRYPT32
101150C4 CertFreeCertificateChain CRYPT32
101150C8 CertGetSubjectCertificateFromStore CRYPT32
101150CC CryptMsgControl CRYPT32
101150D0 CertOpenSystemStoreA CRYPT32
101150D4 CertCloseStore CRYPT32
101150D8 CryptMsgClose CRYPT32
101150DC CertFreeCRLContext CRYPT32
101150E0 CertVerifySubjectCertificateContext CRYPT32
101150E4 CertFindCertificateInStore CRYPT32
101150E8 CryptMsgGetParam CRYPT32
101150EC CryptDecodeObject CRYPT32
101150F0 CertGetNameStringA CRYPT32
101150F4 CryptMsgOpenToDecode CRYPT32
101150F8 CertOpenStore CRYPT32
10115100 SelectObject GDI32
10115104 DeleteObject GDI32
10115108 CreateCompatibleDC GDI32
1011510C GetObjectA GDI32
10115110 BitBlt GDI32
10115114 StretchBlt GDI32
10115118 GetStockObject GDI32
1011511C SetBkMode GDI32
10115120 SetTextColor GDI32
10115124 CreateFontA GDI32
10115128 DeleteDC GDI32
1011512C GetBitmapBits GDI32
10115130 CreateCompatibleBitmap GDI32
10115134 GetDeviceCaps GDI32
10115138 CreateDCA GDI32
10115140 lstrcat kernel32
10115144 lstrcpyn kernel32
10115148 GlobalMemoryStatus kernel32
1011514C GetSystemInfo kernel32
10115150 FileTimeToSystemTime kernel32
10115154 FileTimeToLocalFileTime kernel32
10115158 GetFileTime kernel32
1011515C GetLocalTime kernel32
10115160 lstrlen kernel32
10115164 LocalFree kernel32
10115168 lstrcpy kernel32
1011516C LocalAlloc kernel32
10115170 DeleteFileA kernel32
10115174 OutputDebugStringA kernel32
10115178 FormatMessageA kernel32
1011517C CreateProcessW kernel32
10115180 CreateFileW kernel32
10115184 GetExitCodeProcess kernel32
10115188 GetExitCodeThread kernel32
1011518C SetThreadPriority kernel32
10115190 ResetEvent kernel32
10115194 OpenEventA kernel32
10115198 QueryPerformanceCounter kernel32
1011519C QueryPerformanceFrequency kernel32
101151A0 CreateProcessA kernel32
101151A4 OpenProcess kernel32
101151A8 MultiByteToWideChar kernel32
101151AC LoadLibraryExA kernel32
101151B0 lstrlenW kernel32
101151B4 ExitThread kernel32
101151B8 TlsAlloc kernel32
101151BC TlsSetValue kernel32
101151C0 TlsGetValue kernel32
101151C4 WriteFile kernel32
101151C8 Module32Next kernel32
101151CC Module32First kernel32
101151D0 CreateToolhelp32Snapshot kernel32
101151D4 OpenMutexA kernel32
101151D8 CreateMutexA kernel32
101151DC OpenFileMappingA kernel32
101151E0 ReleaseMutex kernel32
101151E4 FlushViewOfFile kernel32
101151E8 DuplicateHandle kernel32
101151EC lstrcmp kernel32
101151F0 WaitForSingleObjectEx kernel32
101151F4 DefineDosDeviceA kernel32
101151F8 QueryDosDeviceA kernel32
101151FC TerminateProcess kernel32
10115200 SetFileAttributesA kernel32
10115204 SetEndOfFile kernel32
10115208 GetShortPathNameA kernel32
1011520C MoveFileExA kernel32
10115210 IsBadWritePtr kernel32
10115214 IsBadReadPtr kernel32
10115218 InitializeCriticalSectionAndSpinCount kernel32
1011521C OpenSemaphoreA kernel32
10115220 ReadProcessMemory kernel32
10115224 Process32Next kernel32
10115228 Process32First kernel32
1011522C GetDriveTypeA kernel32
10115230 FindClose kernel32
10115234 FindNextFileA kernel32
10115238 FindFirstFileA kernel32
1011523C GetLongPathNameA kernel32
10115240 lstrcmpi kernel32
10115244 ReadFile kernel32
10115248 Thread32First kernel32
1011524C lstrcpynW kernel32
10115250 VirtualFreeEx kernel32
10115254 HeapReAlloc kernel32
10115258 GetComputerNameA kernel32
1011525C GetDiskFreeSpaceA kernel32
10115260 GetVolumeInformationA kernel32
10115264 GetTempFileNameA kernel32
10115268 GetTempPathA kernel32
1011526C GetPrivateProfileStringA kernel32
10115270 VirtualProtectEx kernel32
10115274 GetCurrentProcessId kernel32
10115278 CreateDirectoryA kernel32
1011527C GetProcessAffinityMask kernel32
10115280 SetThreadAffinityMask kernel32
10115284 GetVersion kernel32
10115288 GetThreadLocale kernel32
1011528C GetStartupInfoA kernel32
10115290 GetLocaleInfoA kernel32
10115294 GetCommandLineA kernel32
10115298 ExitProcess kernel32
1011529C UnhandledExceptionFilter kernel32
101152A0 RtlUnwind kernel32
101152A4 RaiseException kernel32
101152A8 GetStdHandle kernel32
101152AC TlsFree kernel32
101152B0 lstrcpyW kernel32
101152B4 lstrcmpiW kernel32
101152B8 lstrcatW kernel32
101152BC WriteProcessMemory kernel32
101152C0 WaitForMultipleObjects kernel32
101152C4 VirtualQueryEx kernel32
101152C8 OpenMutexW kernel32
101152CC OpenFileMappingW kernel32
101152D0 OpenEventW kernel32
101152D4 GetTempPathW kernel32
101152D8 GetTempFileNameW kernel32
101152DC GetFileAttributesW kernel32
101152E0 GetFileAttributesA kernel32
101152E4 GetCurrentDirectoryW kernel32
101152E8 GetCurrentDirectoryA kernel32
101152EC DeleteFileW kernel32
101152F0 CreatePipe kernel32
101152F4 CreateMutexW kernel32
101152F8 CreateFileMappingW kernel32
101152FC CreateEventW kernel32
10115300 LockResource kernel32
10115304 SizeofResource kernel32
10115308 LoadResource kernel32
1011530C FindResourceA kernel32
10115310 GetSystemTime kernel32
10115314 GetEnvironmentVariableA kernel32
10115318 FatalAppExitA kernel32
1011531C HeapSize kernel32
10115320 GetCPInfo kernel32
10115324 GetACP kernel32
10115328 GetOEMCP kernel32
1011532C VirtualAllocEx kernel32
10115330 HeapDestroy kernel32
10115334 HeapCreate kernel32
10115338 DeviceIoControl kernel32
1011533C CreateFileMappingA kernel32
10115340 MapViewOfFile kernel32
10115344 GetWindowsDirectoryA kernel32
10115348 FreeLibrary kernel32
1011534C GetCurrentThread kernel32
10115350 CreateThread kernel32
10115354 TerminateThread kernel32
10115358 SetThreadContext kernel32
1011535C SetLastError kernel32
10115360 GetModuleFileNameA kernel32
10115364 VirtualQuery kernel32
10115368 SuspendThread kernel32
1011536C GetThreadContext kernel32
10115370 LCMapStringA kernel32
10115374 LCMapStringW kernel32
10115378 SetUnhandledExceptionFilter kernel32
1011537C FlushFileBuffers kernel32
10115380 SetHandleCount kernel32
10115384 FreeEnvironmentStringsA kernel32
10115388 FreeEnvironmentStringsW kernel32
1011538C GetEnvironmentStrings kernel32
10115390 GetSystemDirectoryA kernel32
10115394 LoadLibraryW kernel32
10115398 GetProcessHeap kernel32
1011539C HeapAlloc kernel32
101153A0 HeapFree kernel32
101153A4 GetVersionExA kernel32
101153A8 GetSystemDirectoryW kernel32
101153AC GetModuleFileNameW kernel32
101153B0 GetModuleHandleW kernel32
101153B4 UnmapViewOfFile kernel32
101153B8 CloseHandle kernel32
101153BC InterlockedIncrement kernel32
101153C0 InterlockedDecrement kernel32
101153C4 DeleteCriticalSection kernel32
101153C8 InterlockedCompareExchange kernel32
101153CC Sleep kernel32
101153D0 GetModuleHandleA kernel32
101153D4 InitializeCriticalSection kernel32
101153D8 EnterCriticalSection kernel32
101153DC LeaveCriticalSection kernel32
101153E0 GetCurrentProcess kernel32
101153E4 FlushInstructionCache kernel32
101153E8 GetLastError kernel32
101153EC GetCurrentThreadId kernel32
101153F0 VirtualAlloc kernel32
101153F4 InterlockedExchange kernel32
101153F8 VirtualFree kernel32
101153FC WideCharToMultiByte kernel32
10115400 GetTickCount kernel32
10115404 LoadLibraryA kernel32
10115408 GetProcAddress kernel32
1011540C ResumeThread kernel32
10115410 SetEvent kernel32
10115414 WaitForSingleObject kernel32
10115418 CreateEventA kernel32
1011541C CreateFileA kernel32
10115420 GetFileSize kernel32
10115424 CopyFileA kernel32
10115428 SetFilePointer kernel32
1011542C VirtualProtect kernel32
10115430 GetEnvironmentStringsW kernel32
10115434 GetStringTypeA kernel32
10115438 GetStringTypeW kernel32
1011543C IsBadCodePtr kernel32
10115440 SetStdHandle kernel32
10115444 IsValidLocale kernel32
10115448 IsValidCodePage kernel32
1011544C EnumSystemLocalesA kernel32
10115450 GetUserDefaultLCID kernel32
10115454 SetConsoleCtrlHandler kernel32
10115458 GetLocaleInfoW kernel32
1011545C CompareStringA kernel32
10115460 CompareStringW kernel32
10115464 SetEnvironmentVariableA kernel32
10115468 CompareFileTime kernel32
1011546C GetTimeZoneInformation kernel32
10115470 SetCurrentDirectoryA kernel32
10115474 SetFileTime kernel32
10115478 MoveFileA kernel32
1011547C GetFullPathNameA kernel32
10115480 GetFileInformationByHandle kernel32
10115484 Thread32Next kernel32
10115488 PeekNamedPipe kernel32
1011548C GetFileType kernel32
10115494 CreateErrorInfo OLEAUT32
10115498 VariantChangeType OLEAUT32
1011549C SetErrorInfo OLEAUT32
101154A0 GetErrorInfo OLEAUT32
101154A4 SysReAllocStringLen OLEAUT32
101154A8 VariantInit OLEAUT32
101154AC VariantClear OLEAUT32
101154B0 SysStringLen OLEAUT32
101154B4 SysAllocString OLEAUT32
101154B8 SysFreeString OLEAUT32
101154BC OleLoadPicturePath OLEAUT32
101154C4 Shell_NotifyIcon SHELL32
101154CC FindWindowExA USER32
101154D0 SendMessageA USER32
101154D4 EnumThreadWindows USER32
101154D8 RegisterClipboardFormatA USER32
101154DC FindWindowA USER32
101154E0 GetWindowLongA USER32
101154E4 GetWindowModuleFileName USER32
101154E8 EnumWindows USER32
101154EC PostMessageA USER32
101154F0 DefWindowProcA USER32
101154F4 IsWindow USER32
101154F8 GetWindowInfo USER32
101154FC SendMessageTimeoutA USER32
10115500 GetClassNameA USER32
10115504 IsWindowUnicode USER32
10115508 EnumChildWindows USER32
1011550C CharUpperBuffA USER32
10115510 CharLowerBuffA USER32
10115514 CallNextHookEx USER32
10115518 UnhookWindowsHookEx USER32
1011551C SetWindowsHookExA USER32
10115520 GetKeyboardType USER32
10115524 PeekMessageA USER32
10115528 OpenInputDesktop USER32
1011552C GetForegroundWindow USER32
10115530 GetWindowThreadProcessId USER32
10115534 CreateDialogParamA USER32
10115538 GetMessageA USER32
1011553C IsDialogMessage USER32
10115540 TranslateMessage USER32
10115544 DispatchMessageA USER32
10115548 IsIconic USER32
1011554C GetDlgItem USER32
10115550 ShowWindow USER32
10115554 GetClientRect USER32
10115558 GetParent USER32
1011555C GetDesktopWindow USER32
10115560 GetWindowRect USER32
10115564 GetSystemMetrics USER32
10115568 SetWindowPos USER32
1011556C SetTimer USER32
10115570 KillTimer USER32
10115574 PostQuitMessage USER32
10115578 CopyImage USER32
1011557C LoadImageA USER32
10115580 MessageBoxA USER32
10115584 wsprintfW USER32
10115588 wvsprintfA USER32
1011558C wsprintfA USER32
10115590 CharUpperA USER32
10115594 MsgWaitForMultipleObjects USER32
10115598 GetUserObjectInformationA USER32
1011559C GetThreadDesktop USER32
101155A0 CloseDesktop USER32
101155A8 VerQueryValueA VERSION
101155AC GetFileVersionInfoSizeW VERSION
101155B0 GetFileVersionInfoW VERSION
101155B4 VerQueryValueW VERSION
101155B8 GetFileVersionInfoSizeA VERSION
101155BC GetFileVersionInfoA VERSION
101155C4 InternetOpenA WININET
101155C8 InternetSetStatusCallback WININET
101155CC HttpSendRequestA WININET
101155D0 HttpOpenRequestA WININET
101155D4 InternetCloseHandle WININET
101155D8 DeleteUrlCacheEntry WININET
101155DC InternetReadFile WININET
101155E0 HttpQueryInfoA WININET
101155E4 InternetCrackUrlA WININET
101155E8 InternetCanonicalizeUrlA WININET
101155EC InternetConnectA WININET
101155F4 timeSetEvent winmm
101155F8 timeGetTime winmm
101155FC timeKillEvent winmm
10115604 WSAStartup WS2_32
10115608 WSACleanup WS2_32
1011560C htons WS2_32
10115610 gethostbyname WS2_32
10115614 inet_ntoa WS2_32
1011561C ImageEnumerateCertificates imagehlp
10115620 ImageGetCertificateHeader imagehlp
10115628 GetAdaptersInfo iphlpapi
10115630 CoUninitialize ole32
10115634 CoSetProxyBlanket ole32
10115638 CoCreateInstance ole32
1011563C CoInitializeSecurity ole32
10115640 CoInitializeEx ole32
10115648 URLDownloadToFileA urlmon
Per trovare le funzioni di cui abbiamo bisogno dobbiamo avviare EHSvc non unpackato tramite il client di gioco ed andare ad osservare le varie funzioni.
Purtroppo è impossibile identificare le funzioni su IDA e su Olly, perché Themida sarà di mezzo.
Alternativa è avviare EHSvc unpackato sempre tramite client di gioco così da poterne identificare le funzioni correttamente, ma questo si accorgerà dal un momento all'altro che il modulo non corrisponde alla firma del server.
Dobbiamo in ogni caso prefissarci degli obbiettivi, ciò che dobbiamo andare a trovare per riuscire a fare un bypass vero e proprio sono le seguenti funzioni:
- LMP Check:
Fondamentale modifica da apportare, questa funzione è quella che identifica se EHSvc o il client gioco è stato modificato non secondo la norma identificata dalla firma digitale presente sul server.
L'unico modo per bypassare questo controllo è sostituire la funzione originale con una nostra.
- Main Thread:
Il Main Thread è la funzione che gestisce l'avvio delle scansioni, sostituendola con una nostra avremo la possibilità di identificare i thread delle scansioni e redirectarli sui nostri falsi scan threads.
- Heuristic Scan:
Questa funzione si occupa di scannerizzare il client di gioco da eventuali cheats.
- Heuristic Module Scan:
Questa funzione si occupa di scannerizzare il modulo di EHSvc per eventuali bypass.
- Integrity Check:
Controlla se il modulo è integro, praticamente gestisce le chiamate con il server per la verifica dell'integrità interna.
- Kernel Tracer [KDTrace]:
E' la chiamata di monitoraggio tra EHSvc ed il driver per la rivelazione dell'uso delle funzioni di editing di memoria non previste.
E' buona idea identificare tutte le stringhe all'interno del modulo EHSvc, dato che saranno di aiuto molto spesso, ma anche in questo caso non avremo vita facile: HS ha alcune stringhe codificate in Base64 o criptate con XOR, una chiave per ogni stringa.
E' nostra responsabilità identificare l'algoritmo e la chiave per ogni stringa che vogliamo decriptare, tuttavia non è fondamentale.
Per identificare le chiamate in ogni caso non è difficile quanto si pensi:
Hookiamo CreateEventA, CreateEventW, CreateThread e SetEvent, HS utilizza queste funzioni per avviare i thread da bypassare, una volta identificati con le nostre capacità di reverse engineering e debugging possiamo sostituire i threads con i nostri tramite i Detours.
Per identificare i controlli tramite CRC basterà utilizzare Krypto Analyzer, che ci rivelerà le funzioni utilizzanti CRC.
Queste operazioni possono essere fatte anche semplicemente tramite IDA.
Tip & Tricks
Tracciamento delle funzioni tramite i logs
Tracciamento delle funzioni tramite i logs
Un trucchetto per trovare le chiamate interessanti o monitorare le informazioni che EHSvc raccoglie possiamo abilitare la DEBUG Mode.
La DEBUG Mode viene gestita da un singolo byte che possiamo trovare esaminando la funzione che chiama Kernel32.wsprintfA:
Se cambiamo questo singolo byte in 0x01 o 0x02 basterà attaccare un debugger che sia in grado di loggare la funzione di OutputDebugStringA().
Utilizzare EHSvc unpackato
EHSvc caricato in memoria tramite Olly dal game client è un'ottimo metodo per osservare i suoi comportamenti.
Farlo non è molto difficile, basterà identificare la CALL all'updater e nopparla, eliminando anche la CallBack dell'updater, dopodiché dobbiamo trovare la CALL per il caricamento di EHSvc (Usate un BP su LoadLibraryA) e una volta caricata potete navigare all'interno del suo codice.
Hackshield Crypto
Uno dei tanti metodi migliori è quello di emulare Hackshield, a questo proposito io stesso sto lavorando all'estrazione dell'algoritmo di HS ed ad un sistema di acquisizione delle chiavi.
Raggiungibile qui:
https://sourceforge.net/p/openhscrypto/
La guida potrebbe essere soggetta a modifiche nel caso in cui riesca a trovare maggiori informazioni
Qualsiasi domanda è ben accetta.