Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 13 Noviembre 2014, 14:26 pm



Título: Duda pasar de LPWSTR a char *
Publicado por: Kaxperday en 13 Noviembre 2014, 14:26 pm
Tema muy muy frustrante, érase un keylogger:

Código:
HWND ventana;
LPWSTR cadena;
char ventanika[500];
while(1)
{
GetWindowText(ventana, cadena, 500);
//metemos en ventanika lo de cadena
fprintf(log, "[-] [ Ventana: %s ]", ventanika);
}

He probado todo, todo.

Luego como se inicializa ese demonio, ni un ejemplo.
Vale si pones: LPWSTR cadena=L"***** de cadena";
Luego usas GETWINDOWTEXT y sigue teniendo ***** de cadena XD

Luego me hizo gracia el visual studio hice un programa fuí a ejecutarlo en otro ordenador y me dió eror que faltaba una dll me decía MVS... .dll wtf?

Edito: LOL no se puede escribir mir..a en el foro.

Edito: No se trata de convertir el tema realmente sino de porque no funciona GETWINDOWTEXT y no me carga la cadena.

Otra prueba más:

Código:
HWND ventana;
char ventanika[500];
while(1)
{
GetWindowText(ventana, (LPWSTR)ventanika, 500);
for (int i = 0; ventanika[i] != '\0'; i++)
{
printf("%c", ventanika[i]);
}
system("pause");
}

Creo que por aquí avanzamos más pero así solo me muestra el primer caracter, debe de ser un puntero pero aun así debería de sacar todos los caracteres no? x`p
xD


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: MCKSys Argentina en 13 Noviembre 2014, 14:36 pm
Luego me hizo gracia el visual studio hice un programa fuí a ejecutarlo en otro ordenador y me dió eror que faltaba una dll me decía MVS... .dll wtf?

Puedes hacer que MSVC++ compile sin dependencias. Con eso no pedirá más el runtime...

Saludos!


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: eferion en 13 Noviembre 2014, 14:37 pm
Luego me hizo gracia el visual studio hice un programa fuí a ejecutarlo en otro ordenador y me dió eror que faltaba una dll me decía MVS... .dll wtf?

Una cosa es desarrollar una aplicación y otra "desplegarla". Una aplicación, por norma general, no es autocontenida, es decir, no tiene todo el código necesario para su ejecución. Dependiendo del compilador suele ser necesario arrastrar junto con el ejecutable una serie de librerías.

Por ejemplo, para el compilador de windows, suelen hacer falta las librerías: "msvcrXX.dll" (si compilas C) y "msvcpXX.dll" (si compilas C++), donde XX es la versión del compilador. Sin embargo, si compilas con mingw es posible que tengas que copiar las librerías "mingwmXX.dll", "libgcc_s_dwX-Y.dll" y "libstdc++-X.dll"

Lo mejor muchas veces es usar una aplicación tipo "dependency walker" para saber las dependencias exactas de una aplicación o dll y así asegurarnos de que nos llevamos todo lo necesario para poder ejecutar nuestros proyectos.

Como te comentaron, se puede configurar el compilador para que compile sin dependencias, todo es cuestión de mirar la documentación y trastear.

Un saludo.


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: Eternal Idol en 13 Noviembre 2014, 14:39 pm
Asi como lo pones tenes un puntero indefinido llamado cadena, puede apuntar a cualquier lado. El VC++ lo indica claramente:
x.cpp (?) : warning C4700: uninitialized local variable 'cadena' used

Supongo que buscas esto:
Código
  1. wchar_t cadena[500];

Y si, enlaza la RTL estaticamente.


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: Kaxperday en 13 Noviembre 2014, 14:50 pm
Gracias no esperaba unas respuestas tan rapidas, respecto a lo de la dll ya mirare algo para que compile sin dependencias uso MVS13.

Por lo del programa he probado lo que dijo etternal idol sustituyendo la deficinion de cadena anterior por la suya y nada sigue mostrandome un caracter el puntero o lo que sea porque el LWSTR es algo raro de c*****s. xD

Creo que el camino más facil estará por aquí (por si no lo leístes cuando edite):

Código
  1. HWND ventana;
  2. char ventanika[500];
  3. while(1)
  4. {
  5. GetWindowText(ventana, (LPWSTR)ventanika, 500);
  6. for (int i = 0; ventanika[i] != '\0'; i++)
  7. {
  8. printf("%c", ventanika[i]);
  9. }
  10. system("pause");
  11. fprintf(log, "[-] [ Ventana: %s ]", ventanika);
  12. }
  13.  



Título: Re: Duda pasar de LPWSTR a char *
Publicado por: Eternal Idol en 13 Noviembre 2014, 14:53 pm
Ese casting es erroneo, LPWSTR significa Long Pointer Wide String, por eso como te mostre tenes que usar wchar_t (Wide char) y no char. Y deberias usar %ws no %s por la misma razon.


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: daryo en 13 Noviembre 2014, 15:03 pm
a mi me funciono asi

Código
  1. LPTSTR cadena;
  2. char n[60];
  3. GetWindowTextA(hwnd,cadena,60);
  4. strcpy(n,cadena);
  5.  
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633520%28v=vs.85%29.aspx


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: Kaxperday en 13 Noviembre 2014, 15:09 pm
OH! MAGIA, te quiero, ahora solo falla que strlen() funcione, pero eso ya es mal mucho menor <3<3

Codigo por si alguien le pasa (no se fien mucho)

Código
  1. HWND ventana;
  2. char ventanika[500];
  3. while(1)
  4. {
  5. GetWindowText(ventana, (LPWSTR)ventanika, 500);
  6. fprintf(log, "[-] [ Ventana: %s ]", ventanika);
  7. }
  8.  

PD: el unicornio de daryo me hace la competencia, probare lo de daryo de toda formas

Edito: Lo de daryo no me funciono el strcpy.. ademas usas otro puntero, lo probe tal cual y me dio error xp

Edito: Me ha encantado la ***** que hice para suplantar el strlen()

if(strlen(vetanika)>0) ---> if(ventanika[0]!='\0') jajaja


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: Eternal Idol en 13 Noviembre 2014, 15:25 pm
Esto es un problema de enfoque, hay que leer sobre ANSI vs Unicode antes de continuar sin entender lo que se esta haciendo ... si estan en Unicode tienen que usar las funciones de cadena para Wide char (wcslen por ejemplo). daryo si eso te compila es por una razon: estas en ANSI; igual tiene el mismo problema que el codigo original, cadena es un puntero indefinido (a char en tu caso, a wchar_t si se definiera Unicode en el proyecto y ahi ya no compilaria mas).

MSDN: Unicode and ANSI names GetWindowTextW (Unicode) and GetWindowTextA (ANSI)

Kaxperday: te repito, ese casting es un error logico, si estas en Unicode y por eso usas GetWindowTextW le estas diciendo a la funcion que tu buffer tiene 500 caracteres y no es cierto si usas char[500] y ese casting, tenes 250 caracteres.


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: daryo en 13 Noviembre 2014, 15:36 pm
 pues si toda la razon uso ansi. entonces mejor especificar
Código
  1. GetWindowTextA

PD: prueba
Código
  1. char n[60];
  2.    GetWindowTextA(hwnd,(LPTSTR)n,60);


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: Eternal Idol en 13 Noviembre 2014, 15:49 pm
pues si toda la razon uso ansi. entonces mejor especificar
Código
  1. GetWindowTextA

PD: prueba
Código
  1. char n[60];
  2.    GetWindowTextA(hwnd,(LPTSTR)n,60);


No hace falta en realidad, eso se hace automaticamente con los .h de Windows, al igual que el casting a LPTSTR (en ANSI es char *, no cambia nada y si lo hiciera - en el caso de que tu variable fuera de tipo wchar_t por ejemplo - seria un problema, como en el codigo de Kaxperday). No se acostumbren a poner castings por poner, usenlos cuando sea necesario.


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: daryo en 13 Noviembre 2014, 15:56 pm
entonces asi?
Código
  1. char *n;
  2. GetWindowText(hwnd,n,60);
  3.  
bueno me rindo xD


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: someRandomCode en 13 Noviembre 2014, 16:05 pm
entonces asi?
Código
  1. char *n;
  2. GetWindowText(hwnd,n,60);
  3.  
bueno me rindo xD

Nop, porque el puntero ese no tiene memoria asignada.
Para eso existe la funcion GetWindowTextLength (A y W)
Si vas a usar las funciones con ANSI y queres llamarlas como GetWindowText por ejemplo, podes poner en la cabecera un #undef UNICODE


EDIT: Edito para agregar a que me referia

Usa malloc/new/HeapAlloc/GlobalAlloc/la forma de obtener la memoria dinamica que mas te guste o bien declara un array con el tamaño suficiente para almacenar los titulos de las ventanas.
Con GetWindowTextLength(http://msdn.microsoft.com/en-us/library/windows/desktop/ms633521(v=vs.85).aspx) dado un HWND te dice cuantos caracteres tiene el titulo, a eso le sumas uno para el '\0' (caracter terminador).
Despues si llamas tranquilamente a GetWindowText


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: Eternal Idol en 13 Noviembre 2014, 16:06 pm
entonces asi?
Código
  1. char *n;
  2. GetWindowText(hwnd,n,60);
  3.  
bueno me rindo xD

No  ;D El anterior estaba bien, solo que el casting era redundante.

someRandomCode: mejor configurar el proyecto en el IDE para no tener que "desdefinir" nada.


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: daryo en 13 Noviembre 2014, 16:09 pm
No  ;D El anterior estaba bien, solo que el casting era redundante.

someRandomCode: mejor configurar el proyecto en el IDE para no tener que "desdefinir" nada.
a bueno gracias ya entendi xD
si fuera mi posts le pondria chulo


Título: Re: Duda pasar de LPWSTR a char *
Publicado por: someRandomCode en 13 Noviembre 2014, 16:10 pm
No  ;D El anterior estaba bien, solo que el casting era redundante.

someRandomCode: mejor configurar el proyecto en el IDE para no tener que "desdefinir" nada.

Es que uso Sublime Text e invoco MSVC o Mingw-w64 desde la terminal porque sino me parece que se me pasan de largo algunas cositas.. Algunos IDE pasan por defecto -fpermissive (dev-cpp) que es mala idea jeje, porque no te avisa de algunas cosas por ejemplo con los punteros a funciones y la convencion con la que llamarla..
PD: Te debo una cervecita por la ayuda del otro dia :)