Seguridad windows

Iniciado por patilanz, 13 Junio 2014, 17:21 PM

0 Miembros y 1 Visitante están viendo este tema.

patilanz

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

daryo

#1
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;
   }
   system("pause");
   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;


}
buenas

x64core

Busca el libro 'Windows internals' capitulo de seguridad, de lo mejor.

patilanz

#3
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  ;D A mi no me basta solo con esto quiero mas.

x64Core encontre el libro parte 1 6 edicion pero son cosas de windows y no hay codigo c/c++ o es esto lo que necesito para entender lo luego en c++?

http://infoman.teikav.edu.gr/~stpapad/WindowsInternalsPart16thEdition.pdf

Parece estar bien y se ve que te explican muchas.
Dentro del libro recomiendan esto para saber mas como usar la windows api con c++

http://read.pudn.com/downloads156/ebook/693901/Windows%20via%20C%E3%80%81C%2B%2B,%20Fifth%20Edition.pdf

Todavia no lo he visto pero puede que explican lo que quiero.

Saludos

daryo

#4
CitarHola 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  ;D 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;
   }
   system("pause");
   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;


}


buenas

patilanz

Me refiria a algo como esto:

Código (cpp) [Seleccionar]

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 :-(";

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.

buenas

x64core

Cita de: patilanz en 15 Junio 2014, 00:01 AM
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  ;D A mi no me basta solo con esto quiero mas.

x64Core encontre el libro parte 1 6 edicion pero son cosas de windows y no hay codigo c/c++ o es esto lo que necesito para entender lo luego en c++?

http://infoman.teikav.edu.gr/~stpapad/WindowsInternalsPart16thEdition.pdf

Parece estar bien y se ve que te explican muchas.
Dentro del libro recomiendan esto para saber mas como usar la windows api con c++

http://read.pudn.com/downloads156/ebook/693901/Windows%20via%20C%E3%80%81C%2B%2B,%20Fifth%20Edition.pdf

Todavia no lo he visto pero puede que explican lo que quiero.

Saludos
Lo que estas buscando es copy-paste?  Ese libro te explica como Windows funciona no hay necesitdad de copy-paste.


Cita de: patilanz en 15 Junio 2014, 01:57 AM
Me refiria a algo como esto:

Código (cpp) [Seleccionar]

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

patilanz

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.

daryo

Citardaryo 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.
buenas