Guida [INFO][DEVELOPERS] Processo invisibile,perché? Ecco!

Stato
Discussione chiusa ad ulteriori risposte.

d3vil401

Utente Platinum
3 Gennaio 2009
2,077
106
1,055
1,043
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.
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;
}
 
  • Mi piace
Reazioni: TIH
Stato
Discussione chiusa ad ulteriori risposte.