Duda pasar de LPWSTR a char *

Iniciado por Kaxperday, 13 Noviembre 2014, 14:26 PM

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

Kaxperday

Tema muy muy frustrante, érase un keylogger:


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:


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
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

MCKSys Argentina

Cita de: Kaxperday en 13 Noviembre 2014, 14:26 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!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


eferion

Cita de: Kaxperday en 13 Noviembre 2014, 14:26 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.

Eternal Idol

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 (c++) [Seleccionar]
wchar_t cadena[500];

Y si, enlaza la RTL estaticamente.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

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 (cpp) [Seleccionar]

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");
fprintf(log, "[-] [ Ventana: %s ]", ventanika);
}


Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

#5
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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

daryo

#6
a mi me funciono asi


LPTSTR cadena;
char n[60];
GetWindowTextA(hwnd,cadena,60);
strcpy(n,cadena);

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633520%28v=vs.85%29.aspx
buenas

Kaxperday

#7
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 (cpp) [Seleccionar]

HWND ventana;
char ventanika[500];
while(1)
{
GetWindowText(ventana, (LPWSTR)ventanika, 500);
fprintf(log, "[-] [ Ventana: %s ]", ventanika);
}


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
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

#8
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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

daryo

#9
 pues si toda la razon uso ansi. entonces mejor especificar
GetWindowTextA

PD: prueba
char n[60];
    GetWindowTextA(hwnd,(LPTSTR)n,60);

buenas