View Full Version : [c++] windows 7 admin mode problema
3nigma666
15-03-2010, 18:55
Buona sera a tutti!!
ho un problema con Windows 7 (e Vista di conseguenza).
Ho scritto un applicativo che si deve autoeseguire all'avvio di windows
In sostanza ho fatto si che l'applicativo si auto-copiasse in una cartella (system32) e nel registro ho scritto la chiave che all'avvio lo richiama.
Il problema è che tutto ciò funziona SE E SOLO SE faccio partire il mio applicativo cliccando con il Dx e selezionando: Run as administrator.
Se non lo faccio, il programma non si copia e non si inserisce la chiave di registro.
come faccio ad ovviare il problema?
questo è il codice "incriminato":
int auto_startup(char *prog_name)
{
HKEY hKey;
HWND hWnd;
char destPath[255];
hWnd = FindWindow("ConsoleWindowClass", NULL);
ShowWindow(hWnd, SW_HIDE);
if(!GetSystemDirectory(destPath, 255))
{
write_log("\n[!] Errore nell'ottenere il percorso della cartella system32: ", true);
sprintf(destPath, "C:\\WINDOWS\\system32\\%s", "molecola.exe");
}
else
{
strcat(destPath, "\\");
strcat(destPath, "molecola.exe");
}
if(!CopyFile(prog_name, destPath, FALSE))
{
write_log("\n[!] Errore nel copiare Molecola nella cartella system32: ", true);
return 1;
}
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_SET_VALUE, &hKey)
!= ERROR_SUCCESS)
{
write_log("\n[!] Errore nella creazione della chiave di registro: ", true);
return 1;
}
if(RegSetValueEx(hKey, "Molecola", 0, REG_SZ, (const unsigned char*) destPath, strlen(destPath))
!= ERROR_SUCCESS)
{
write_log("\n[!] Errore nella creazione della chiave di registro: ", true);
RegCloseKey(hKey);
return 1;
}
RegCloseKey(hKey);
return 0;
}
Non puoi ovviare, è giusto che funzioni così. L'unico modo è disattivare l'UAC.
3nigma666
15-03-2010, 20:17
Non puoi ovviare, è giusto che funzioni così. L'unico modo è disattivare l'UAC.
neanche se creo un autorun.bat che mi avvia l'applicazione in modalità admin ?
Non capisco.. eppure ho programmi installati che si sono tranquillamente inseriti nel registro di sistema e si autoavviano allo startup di windows senza che io abbia minimamente detto loro di avviarsi in modalità admin... come hanno fatto ??
Ah, ok. Credevo che tu volessi bypassare completamente la cosa. O esegui come amministratore o ti viene richiesta la conferma tramite UAC.
http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx
Servono i privilegi admin perché fai qualcosa che non dovresti fare.
Soprattutto non capisco perché il programma si debba auto-copiare necessariamente in system32.
Per non avere problemi usa le cartelle del profilo utente (tipo %AppData%).
neanche se creo un autorun.bat che mi avvia l'applicazione in modalità admin ?
Non capisco.. eppure ho programmi installati che si sono tranquillamente inseriti nel registro di sistema e si autoavviano allo startup di windows senza che io abbia minimamente detto loro di avviarsi in modalità admin... come hanno fatto ?? hai dato il permesso all'installer, non al programma di per se'. non l'avrai avviato come amministratore ma avrai cliccato su "Continua" in una finestra di conferma dell'UAC.
Per non avere problemi usa le cartelle del profilo utente (tipo %AppData%). era meglio system32. le cartelle in %AppData%, come suggerisce il nome della variabile d'ambiente, non servono a contenere i programmi eseguibili ma i loro dati. i programmi vanno installati in Program Files.
Kralizek
16-03-2010, 14:21
ni... in %APPDATA% ci si installano anche alcuni programmi (tipo Screamer Radio).
Se sbaglia lui perché vuoi sbagliare anche te ? :D
era meglio system32. le cartelle in %AppData%, come suggerisce il nome della variabile d'ambiente, non servono a contenere i programmi eseguibili ma i loro dati. i programmi vanno installati in Program Files.
Per il suo scopo sarebbe più adatto un installer dato che in questo modo vengono richiesti i privilegi in automatico all'atto dell'installazione...
Comunque se non erro ci dovrebbe essere il modo per richiamare l'elevazione direttamente da programma qualora ce ne fosse bisogno.
PS: un altro esempio noto di programma che si installa in %AppData% è Google Chrome ;).
Comunque se non erro ci dovrebbe essere il modo per richiamare l'elevazione direttamente da programma qualora ce ne fosse bisogno. non so se é possibile elevare dinamicamente a runtime, ma per richiedere che il tuo programma venga eseguito come amministratore basta che lo specifichi nel manifesto quando compili il programma. non ricordo la struttura del file XML ma in Visual C++ c'é l'opzione in mezzo a quelle del manifesto.
PS: un altro esempio noto di programma che si installa in %AppData% è Google Chrome ;). andiamo bene... fortuna che si tratta di un browser che dovrebbe fare attenzione alle questioni di sicurezza: la convenzione di installare i programmi in cartelle con permessi di sola lettura/esecuzione é dettata da motivi di sicurezza; se si concede la possibilitá di modificare un eseguibile aumenta la probabilitá che lo faccia un virus. a causa di questo fatto potrebbero esistere dei virus che si inseriscono all'interno dell'eseguibile di Google Chrome (ti assicuro che é molto piu semplice di quanto possa sembrare: basta crearci dentro una nuova sezione e dirottarci l'entry point, fattibilissimo per chi conosce il formato PE) e che compiono malefatte a nome suo.
bravissima Google, vorrei proprio sapere quali fantomatiche motivazioni hanno dettato questa scelta assurda.
Ho linkato sopra come fare il file manifest ;)
cdimauro
17-03-2010, 07:34
non so se é possibile elevare dinamicamente a runtime,
Di essere è possibile sicuramente, ma non ho mai provato (mai avuta questa necessità).
Ecco qui un processo che si autoesegue elevato: http://www.codeproject.com/KB/vista-security/VistaElevator.aspx
Ovviamente previa richiesta dell''UAC.
cdimauro
17-03-2010, 08:07
Mi mancava proprio l'esempio. Grazie. :)
3nigma666
17-03-2010, 20:42
Servono i privilegi admin perché fai qualcosa che non dovresti fare.
Soprattutto non capisco perché il programma si debba auto-copiare necessariamente in system32.
Per non avere problemi usa le cartelle del profilo utente (tipo %AppData%).
perchè èin remoto , e non posso sharare la cartella system32 , è FOLLE!!!
Ho linkato sopra come fare il file manifest ;) pardon :)
Di essere è possibile sicuramente, ma non ho mai provato (mai avuta questa necessità). nell'esempio postato da cionci non c'é un vero e proprio elevamento dinamico che cambia il contesto di sicurezza esistente, il processo da quanto ho capito riavvia se stesso in maniera elevata facendo apparire la richiesta di conferma dell'UAC.
perchè èin remoto , e non posso sharare la cartella system32 , è FOLLE!!! scusa eh, a me non sembra tanto folle che non si possa condividere in rete la cartella contenente il software di sistema :stordita:
cdimauro
18-03-2010, 07:25
nell'esempio postato da cionci non c'é un vero e proprio elevamento dinamico che cambia il contesto di sicurezza esistente, il processo da quanto ho capito riavvia se stesso in maniera elevata facendo apparire la richiesta di conferma dell'UAC.
Peccato.
Comunque è sicuramente fattibile. Total Commander, ad esempio, ne fa uso (ed è scritto in Delphi).
nell'esempio postato da cionci non c'é un vero e proprio elevamento dinamico che cambia il contesto di sicurezza esistente, il processo da quanto ho capito riavvia se stesso in maniera elevata facendo apparire la richiesta di conferma dell'UAC.
Probabilmente si potrà, ma credo che di fatto vada cambiato l'owner del processo attuale...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.