Buenas, estoi intentando hacer una Shell Remota en C ya que nunca hice una en este lenguaje y me pica la curiosidad :xD el caso es que no me sale...
El código que tengo es este:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
PHANDLE leer;
PHANDLE escribir;
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD bytes;
CreatePipe(leer,escribir,&sa,0);
si.cb = 68;
si.dwFlags = 257;
si.hStdError = escribir;
si.hStdOutput = escribir;
CreateProcessA(0,"cmd.exe /c ping 127.0.0.1", &sa, &sa, 1, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);
Sleep(100);
CloseHandle(escribir);
char buffer[1024];
char total[1024];
int ret = ReadFile(leer,buffer,250,&bytes,0);
lstrcat(total,buffer);
while(ret != 0)
{
ret = ReadFile(leer,buffer,250,&bytes,0);
lstrcat(total,buffer);
}
MessageBoxA(0,total,0,0);
system("PAUSE");
return 0;
}
Alguien sabe que hago mal?
salu2!
Esta es la buen forma de hacerlo:
http://goodfellas.shellcode.com.ar/docz/asm/WritingSmallShellcode.pdf
:D
Muchas gracias Karcrack sin duda lo leeré pero tambien me gustaria saber que ago mal en el código que postee.
salu2!
¿No tendrías que crear el pipe luego de iniciar la shell? Estas llamando a CreatePipe con dos handles nulos (o ni eso, que no están inicializados a 0), al igual que tampoco inicializaste a 0 los miembros de PROCESS_INFORMATION y STARTUPINFO (salvo cb, que sí lo pusiste bien).
Saludos
Muchas gracias a los dos, ya lo consegui hacer... el caso es que me quedo así:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;
void * leer;
void * escribir;
ZeroMemory(&sa,sizeof(&sa));
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
CreatePipe(&leer,&escribir,&sa,0);
GetStartupInfoA(&si);
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdOutput = escribir;
si.hStdError = escribir;
si.hStdInput = leer;
CreateProcessA(0,"c:\\windows\\system32\\cmd.exe /c dir",0,0,TRUE,0,0,0,&si,&pi);
Sleep(200);
CloseHandle(escribir);
char buffer[1024];
DWORD bleidos;
ReadFile(leer,buffer,1024,&bleidos,0);
MessageBoxA(0,buffer,0,0);
system("PAUSE");
return 0;
}
No es una "MegaShell" pero su "apaño" hace :P
salu2!
@Drinky94: Mejor seria que en vez de utilizar una ruta hardcodeada pusieses la variable de entorno adecuada; %ComSpec% :) Y eso de usar Sleeps es muy cutre :P :P
Te refieres a esperar a que se cree el proceso usando WaitForSingleObject, no?
salu2!
Hasta que el proceso no se crea no continua la ejecución de tu programa :D
Cita de: Karcrack en 27 Marzo 2011, 21:26 PM
Hasta que el proceso no se crea no continua la ejecución de tu programa :D
No se me ocurre como hacerlo... de una forma rápida, alguna pista?
salu2!
No hay que hacer nada :huh: Con hacer CreateProces() sobra... hasta que el proceso no se ha creado no vuelve la ejecución a tu programa...
Ah, vale... ;D
thanks...