wzcook.c
上传用户:fubang
上传日期:2009-06-18
资源大小:2071k
文件大小:8k
源码类别:

其他

开发平台:

Unix_Linux

  1. /*
  2.  *  Windows XP WEP key recovery program
  3.  *
  4.  *  Copyright (C) 2004,2005  Christophe Devine
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  */
  20. #include <windows.h>
  21. #include <stdio.h>
  22. #include "console.h" 
  23. int prompt_exit( int retval )
  24. {
  25.     int i;
  26.     printf( "n  Keys have been stored in C:\wepkeys.txt. Press Ctrl-C.n" );
  27.     scanf( "%d", &i );
  28.     exit( retval );
  29. }
  30. int zero_key[32] =
  31. {
  32.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  33.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  34.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  35.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  36. };
  37. int xor_key[32] =
  38. {
  39.     0x56, 0x66, 0x09, 0x42, 0x08, 0x03, 0x98, 0x01,
  40.     0x4D, 0x67, 0x08, 0x66, 0x11, 0x56, 0x66, 0x09,
  41.     0x42, 0x08, 0x03, 0x98, 0x01, 0x4D, 0x67, 0x08,
  42.     0x66, 0x11, 0x56, 0x66, 0x09, 0x42, 0x08, 0x03
  43. };
  44. #define WZCSVC_LIST "Software\Microsoft\WZCSVC\Parameters\Interfaces"
  45. char ServiceName[] = "WZCOOK";
  46. char DisplayName[] = "WEP/WPA-PMK key recovery service";
  47. typedef struct
  48. {
  49.   DWORD cbData;
  50.   BYTE* pbData;
  51. }
  52. DATA_BLOB;
  53. typedef BOOL (WINAPI *PROC1)
  54.     (DATA_BLOB *,void *,void *,void *,
  55.      void *,void *,DATA_BLOB *);
  56. void WINAPI myHandler( DWORD fdwControl )
  57. {
  58.     if( fdwControl == SERVICE_CONTROL_SHUTDOWN )
  59.     {
  60.         ExitProcess( 0 );
  61.     }
  62. }
  63. void WINAPI ServiceMain( DWORD dwArgc, LPTSTR *lpszArgv )
  64. {
  65.     FILE *f_out;
  66.     char buffer[1024];
  67.     char keystr[1024];
  68.     int length, keytype, i;
  69.     int keyidx1, keyidx2;
  70.     HMODULE hCrypt32dll;
  71.     PROC1 CryptUnprotectData;
  72.     HKEY regkey_iface;
  73.     HKEY regkey_wzcsvc;
  74.     DATA_BLOB pIn, pOut;
  75.     SERVICE_STATUS_HANDLE sth;
  76.     SERVICE_STATUS status;
  77.     sth = RegisterServiceCtrlHandler( ServiceName, myHandler );
  78.     memset( &status, 0, sizeof( SERVICE_STATUS ) );
  79.     status.dwServiceType        = SERVICE_WIN32_OWN_PROCESS;
  80.     status.dwCurrentState       = SERVICE_RUNNING;
  81.     status.dwControlsAccepted   = SERVICE_ACCEPT_SHUTDOWN;
  82.     status.dwWin32ExitCode      = NO_ERROR;
  83.     SetServiceStatus( sth, &status );
  84.     if( ( f_out = fopen( "c:\wepkeys.txt", "w+" ) ) == NULL )
  85.         exit( 1 );
  86.     *stdin  = *f_out;
  87.     *stdout = *f_out;
  88.     *stderr = *f_out;
  89.     if( ! ( hCrypt32dll = LoadLibrary( "Crypt32.dll" ) ) )
  90.     {
  91.         printf( "  Fatal: LoadLibrary(Crypt32.dll) failedn" );
  92.         exit( 1 );
  93.     }
  94.     if( ! ( CryptUnprotectData = (PROC1) GetProcAddress(
  95.                 hCrypt32dll, "CryptUnprotectData" ) ) )
  96.     {
  97.         printf( "  Fatal: GetProcAddress(CryptUnprotectData) failedn" );
  98.         exit( 1 );
  99.     }
  100.     if( RegOpenKey( HKEY_LOCAL_MACHINE, WZCSVC_LIST,
  101.                     &regkey_wzcsvc ) != ERROR_SUCCESS )
  102.     {
  103.         printf( "  Fatal: RegOpenKey(%s) failedn", WZCSVC_LIST );
  104.         exit( 1 );
  105.     }
  106.     keyidx1 = 0;
  107.     printf( "n  ESSID                             WEP KEY / WPA PMKnn" );
  108.     while( RegEnumKey( regkey_wzcsvc, keyidx1,
  109.                        buffer, sizeof( buffer ) ) == ERROR_SUCCESS )
  110.     {
  111.         sprintf( keystr, "%s\%s", WZCSVC_LIST, buffer );
  112.         if( RegOpenKey( HKEY_LOCAL_MACHINE, keystr,
  113.                         &regkey_iface ) != ERROR_SUCCESS )
  114.         {
  115.             printf( "  Error: RegOpenKey(%s) failedn", keystr );
  116.             continue;
  117.         }
  118.         keyidx2 = 0;
  119.         while( 1 )
  120.         {
  121.             sprintf( keystr, "Static#%04d", keyidx2 );
  122.             length = sizeof( buffer );
  123.             memset( buffer, 0, length );
  124.             if( RegQueryValueEx( regkey_iface, keystr, NULL,
  125.                                  &keytype, buffer, &length ) !=
  126.                                  ERROR_SUCCESS )
  127.                 break;
  128.             pIn.cbData = length - *(int *)(buffer);
  129.             pIn.pbData = buffer + *(int *)(buffer);
  130.             pOut.cbData = 0;
  131.             pOut.pbData = 0;
  132.             if( CryptUnprotectData( &pIn, NULL, NULL, NULL, NULL,
  133.                                     0, &pOut ) != TRUE )
  134.             {
  135.                 printf( "  Error: CryptUnprotectData failedn" );
  136.                 keyidx2++;
  137.                 continue;
  138.             }
  139.             if( ! memcmp( pOut.pbData, zero_key, 32 ) )
  140.             {
  141.                 keyidx2++;
  142.                 continue;
  143.             }
  144.             printf( "  %-32s  ", buffer + 0x14 );
  145.             for( i = 0; i < (int) pOut.cbData; i++ )
  146.                 printf( "%02X", pOut.pbData[i] ^ xor_key[i % 32] );
  147.             printf( "n" );
  148.             keyidx2++;
  149.         }
  150.         RegCloseKey( regkey_iface );
  151.         keyidx1++;
  152.     }
  153.     RegCloseKey( regkey_wzcsvc );
  154.     exit( 0 );
  155. }
  156. int main( int argc, char *argv[] )
  157. {
  158.     FILE *f_in;
  159.     int userlen;
  160.     char buffer[512];
  161.     SC_HANDLE sc1, sc2;
  162.     SERVICE_TABLE_ENTRY ste[2] =
  163.     {
  164.         { ServiceName, ServiceMain },
  165.         { NULL, NULL }
  166.     };
  167.     userlen = sizeof( buffer );
  168.     GetUserName(  buffer, &userlen );
  169.     if( ! strcmp( buffer, "SYSTEM" ) )
  170.     {
  171.         StartServiceCtrlDispatcher( ste );
  172.         return( 1 );
  173.     }
  174.     set_console_icon( " WZCOOK - WEP/WPA-PMK Key Recovery Service from " 
  175.                       "XP's Wireless Zero Configuration utility " );
  176.     set_console_size( 50, 102 );
  177.     if( sc1 = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ) )
  178.     {
  179.         if( sc2 = OpenService( sc1, ServiceName, SERVICE_ALL_ACCESS ) )
  180.         {
  181.             DeleteService( sc2 );
  182.             MessageBox( NULL, "WZCOOK service has been deleted",
  183.                         "Information", MB_OK | MB_ICONINFORMATION );
  184.         }
  185.         else
  186.         {
  187.             if( GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST )
  188.             {
  189.                 sc2 = CreateService(
  190.                         sc1, ServiceName, DisplayName,
  191.                         SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
  192.                         SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE,
  193.                         GetCommandLine(), NULL, NULL, NULL, NULL, NULL );
  194.                 if( sc2 != NULL )
  195.                 {
  196.                     StartService( sc2, 0, NULL );
  197.                     Sleep( 2000 );
  198.                     DeleteService( sc2 );
  199.                 }
  200.                 else
  201.                 {
  202.                     MessageBox( NULL, "Could not create WZCOOK service",
  203.                                 "Fatal error", MB_OK | MB_ICONERROR );
  204.                     exit( 1 );
  205.                 }
  206.             }
  207.             else
  208.             {
  209.                 MessageBox( NULL, "Could not open WZCOOK service",
  210.                             "Fatal error", MB_OK | MB_ICONERROR );
  211.                 exit( 1 );
  212.             }
  213.         }
  214.     }
  215.     else
  216.     {
  217.         MessageBox( NULL, "Could not open service manager,n" 
  218.                     "maybe you're not an administrator ?",
  219.                     "Fatal error", MB_OK | MB_ICONERROR );
  220.         exit( 1 );
  221.     }
  222.     if( sc2 != NULL ) CloseServiceHandle( sc2 );
  223.     if( sc1 != NULL ) CloseServiceHandle( sc1 );
  224.     if( ( f_in = fopen( "c:\wepkeys.txt", "r" ) ) == NULL )
  225.     {
  226.         MessageBox( NULL, "Could not read c:\wepkeys.txt, the " 
  227.                     "WZCOOK service probably failed unexpectedly",
  228.                     "Fatal error", MB_OK | MB_ICONERROR );
  229.         exit( 1 );
  230.     }
  231.     while( fgets( buffer, sizeof( buffer ) - 1, f_in ) )
  232.     {
  233.         printf( "%s", buffer );
  234.         Sleep( 500 );
  235.     }
  236.     fclose( f_in );
  237.     prompt_exit( 0 );
  238.     return( 0 );
  239. }