Autor
|
Tema: Seguridad windows (Leído 4,799 veces)
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Hola quiero aprender el tema de los permisos, privilegios y el uac con la windows api. Estoy leyendo información en la pagina de microsoft pero todo es muy confuso al principio supongo. Al final quiero conseguir poder comprobar y pedir permisos de administrador, acceder y leer al registro y archivos protegidos. Yo estoy leyendo esto http://msdn.microsoft.com/en-us/library/windows/desktop/aa374731(v=vs.85).aspx#sspi_functions Pero si sabéis otro sitio de donde pueda aprender sobre esto? Saludos
|
|
|
En línea
|
|
|
|
daryo
|
se que no es la forma correcta de hacerlo lo ideal es haciendo el manifest pero funciona y eso para mi basta jeje #include <iostream> #include <windows.h> using namespace std; int permisosadm(); int main() { if(permisosadm()==1) { cout << "ya tengo permisos de administrador :D" << endl; } else { return 0; } return 0; } int permisosadm() { HANDLE archivo; // abrimos un archivo en c en esa ubicacion necesitamos permisos de administrador archivo=CreateFile("C:\\random",GENERIC_READ|GENERIC_WRITE ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); //si da error entones no tenemos permisos if(archivo==INVALID_HANDLE_VALUE) CloseHandle(archivo); TCHAR dir[2045]; //la ruta del programa que estamos ejecutando GetModuleFileName(NULL,dir,2045); // luego lo vuelve a abrir pero con runas comando que pide permisos de administrador ShellExecute(NULL,"runas",dir,NULL,NULL,SW_SHOWNORMAL); // revuelve cero y acaba funcion return 0; } // si llega aca si tiene permisos de admin cierra el archivo y devuelve uno CloseHandle(archivo); return 1; }
|
|
« Última modificación: 14 Junio 2014, 18:41 pm por daryo »
|
En línea
|
buenas
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
Busca el libro 'Windows internals' capitulo de seguridad, de lo mejor.
|
|
|
En línea
|
|
|
|
|
daryo
|
Hola daryo yo para saber si soy administrador hice algo parecido pero yo intento escribir en el registro y si no me devuelve error 5 soy administrador pero esto no es nada A mi no me basta solo con esto quiero mas. leyendo un poco la msdn ( lo que hace falta tener un buen nivel de ingles :-'( ) y probando algunas cosas con el registro como escribir en el. y al parecer funciona : #include <iostream> #include <windows.h> using namespace std; int permisosadm(); int main() { if(permisosadm()==1) { HKEY lol; SECURITY_INFORMATION asd; PSECURITY_DESCRIPTOR nw; DWORD resultado; RegGetKeySecurity(lol,asd,nw,&resultado); const char val[]="valor"; RegCreateKeyEx(HKEY_LOCAL_MACHINE,"software\\nuevo",0,NULL,0,KEY_WRITE,NULL,&lol,NULL); //RegSetValue(lol,"jaja",REG_SZ,"prueba",0); RegSetValueEx(lol,"prueba",0,REG_SZ,(LPBYTE)val,sizeof(val)); cout << "ya tengo permisos de administrador :D" << endl; } else { return 0; } return 0; } int permisosadm() { HANDLE archivo; archivo=CreateFile("C:\\random",GENERIC_READ|GENERIC_WRITE ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(archivo==INVALID_HANDLE_VALUE) { CloseHandle(archivo); TCHAR dir[2045]; GetModuleFileName(NULL,dir,2045); ShellExecute(NULL,"runas",dir,NULL,NULL,SW_SHOWNORMAL); return 0; } CloseHandle(archivo); return 1; }
|
|
« Última modificación: 15 Junio 2014, 01:45 am por daryo »
|
En línea
|
buenas
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Me refiria a algo como esto: int result; RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&clave); result=RegSetValueEx(clave,"windows",0,REG_SZ,(BYTE *)dir,sizeof(dir)); if(result==5) cout << "No eres administrador :-(";
|
|
|
En línea
|
|
|
|
daryo
|
mm no lo veo demasiado complicado de adaptar jeje ya pudiendo escribir en HKEY_LOCAL_MACHINE.
tambien puedes usar hkey_current_user\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run asi no necesitaras permisos de admin.
|
|
|
En línea
|
buenas
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
Lo que estas buscando es copy-paste? Ese libro te explica como Windows funciona no hay necesitdad de copy-paste. Me refiria a algo como esto: int result; RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&clave); result=RegSetValueEx(clave,"windows",0,REG_SZ,(BYTE *)dir,sizeof(dir)); if(result==5) cout << "No eres administrador :-(";
Eso no realmente te dice que eres administrador o no. mejor OpenProcessToken>GetTokenInformation.TokenIsElevated
|
|
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
daryo gracias ahora no me pide permisos de administrador pero no me entere porque en local_machine si y en el otro no?
x64Core no quiero copy/paste y tienes razón. Ahora al pensar lo creo que es mejor leer me el libro y luego al saber como funciona windows con mas detalles ya supongo que lo podre adaptar al c++ y entonces me leere las funciones de la API.
|
|
|
En línea
|
|
|
|
daryo
|
daryo gracias ahora no me pide permisos de administrador pero no me entere porque en local_machine si y en el otro no?
porque key_current_user es solo del usuario no de todo el sistema si inicia desde otro usuario no se va a cargar el programa.
|
|
|
En línea
|
buenas
|
|
|
|
|