Guida [GUIDA COMPLETA] [IDAC #1]Ahnlab's Hackshield

Stato
Discussione chiusa ad ulteriori risposte.

d3vil401

Utente Platinum
3 Gennaio 2009
2,077
106
1,055
1,043
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

Casa sviluppatrice: Ahnlab
Pagina ufficiale prodotto: In inglese | Hackshield
Logo:
hackshield.png


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

2h49b41.png

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).

2hqb0pz.png

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".
b9ip0l.png

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.
2air41f.png

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.

7q1yZ.png

7q1Aw.png

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

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:
7q24F.png

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.

7q2yx.png

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.
 
Stato
Discussione chiusa ad ulteriori risposte.