PDA

View Full Version : حرفه ای: کدوم کلید زده شده!



Saman_12
شنبه 27 آذر 1389, 23:34 عصر
سلام.
توی یکی از برنامه هام نیاز دارم (با سرعت عمل بالا) کلید فشرده شده رو تشخیص بدم که عموما این کلید یک کلید ترکیبی هست روش های زیادی رو امتحان کردم که یا جواب نمیده یا کار مورد نظرم رو انجام نمیده.:ناراحت:

من باید KeyCode کلید زده شده رو به دست بیارم , با یک روش که توی اون از API GetAsyncKeyState استفاده کرده بودم تونستم کلید های ترکیبی رو تشخیص بدم و KeyCode شون رو به دست بیارم این روش چندین عیب داشت که به چند تاشون به اختصار میپردازم :

1.زمانی که برنامه اجرا میشه حتی اگر یک هزارم ثانیه یک کلید رو فشار بدید (مثلا شما در حال تایپ توی برنامه NotePad هستید.) اون کلید چندین بار دیگه توسط برنامه من زده میشد, واقعا دل خراشه که در هنگام ران بودن برنامه نشه تایپ کرد.:اشتباه:

2.برای گرفتن KeyCode کلید مورد نظر من کد اسکی کلید رو به یک Sub میفرستادم که اون Sub اول برنامه رو Active میکرد بعد هم رو یداد KeyDown فعال میشد که این کار باعث میشد KeyCode کلید رو بدست بیارم وتصمیم بگیرم که چه عملیاتی انجام بشه.این کار بر پسند نیست چون کاربر درحال تایپ هست و یک دفعه متوجه میشه فکوس از برنامه مورد نظرش گرفته شده و به برنامه من داده شده.:اشتباه:

و ...

خواستم از Hook استفاده کنم اما بیشتر کد ها در این زمینه ناقص هستن و کار نمیکنند پس قید Hook رو زدم.(اگر کدی دارید که به زبان #C یا VB.Net هست و از کار کردش مطمئنید خوش حال میشم که کمکم کنید.)

حالا هر کسی میتونه به من کمک کنه بســــــم الله.:تشویق:

پاورقی :
برنامه ای که مینویسم هیچ ربطی به KeyLoger و ... نداره و فقط از کاربر برای انجام چندین کار مختلف از تعدادی کلید میانبر استفاده میکنه که ممکنه (حتما) برنامه من توی اون زمان فکوس رو در اختیار نداشته باشه پس خواهش میکنم بحث های انحرافی رو پیش نکشید با تشکر(هم چنین از مدیریت محتم سایت هم درخواست دارم که تایپیک رو حذف نکنن میدونم قبلا در حول ابن موضوع بارها و بارها بحث شده حتی تو سایت هایت دیگه اما من تقریبا 60% این مطالب رو خوندم اما هیچ کدام نیاز مرا پاسخ گو نبوده.).:لبخندساده:

ali_najari
یک شنبه 28 آذر 1389, 02:08 صبح
دوست عزيز براي اينكه مشخص كنيد كه كليد هاي تركيبي فشرده شده چي هست از روش زير بايد استفاده كنيد:


Select Case e.Modifiers
Case Keys.Shift
Select Case e.KeyCode
Case Keys.M
MsgBox("Shift + M")
Case Keys.L
MsgBox("Shift + L")
End Select
Case Keys.Control
Select Case e.KeyCode
Case Keys.M
MsgBox("Ctrl + M")
Case Keys.L
MsgBox("Ctrl + L")
End Select
Case Keys.Alt
Select Case e.KeyCode
Case Keys.M
MsgBox("Alt + M")
Case Keys.L
MsgBox("Alt + L")
End Select
Case Keys.U
Select Case e.KeyCode
Case Keys.T
MsgBox("U + T")
Case Keys.A
MsgBox("U + L")
End Select
End Select

ويا از روش زير:


If e.KeyCode = Keys.M AndAlso e.Modifiers = Keys.Control Then
MsgBox("Ctrl + M")
ElseIf e.KeyCode = Keys.M AndAlso e.Modifiers = Keys.Shift Then
MsgBox("Shift + M")
ElseIf e.KeyCode = Keys.M AndAlso e.Modifiers = Keys.A Then
MsgBox("A + M")
End If

Saman_12
یک شنبه 28 آذر 1389, 14:18 عصر
دوست عزيز براي اينكه مشخص كنيد كه كليد هاي تركيبي فشرده شده چي هست از روش زير بايد استفاده كنيد:


Select Case e.Modifiers
Case Keys.Shift
Select Case e.KeyCode
Case Keys.M
MsgBox("Shift + M")
Case Keys.L
MsgBox("Shift + L")
End Select
Case Keys.Control
Select Case e.KeyCode
Case Keys.M
MsgBox("Ctrl + M")
Case Keys.L
MsgBox("Ctrl + L")
End Select
Case Keys.Alt
Select Case e.KeyCode
Case Keys.M
MsgBox("Alt + M")
Case Keys.L
MsgBox("Alt + L")
End Select
Case Keys.U
Select Case e.KeyCode
Case Keys.T
MsgBox("U + T")
Case Keys.A
MsgBox("U + L")
End Select
End Select

ويا از روش زير:


If e.KeyCode = Keys.M AndAlso e.Modifiers = Keys.Control Then
MsgBox("Ctrl + M")
ElseIf e.KeyCode = Keys.M AndAlso e.Modifiers = Keys.Shift Then
MsgBox("Shift + M")
ElseIf e.KeyCode = Keys.M AndAlso e.Modifiers = Keys.A Then
MsgBox("A + M")
End If
دوست عزیز از اینکه جواب دادین خیلی ممنون اما به نظر میاد مشکل رو متوجه نشدید!:لبخند:
مهم اینه که من بتونم وقتی که برنامه ام فکوس رو در اختیار نداره کلید های زده شده رو تشخیص بدم که اون کلید ها ممکنه ترکیبی باشند من توی تشخیص کلید ترکیبی توی خود برنامه مشکلی ندارم . . .
به هر حالا ممنون که توجه کردید.

meysam_meysam74
یک شنبه 28 آذر 1389, 20:17 عصر
سلام عزیز خوبید
خوب یه نکته هست که شما بهش دقت نمیکنید
شما میخواین keyloger بنویسید
تویه کی لوگر هم باید از همون تابع استفاده کنید و اون تابع api تابع خیلی خوب و کاملی هست مو لایه درزش نمیره شما سرسی رو که دانلود کردید ناقص بوده با اون تابع میشه دقیقا همه کلید های فشار داده شده و کلید های ترکیبی و دقیقا سرعت کلید فشار داده شده و از همه مهم تر تعداد کلید های فشار داده شده رو بدست بیارین من خودم قبلا یه کی لوگر نوشتم چون انتی ویروس خودم node32 بود و تویه سیستم خودم کامپایل شده بود به شکلی نوشتم که گیر نمیداد ولی حدودا 18 تا انتی ویروس دیگه بودن که گیر میدادن شما یه ذره همون تابع رو بالا پایین کنید همه چی ازش در میاد یه نکته ریز توشه که من الان حذور ذهن ندارم یادم نمیاد ولی همه مشکل های شما رو منم داشتم و با فهمیدن اون نکته ریز همه حل شد حالا ارچیو سرس هامو نگاه میکنم پیدا کردم براتون میزارم

meysam_meysam74
یک شنبه 28 آذر 1389, 20:23 عصر
مشکل 1 شما با این کد حل میشه
مشکل 2 شما هم من نداشتم تویه برنامه ای که نوشتم اشکال از یه جایه دیگه هست نه از این تابع


Dim Tstr As String
Dim i As Long
Dim results As Long
Dim prevLng As Long
For i = 2 To 34568
results = 0
results = GetAsyncKeyState(i)
If results <> 0 Then
List1.AddItem results & " " & i
List1.ListIndex = List1.ListCount - 1
Tstr = Chr(i)
Select Case i
Case 32
Tstr = "(SPA)"
Case 16
Tstr = "" '"(SH)"
Case 9
Tstr = "(TAB)"
Case 20
Tstr = "" '"(CAP)"
Case 18
Tstr = "" '"(ALT)"
Case 17
Tstr = "" '"(CTR)"
Case 13
Tstr = "(ENTER)"
Case 8
Tstr = "(BACKSPAC)"
End Select
If prevLng = 16 And i <> 161 And i <> 160 Then Tstr = "(-SH-" & Tstr
If prevLng = 17 And i <> 162 And i <> 163 Then Tstr = "(-CTR-" & Tstr & ")"
If prevLng = 18 And i <> 164 And i <> 165 Then Tstr = "(-Alt-" & Tstr & ")"
If i = 36 And Tstr <> "(-SH-$" Then Tstr = "(HOME)"
If Tstr = "(-SH-$" Then Tstr = "(SHIFT+HOME)"
If i = 35 And Tstr <> "(-SH-#" Then Tstr = "(END)"
If Tstr = "(-SH-#" Then Tstr = "(SHIFT+END)"
If i = 220 Then Tstr = "\"
If i = 191 Then Tstr = "/"
prevLng = i
If results = -32767 Then
Text1.Text = Text1.Text & Tstr
End If
End If
Step1:
Next i
اگه مشکل 2 شما حل نشد سرس برنامه رو بزارید و یه پیام به من بدید به تایپ سر میزنم

فقط یادم رفت که بگم این خیلی مهمه

If results = -32767 Then
Text1.Text = Text1.Text & Tstr
End If

Saman_12
یک شنبه 28 آذر 1389, 21:46 عصر
دوستان عزیز از هر دو تون متشکرم!

Select Case های تو در توی Ali جون و کد VB6 ی که جناب meysam_meysam74 گذاشتند باعث شد در ذهنم یک جرقه زده شه!
با چند خط کد کوتاه به راحتی میشه کلید های ترکیبی و یا تکی رو توی برنامه مشخص کرد که در این روش ملزم به استفاده از API ی GetAsyncKeyState هستیم.(به قول دوستمون یک نکته کوچیک بود که با تمام کوچکیش کار بزرگی انجام میده.):لبخند:

کد برای استفاده دیگر دوستان در همین پست قرار میدم(این تیکه رو میتونید توی یک ماژول تعریف کنید.) :


Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Integer) As Short

Public OldKey As New Keys
Public Function GetKeySelf() As Keys

For i As Integer = 32 To 255

If GetAsyncKeyState(i) <> 0 And Not OldKey = i Then _
OldKey = i : Return OldKey
Next
End Function


حالا کافیه یک تایمر روی فرم انداخت با اینتروال 1 و این کد رو برای تشخیص کلید ترکیبی استفاده کرد :



If ModGetKey.GetKeySelf.ToString <> "None" Then

If ModGetKey.OldKey = Keys.LMenu Then

If ModGetKey.GetKeySelf.ToString <> "None" Then

If ModGetKey.OldKey = Keys.A Then Me.Text = "Prees Alt + A"

End If
End If
End If


کد بالا کلید Alt سمت چپ + A رو تشخیص میده.
باز هم از شما دوستان ممنونم.

پاورقی :
بازم میگم که Keyloger نمیخوام بنویسم این برنامه کارش محافظت از پنجره های انتخوابی کار بر هست و برای سهولت کار بهتر دیدم چندین میانبر برای انجام کار ها در نظر بگیرم.