Sono sicuro che qualcuno vorrebbe cimentarsi nella programmazione di hack per ElSword.
Alcuni si bloccano perché non riescono a debuggare il processo con Olly (però con IDA si può)(non venitemi a dire che non è vero,perché qualcuno mi ha chiesto aiuto su questo) o perché all'injection della libreria/hack non potete visualizzare il processo.
La cosa è semplice da capire,non tutti conoscono questa funzione,ma è ora di sapere di cosa si tratta.
Questa funzione è documentata su MSDN,non voglio entrare nei dettagli,in poche parole ci permette di abilitare o disabilitare diritti e privilegi del nostro programma,tra cui c'è il privilegio SeDebugPrivilege che permette al processo di essere invisibile fino ad un certo punto da altri programmi.
La funzione di cui stiamo parlando è AdjustTokenPrivileges.
Esattamente nella funzione Main,la prima funzione in assoluto richiamata dal gioco è proprio il loop di controllo di tale privilegio,quindi se volete cominciare ad esaminare il gioco in piena libertà con i vostri debuggers,dovrete assolutamente patchare tale loop.
Avete sufficienti informazioni per potercela fare da soli (ragionando),qui di seguito incollo lo pseudo-C della funzione stessa così da capire.
Alcuni si bloccano perché non riescono a debuggare il processo con Olly (però con IDA si può)(non venitemi a dire che non è vero,perché qualcuno mi ha chiesto aiuto su questo) o perché all'injection della libreria/hack non potete visualizzare il processo.
La cosa è semplice da capire,non tutti conoscono questa funzione,ma è ora di sapere di cosa si tratta.
Questa funzione è documentata su MSDN,non voglio entrare nei dettagli,in poche parole ci permette di abilitare o disabilitare diritti e privilegi del nostro programma,tra cui c'è il privilegio SeDebugPrivilege che permette al processo di essere invisibile fino ad un certo punto da altri programmi.
La funzione di cui stiamo parlando è AdjustTokenPrivileges.
Esattamente nella funzione Main,la prima funzione in assoluto richiamata dal gioco è proprio il loop di controllo di tale privilegio,quindi se volete cominciare ad esaminare il gioco in piena libertà con i vostri debuggers,dovrete assolutamente patchare tale loop.
Avete sufficienti informazioni per potercela fare da soli (ragionando),qui di seguito incollo lo pseudo-C della funzione stessa così da capire.
Codice:
char __cdecl sub_18CA1930()
{
HANDLE v0; // eax@1
char result; // al@4
HANDLE hObject; // [sp+0h] [bp-34h]@1
DWORD BufferLength; // [sp+4h] [bp-30h]@1
struct _LUID Luid; // [sp+8h] [bp-2Ch]@2
struct _TOKEN_PRIVILEGES PreviousState; // [sp+10h] [bp-24h]@5
struct _TOKEN_PRIVILEGES NewState; // [sp+20h] [bp-14h]@5
unsigned int v7; // [sp+30h] [bp-4h]@1
v7 = (unsigned int)&hObject ^ dword_196A1500;
BufferLength = 16;
v0 = GetCurrentProcess();
if ( !OpenProcessToken(v0, 0x28u, &hObject) )
return 0;
if ( !LookupPrivilegeValueW(0, L"SeDebugPrivilege", &Luid) )
{
CloseHandle(hObject);
return 0;
}
NewState.Privileges[0].Luid.LowPart = Luid.LowPart;
NewState.Privileges[0].Luid.HighPart = Luid.HighPart;
NewState.PrivilegeCount = 1;
NewState.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hObject, 0, &NewState, 16u, &PreviousState, &BufferLength);
if ( GetLastError()
|| (PreviousState.Privileges[0].Attributes |= 2u,
PreviousState.Privileges[0].Luid.LowPart = Luid.LowPart,
PreviousState.Privileges[0].Luid.HighPart = Luid.HighPart,
PreviousState.PrivilegeCount = 1,
AdjustTokenPrivileges(hObject, 0, &PreviousState, BufferLength, 0, 0),
GetLastError()) )
{
result = 0;
}
else
{
CloseHandle(hObject);
result = 1;
}
return result;
}