Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: el_doctor en 17 Septiembre 2013, 19:06 pm



Título: Desactivar un adaptador de red desde C++
Publicado por: el_doctor en 17 Septiembre 2013, 19:06 pm
Hola, existe alguna manera de desactivar las tarjetas de red desde una aplicación hecha en C++ he estado leyendo la documentación msdn y está la clase Win32_NetworkAdapter la he usado desde C# pero no me funciona no se si puedo usar esta clase en C++ y hacer que funcione o hay alguna otra forma de hacerlo desde C++.

Gracias por su ayuda


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: Eternal Idol en 17 Septiembre 2013, 19:56 pm
Si, por supuesto que se puede, busca informacion y ejemplos sobre WMI. Casi con toda seguridad todas esas clases terminan llamando a la API de Windows para implementar su funcionalidad ...


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: ecfisa en 17 Septiembre 2013, 19:59 pm
Hola.

Fijate si te sirve alguna de las opciónes de este enlace: Enabling and disabling interface/adapter (http://www.gershnik.com/faq/manage.asp#enable).

Saludos. :)


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: el_doctor en 17 Septiembre 2013, 20:33 pm
Gracias ecfisa lo voy a revisar.

Eternal no me dará problemas usar la clase Win32_NetworkAdapter en Windows8 ya que quiero que la aplicación funcione tanto en windows xq como windows 8


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: Eternal Idol en 17 Septiembre 2013, 20:43 pm
No tengo ni la mas minima idea sinceramente, fijate que dice su documentacion y de no servir en Windows 8 seguramente te dara la alternativa para ese S.O..


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: el_doctor en 17 Septiembre 2013, 22:12 pm
Hola Eternal estoy intentando usar la api Win32_NetworkAdapter y según estaba leyendo para usar las api hay que inicializar los servicios COM pero tengo ratos de estar rompiendome la cabeza para validar si se ejecuta bien la función CoInitializeEx según la documentación si todo sale bien devuelve S_OK y hago algo así:

Código
  1. if(CoInitializeEx(0, COINIT_MULTITHREADED) != S_OK)
  2. return NULL;

y al depurar siempre me da error de sintaxis en el if no se si es lo estresado que estoy pero no veo el error


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: Eternal Idol en 17 Septiembre 2013, 22:36 pm
Ese codigo compila, no se que estaras haciendo, asegurate que guardaste los cambios y de ultima recompila ... ni se que IDE usas asi que es dificil adivinar.


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: el_doctor en 17 Septiembre 2013, 22:56 pm
Ya encontré el error era cosa del compilador gracias



Hola Eternal he revisado la documentación del enlace que puso el amigo ecfisa y según lo que ahí describen no es posible desconectar la tarjeta de red de forma real usando la api de windows y sugieren un método usando la interfaz de red shell copie el código e hice la implementación pero no me desconecta la tarjeta de red estoy usando windows 8 voy a poner el código, si me puedes ayudar te lo agradezco o no se si es verídica la información de ese enlace que explican que no es posible desconectar la tarjeta de red usando la api de windows.

Código
  1. bool DisableConecction(LPCWSTR nameConecction)
  2. {
  3.  
  4. bool result = false;
  5.  
  6. CoInitialize(0);
  7.  
  8. typedef void (_stdcall * LPNcFreeNetconProperties) (NETCON_PROPERTIES* pProps);
  9. HMODULE hmod = LoadLibrary(L"netshell.dll");
  10.  
  11. if(!hmod)
  12. return false;
  13.  
  14. LPNcFreeNetconProperties NcFreeNetconProperties =
  15.        (LPNcFreeNetconProperties)GetProcAddress(hmod, "NcFreeNetconProperties");
  16.  
  17. if(!NcFreeNetconProperties)
  18. return false;
  19.  
  20. INetConnectionManager * pMan = 0;
  21.  
  22.    HRESULT hres = CoCreateInstance(CLSID_ConnectionManager,
  23.                                    0,
  24.                                    CLSCTX_ALL,
  25.                                    __uuidof(INetConnectionManager),
  26.                                    (void**)&pMan);
  27.  
  28. if(SUCCEEDED(hres))
  29. {
  30. IEnumNetConnection * pEnum = 0;
  31.  
  32. hres = pMan->EnumConnections(NCME_DEFAULT, &pEnum);
  33.  
  34. if(SUCCEEDED(hres))
  35. {
  36. INetConnection * pCon = 0;
  37. ULONG count;
  38. bool done = false;
  39.  
  40. while(pEnum->Next(1, &pCon, &count) == S_OK && !done)
  41. {
  42. NETCON_PROPERTIES * pProps = 0;
  43.  
  44. hres = pCon->GetProperties(&pProps);
  45.  
  46. if(SUCCEEDED(hres))
  47. {
  48. if(wcscmp (pProps->pszwName, L"Ethernet") == 0) //Aqui lo puse estático ya que este es el nombre que tiene para mi computadora.
  49. {
  50. result = (pCon->Disconnect() == S_OK);
  51. done = true;
  52. }
  53. NcFreeNetconProperties (pProps);
  54. }
  55. pCon->Release();
  56. }
  57. pEnum->Release();
  58. }
  59. pMan->Release();
  60. }
  61. FreeLibrary(hmod);
  62.  
  63. CoUninitialize();
  64.  
  65. return result;
  66. }


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: Eternal Idol en 18 Septiembre 2013, 09:11 am
Sinceramente no se de donde sacas eso, se hace como dice ahi con la Device Installation API. Por logica ningun objeto COM va a poder hacer magia si el S.O. no le provee la funcionalidad ...


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: el_doctor en 18 Septiembre 2013, 16:49 pm
Hola Eternal pues he vuelto con lo de usar la Win API y pues según revisando la documentación de MSDN pues he implementado un código pero he quedado bloqueado para poder ejecutar el método Disable de la WIN32_NetworkAdapter que se supone es para desconectar la tarjeta de red, no se si una vez inicializado el COM y obtener los permisos debo recorrer la clase o como te agradecería si me ayudas te dejo el código que he escrito hasta ahora:

Código
  1. HRESULT hres;
  2.  
  3. //Initialize COM
  4.  
  5. if (CoInitializeEx(0, COINIT_MULTITHREADED) != S_OK)
  6. {
  7. CoUninitialize();
  8. return false;
  9. }
  10.  
  11. // Set general COM security levels --------------------------
  12.  
  13. if (CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
  14. RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL) != S_OK)
  15. {
  16. CoUninitialize();
  17. return false;
  18. }
  19.  
  20. //Obtain the initial locator to WMI
  21.  
  22. IWbemLocator *pLoc = NULL;
  23.  
  24. if (CoCreateInstance (CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc) != S_OK)
  25. {
  26. CoUninitialize();
  27. return false;
  28. }
  29.  
  30. // Connect to WMI through the IWbemLocator::ConnectServer method
  31.  
  32. IWbemServices *pSvc = NULL;
  33.  
  34. hres = pLoc->ConnectServer (_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
  35.  
  36. if (FAILED (hres))
  37. {
  38. pLoc->Release();
  39. CoUninitialize();
  40. return false;
  41. }
  42.  
  43. // Set security levels on the proxy
  44.  
  45. if (CoSetProxyBlanket (pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL,
  46. RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE) != S_OK)
  47. {
  48. pSvc->Release();
  49. pLoc->Release();
  50. CoUninitialize();
  51. return false;
  52. }
  53.  
  54. // set up to call the Win32_NetworkAdapter::Disable method
  55.  
  56. BSTR MethodName = SysAllocString (L"Disable");
  57. BSTR ClassName = SysAllocString (L"Win32_NetworkAdapter");
  58.  
  59. IWbemClassObject* pClass = NULL;
  60. hres = pSvc->GetObject (ClassName, 0, NULL, &pClass, NULL);
  61.  
  62. IWbemClassObject* pInParamsDefinition = NULL;
  63. hres = pClass->GetMethod (MethodName, 0, &pInParamsDefinition, NULL);
  64.  
  65.  


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: Eternal Idol en 18 Septiembre 2013, 17:04 pm
Ese es un objeto COM y no la API de Windows; depura tu programa.


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: el_doctor en 18 Septiembre 2013, 17:26 pm
Lo que estoy intentando hacer es llamar el método disable de la wmi networkAdapter desde un objeto COM



Es que según un ejemplo de la documentación MSDN hacen una llamada al método Create de Win32_Process y lo hacen usando un objeto COM y quería implentar esto mismo pero no lo tengo muy claro como es que lo podría usar para llamar el método Disable para Win32_NetworkAdapter el ejemplo que ponen es casi igual al que puse de iniciar el objeto com y obtener los permisos y la llamada al método la hacen así:

Código
  1. BSTR MethodName = SysAllocString(L"Create");
  2.    BSTR ClassName = SysAllocString(L"Win32_Process");
  3.  
  4.    IWbemClassObject* pClass = NULL;
  5.    hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);
  6.  
  7.    IWbemClassObject* pInParamsDefinition = NULL;
  8.    hres = pClass->GetMethod(MethodName, 0,
  9.        &pInParamsDefinition, NULL);
  10.  
  11.    IWbemClassObject* pClassInstance = NULL;
  12.    hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
  13.  
  14.    // Create the values for the in parameters
  15.    VARIANT varCommand;
  16.    varCommand.vt = VT_BSTR;
  17.    varCommand.bstrVal = L"notepad.exe";
  18.  
  19.    // Store the value for the in parameters
  20.    hres = pClassInstance->Put(L"CommandLine", 0,
  21.        &varCommand, 0);
  22.    wprintf(L"The command is: %s\n", V_BSTR(&varCommand));
  23.  
  24.    // Execute Method
  25.    IWbemClassObject* pOutParams = NULL;
  26.    hres = pSvc->ExecMethod(ClassName, MethodName, 0,
  27.    NULL, pClassInstance, &pOutParams, NULL);


Sabes si es viable lo que intento hacer Eternal y cómo podría hacerlo?


Título: Re: Desactivar un adaptador de red desde C++
Publicado por: Eternal Idol en 18 Septiembre 2013, 19:27 pm
No lo se, supongo que si pero yo te estoy diciendo que uses la API de Windows. Igual no me voy a poner a revisar mas el codigo que estas copiando y pegando, tenes que hacerlo por tu cuenta, tenes que entenderlo y ser capaz de depurarlo para solucionar problemas.