الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]Keyboard Hook

بدأه aderfiad في 21 نوفمبر 2009 · 24 رد · 2,379 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

سؤال بسيط شباب

كيف يمكنني عمل هوك على الكايبورد ؟

متلا عند الضغط على R وبرنامجي مفتوح يقوم بنتفيد عمل ما

شكرا لكم

#2

وعليكــم السـلام ورحمة الله وبركاتـه..

هذا مثال

 

[color= #0000ff;].[color= #7f7f7f;]386

[color= #7f00ff;].model [color= #aa007f;]flat[color= #0000ff;],[color= #aa007f;]stdcall

[color= #7f00ff;]option [color= #aa007f;]casemap[color= #0000ff;]:[color= #aa007f;]none

 

[color= #7f00ff;]include windows[color= #0000ff;].[color= #ff007f;]inc

[color= #7f00ff;]include kernel32[color= #0000ff;].[color= #ff007f;]inc

[color= #7f00ff;]include user32[color= #0000ff;].[color= #ff007f;]inc

[color= #7f00ff;]includelib kernel32[color= #0000ff;].lib

[color= #7f00ff;]includelib user32[color= #0000ff;].lib

 

XACKER				[color= #7f00ff;]proto	[color= #0000ff;]:[color= #aa007f;]DWORD[color= #0000ff;],:[color= #aa007f;]DWORD[color= #0000ff;],:[color= #aa007f;]DWORD

TranslateKeyCode	[color= #7f00ff;]proto	[color= #0000ff;]:[color= #aa007f;]DWORD[color= #0000ff;],:[color= #aa007f;]DWORD[color= #0000ff;],:[color= #aa007f;]DWORD

 

      literal [color= #7f00ff;]MACRO quoted_text[color= #0000ff;]:[color= #aa007f;]VARARG

        [color= #7f00ff;]LOCAL local_text

        [color= #0000ff;].[color= #7f00ff;]data

          local_text [color= #7f00ff;]db quoted_text[color= #0000ff;],[color= #7f7f7f;]0

        [color= #7f00ff;]align [color= #7f7f7f;]4

        [color= #0000ff;].[color= #7f00ff;]code

        [color= #7f00ff;]EXITM <local_text>

      [color= #7f00ff;]ENDM

 

      CTXT [color= #7f00ff;]MACRO quoted_text[color= #0000ff;]:[color= #aa007f;]VARARG

        [color= #7f00ff;]EXITM <[color= #7f00ff;]offset literal[color= #0000a0; font-weight: bold;](quoted_text[color= #0000a0; font-weight: bold;])>

      [color= #7f00ff;]ENDM

 

[color= #0000ff;].[color= #7f00ff;]data

msg			MSG <>

 

[color= #0000ff;].[color= #7f00ff;]data?

hMod		[color= #7f00ff;]dd	?

hook		[color= #7f00ff;]dd	?

 

[color= #0000ff;].[color= #7f00ff;]code

start[color= #0000ff;]:

[color= #0000ff; font-weight: bold;]invoke	GetModuleHandle[color= #0000ff;],NULL

[color= #ff007f;]mov		hMod[color= #0000ff;],[color= #7f7f40;]eax

[color= #007f00; font-style: italic;]; check for another instance

[color= #0000ff; font-weight: bold;]invoke	CreateMutex[color= #0000ff;],NULL[color= #0000ff;],NULL[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"XACKER"[color= #0000a0; font-weight: bold;])

[color= #0000ff; font-weight: bold;]invoke	GetLastError

[color= #0000ff; font-weight: bold;].if	[color= #0000a0; font-weight: bold;]([color= #7f7f40;]eax == ERROR_ALREADY_EXISTS[color= #0000a0; font-weight: bold;])

	[color= #ff007f;]jmp	terminate

[color= #0000ff; font-weight: bold;].endif

[color= #007f00; font-style: italic;]; register hot key for termination

[color= #0000ff; font-weight: bold;]invoke	RegisterHotKey[color= #0000ff;],NULL[color= #0000ff;],[color= #ff0000;]01234567h[color= #0000ff;],MOD_CONTROL [color= #ff007f;]or MOD_ALT[color= #0000ff;],VK_T	[color= #007f00; font-style: italic;]; CTRL+ALT+T to force terminat
e

[color= #007f00; font-style: italic;]; hook low level keyboard driver

[color= #0000ff; font-weight: bold;]invoke	SetWindowsHookEx[color= #0000ff;],WH_KEYBOARD_LL[color= #0000ff;],[color= #aa007f;]addr XACKER[color= #0000ff;],hMod[color= #0000ff;],NULL

[color= #ff007f;]mov		hook[color= #0000ff;],[color= #7f7f40;]eax

[color= #007f00; font-style: italic;]; wait for hot key

[color= #0000ff; font-weight: bold;]invoke	GetMessage[color= #0000ff;],[color= #aa007f;]addr msg[color= #0000ff;],NULL[color= #0000ff;],NULL[color= #0000ff;],NULL

[color= #007f00; font-style: italic;]; unhook the keyboard

[color= #0000ff; font-weight: bold;]invoke	UnhookWindowsHookEx[color= #0000ff;],hook

[color= #007f00; font-style: italic;]; unregister hot key

[color= #0000ff; font-weight: bold;]invoke	UnregisterHotKey[color= #0000ff;],NULL[color= #0000ff;],[color= #ff0000;]01234567h

terminate[color= #0000ff;]:

[color= #0000ff; font-weight: bold;]invoke	ExitProcess[color= #0000ff;],NULL

 

XACKER	[color= #7f00ff;]proc	nCode[color= #0000ff;]:[color= #aa007f;]DWORD[color= #0000ff;],wParam[color= #0000ff;]:[color= #aa007f;]DWORD[color= #0000ff;],lParam[color= #0000ff;]:[color= #aa007f;]DWORD

 

    [color= #007f00; font-style: italic;]; pass

    [color= #0000ff; font-weight: bold;].if [color= #0000a0; font-weight: bold;](nCode == HC_ACTION[color= #0000a0; font-weight: bold;])

		[color= #007f00; font-style: italic;]; ignore system keyup and keyup events (only handle keydown)

		[color= #0000ff; font-weight: bold;].if [color= #0000a0; font-weight: bold;](wParam == WM_KEYUP || wParam == WM_SYSKEYUP[color= #0000a0; font-weight: bold;])

			[color= #ff007f;]jmp	next_key

		[color= #0000ff; font-weight: bold;].endif

 

		[color= #0000ff; font-weight: bold;]invoke	TranslateKeyCode[color= #0000ff;],nCode[color= #0000ff;],wParam[color= #0000ff;],lParam

next_key[color= #0000ff;]:

		[color= #0000ff; font-weight: bold;]invoke	CallNextHookEx[color= #0000ff;],hook[color= #0000ff;],nCode[color= #0000ff;],wParam[color= #0000ff;],lParam

	[color= #0000ff; font-weight: bold;].else

		[color= #ff007f;]jmp		next_key

	[color= #0000ff; font-weight: bold;].endif

	[color= #ff007f;]ret

XACKER [color= #7f00ff;]endp

 

TranslateKeyCode	[color= #7f00ff;]proc	nCode[color= #0000ff;]:[color= #aa007f;]DWORD[color= #0000ff;],wParam[color= #0000ff;]:[color= #aa007f;]DWORD[color= #0000ff;],lParam[color= #0000ff;]:[color= #aa007f;]DWORD

	[color= #7f00ff;]LOCAL	lpKeyState[color= #0000a0; font-weight: bold;][[color= #7f7f7f;]256[color= #7f7f7f;]+1[color= #0000a0; font-weight: bold;]]	[color= #0000ff;]:[color= #aa007f;]BYTE

	[color= #7f00ff;]LOCAL	lpCharBuf[color= #0000a0; font-weight: bold;][[color= #7f7f7f;]32[color= #7f7f7f;]+1[color= #0000a0; font-weight: bold;]]		[color= #0000ff;]:[color= #aa007f;]BYTE

	[color= #7f00ff;]LOCAL	lpOut[color= #0000a0; font-weight: bold;][[color= #7f7f7f;]5[color= #0000a0; font-weight: bold;]]			[color= #0000ff;]:[color= #aa007f;]BYTE

 

	[color= #ff007f;]mov		[color= #7f7f40;]esi[color= #0000ff;],lParam

	[color= #0000ff; font-weight: bold;].if	[color= #0000a0; font-weight: bold;]([color= #aa007f;]dword [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][[color= #7f7f40;]esi[color= #0000a0; font-weight: bold;]] == VK_LCONTROL || [color= #aa007f;]dword [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][[color= #7f7f40;]esi[color= #0000a0; font-weight: bold;]] == VK_RCONTROL || [color= #aa007f;]dword [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][[color= #7f7f40;]esi[color= #0000a0; font-weight: bold;]] == VK
_ESCAPE || [color= #aa007f;]dword [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][[color= #7f7f40;]esi[color= #0000a0; font-weight: bold;]] == VK_TAB || [color= #aa007f;]dword [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][[color= #7f7f40;]esi[color= #0000a0; font-weight: bold;]] == VK_DELETE || [color= #aa007f;]dword [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][[color= #7f7f40;]esi[color= #0000a0; font-weight: bold;]] == VK_B
ACK[color= #0000a0; font-weight: bold;])

		[color= #ff007f;]jmp	next_hook

	[color= #0000ff; font-weight: bold;].endif

 

	[color= #0000ff; font-weight: bold;]invoke	RtlZeroMemory[color= #0000ff;],[color= #aa007f;]addr lpKeyState[color= #0000ff;],[color= #7f7f7f;]256[color= #7f7f7f;]+1

	[color= #007f00; font-style: italic;]; get map of keys

	[color= #0000ff; font-weight: bold;]invoke	GetKeyboardState[color= #0000ff;],[color= #aa007f;]addr lpKeyState

	[color= #007f00; font-style: italic;]; check status of SHIFT key

	[color= #0000ff; font-weight: bold;]invoke	GetKeyState[color= #0000ff;],VK_LSHIFT

	[color= #ff007f;]push	[color= #7f7f40;]eax

	[color= #ff007f;]pop		[color= #7f7f40;]esi		[color= #007f00; font-style: italic;]; save key state

	[color= #0000ff; font-weight: bold;]invoke	GetKeyState[color= #0000ff;],VK_RSHIFT

	[color= #ff007f;]or		[color= #7f7f40;]eax[color= #0000ff;],[color= #7f7f40;]esi	[color= #007f00; font-style: italic;]; OR states see if SHIFT is used

	[color= #ff007f;]mov		[color= #aa007f;]byte [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][lpKeyState[color= #7f7f7f;]+16[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #7f7f40;]al	[color= #007f00; font-style: italic;]; turn on/off upon states

	[color= #007f00; font-style: italic;]; check status of CAPITAL key

	[color= #0000ff; font-weight: bold;]invoke	GetKeyState[color= #0000ff;],VK_CAPITAL

	[color= #ff007f;]mov		[color= #aa007f;]byte [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][lpKeyState[color= #7f7f7f;]+20[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #7f7f40;]al	[color= #007f00; font-style: italic;]; turn on/off upon state

	[color= #007f00; font-style: italic;];

	[color= #0000ff; font-weight: bold;]invoke	RtlZeroMemory[color= #0000ff;],[color= #aa007f;]addr lpCharBuf[color= #0000ff;],[color= #7f7f7f;]32[color= #7f7f7f;]+1

	[color= #007f00; font-style: italic;]; translate key from vkey

	[color= #ff007f;]mov		[color= #7f7f40;]esi[color= #0000ff;],lParam

	[color= #ff007f;]lodsd

	[color= #ff007f;]push	[color= #7f7f40;]eax

	[color= #ff007f;]pop		[color= #7f7f40;]ecx		[color= #007f00; font-style: italic;]; ecx = Key

	[color= #ff007f;]lodsd

	[color= #ff007f;]push	[color= #7f7f40;]eax

	[color= #ff007f;]pop		[color= #7f7f40;]ebx		[color= #007f00; font-style: italic;]; ebx = ScanCode

	[color= #0000ff; font-weight: bold;]invoke	ToAsciiEx[color= #0000ff;],[color= #7f7f40;]ecx[color= #0000ff;],[color= #7f7f40;]ebx[color= #0000ff;],[color= #aa007f;]addr lpKeyState[color= #0000ff;],[color= #aa007f;]addr lpCharBuf[color= #0000ff;],NULL[color= #0000ff;],NULL

	[color= #007f00; font-style: italic;];

	[color= #ff007f;]lea		[color= #7f7f40;]esi[color= #0000ff;],lpCharBuf

	[color= #0000ff; font-weight: bold;]invoke	wsprintf[color= #0000ff;],[color= #aa007f;]addr lpOut[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"%s"[color= #0000a0; font-weight: bold;])[color= #0000ff;],[color= #7f7f40;]esi

	[color= #0000ff; font-weight: bold;].if [color= #0000a0; font-weight: bold;]([color= #aa007f;]byte [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][lpOut[color= #0000a0; font-weight: bold;]] == [color= #0000a0;]"R"[color= #0000a0; font-weight: bold;])

		[color= #0000ff; font-weight: bold;]invoke	MessageBox[color= #0000ff;],NULL[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"ACTION!"[color= #0000a0; font-weight: bold;])[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"Xacker"[color= #0000a0; font-weight: bold;])[color= #0000ff;],MB_OK

	[color= #0000ff; font-weight: bold;].endif

 

next_hook[color= #0000ff;]:

	[color= #ff007f;]ret

TranslateKeyCode [color= #7f00ff;]endp

[color= #7f00ff;]end start

* known bugs:

- المفترض أن يمرر كل حرف إلى باقي عناصر الـ hook chain لكنه عند إظهار الرسالة من أجل الحرف R، لا يفعل، لماذا؟ لم أنظر كثيراً في السبب.. ابحث أنت :wink:

- تذكرت الآن، الـ hot key الخاص بإغلاقه مسجل لـ CTRL+ALT+T لكني لم أفلتر ALT بشكل صحيح، لذلك لن تعمل هذه المجموعة في إغلاق البرنامج وستضطر إلى إغلاقه من الـ task manager إلى حين أن تقوم بإصلاحه :wink:

بالتوفيق.

تم تعديل هذه المشاركة بواسطة Xacker في 22 نوفمبر 2009 في 03:56 — السبب: 0DEADBEEFh != 01234567h

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

بارك الله فيك اخي

فقط هناك بعض الامور غير واضحة لو امكن شرحها

--------------------------------------------------------------------------------------------------------------

لمدا هدا السطر بما اننا نريد فقط R ومادا يعني البارامتر 01234567h

invoke RegisterHotKey,NULL,01234567h,MOD_CONTROL or MOD_ALT,VK_T

--------------------------------------------------------------------------------------------------------------

لم افهم جيدا هده الدالة GetKeyState

---------------------------------------------------------------------------------------------------------------

بالنسبة للاكواد الاخرى فهي مفهومة

***********************************************

- المفترض أن يمرر كل حرف إلى باقي عناصر الـ hook chain لكنه عند إظهار الرسالة من أجل الحرف R، لا يفعل، لماذا؟ لم أنظر كثيراً في السبب.. ابحث أنت

****

الضاهر من الكود انه بعد الترجمة والتحويل ستتم المقارنة مع R ان كان هناك توافق ستضهر الرسالة

لم اجرب بعد الكود حتى افهمه جيدا

#4
aderfiad كتب:
لمدا هدا السطر بما اننا نريد فقط R ومادا يعني البارامتر 01234567h

invoke RegisterHotKey,NULL,01234567h,MOD_CONTROL or MOD_ALT,VK_T

هذه الدالة تستخدمها في حال لم يكن للبرنامج الخاص بك نافذة مرئية (حالة Keyloggers)، بالتالي كيف ستقوم بإغلاقه؟ لتتجنب استخدام Task manager ولحالات قد يكون البرنامج يخفي نفسه أيضاً من قائمة المهام، تحتاج لوسيلة تمكنك من إغلاق البرنامج في الذاكرة، وهي بتسجيل system-wide key عندما يتم التقاطه يرسل إلى البرنامج الذي قام بتسجيله وعليه يتصرف البرنامج بشكل ما، في مثالنا هذا، يقوم بإنهاء البرنامج بمجرد نقر مجموعة المفاتيح هذه.

أمثلة أخرى: CTRL+ALT+DEL تفتح لك قائمة المهام، F1 تفتح لك المساعدة الخاصة بويندوز.

أما بالنسبة لـ 01234567h، فكل hot key يجب أن يملك identifier يميزه عن غيره من المفاتيح المسجلة، والأفضل أن يكون unique حتى لا تقع في مسائل برمجية أخرى.

طبعاً إن أردت استخدام RegisterHotKey أساساً.

اقتباس
لم افهم جيدا هده الدالة GetKeyState

تفحص حالة مفتاح، up / down / toggled

وكما ترى أنا أفحص حالة المفاتيح Left Shift و Right Shift لأعرف إن كان أحدها مضغوطاً أي أن الحرف المدخل معه SHIFT للحصول على حرف كبير أم لا. حتى Caps Lock أقوم بفحصها من خلال VK_CAPITAL لنفس الغرض.

بالمناسبة ما معنى Clavier الموجودة في عنوان الموضوع؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

ما معنى Clavier الموجودة في عنوان الموضوع؟

--------------

Clavier بالفرنسية و تعني الكايبورد (:

---

بالمناسبة اول مرة ارى هدا التعريف للمتغير

lpKeyState[256+1] :BYTE

lpCharBuf[32+1] :BYTE

هل هو جدول ؟ ممكن توضيح بسيط

ايضا هده مرة وضعت 16 ومرة 20 لم افهم هده العملية

mov byte ptr [lpKeyState+16],al

الا يمكن تعريف متغير بحجم 1 بايت ونقل محتوى al اليه مباشرة ؟

#6

سأقوم بتغيير Clavier إلى Keyboard ليكون مفهوم للعموم.

بخصوص تعريف المتغيرات التي سألت عنها فهي متغيرات محلية يتم حجزها واستخدامها في المكدس مباشرة وينتهي عمرها بالخروج من الإجرائية.

وسؤالك هل هو جدول، نعم، يمكنك قول هذا، lpKeyState تحدد الحالة الخاصة بكل حرف من حروف الكيبورد (والمحارف الخاصة) وعددها 256 يعني جدول ASCII و Extended ASCII

استخدامها بالشكل [lpKeyState+16] أو مع 20، المقصود بها الإزاحة 16 (بالأحرى 17 على اعتبار lpKeyState تملك الإزاحة 0) حيث يكون لكل virtual key مكان خاص به ضمن هذا الجدول (أو الخريطة).

lpCharBuf أعتقد يمكن أن تكون أصغر من هذا (بالحجم) -- للتوضيح الكود السابق اقتطعته مع بعض التعديل من كود لمشروع قديم (شخصي) كنت أقوم بكتابته ولا أذكر هل الحجم الخاص بـ lpCharBuf مهم حتى اخترته 32 أم لا وهو خطأ مني.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7

بارك الله فيك اخي

لي عودة بعد التجريب ^^

#8

قمت بتجربة هكدا :

.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib



DlgProc		 PROTO :HWND,:UINT,:WPARAM,:LPARAM

XACKER	proto :DWORD,:DWORD,:DWORD

TranslateKeyCode proto :DWORD,:DWORD,:DWORD
 literal MACRO quoted_text:VARARG
  LOCAL local_text
   .data
	 local_text db quoted_text,0
   align 4
	.code
	 EXITM <local_text>
   ENDM

	CTXT MACRO quoted_text:VARARG
	EXITM <offset literal(quoted_text)>
	ENDM



.data?
msg   MSG <>
hInstance HINSTANCE ?
hook dd ?
hMod dd ?


.data

.code
start:

	   invoke InitCommonControls

	   invoke GetModuleHandle,NULL
	   mov hInstance,eax

	   invoke DialogBoxParam,hInstance,1001,NULL,addr DlgProc,NULL 
	   invoke ExitProcess,eax 


DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM 

			   mov  eax,uMsg

 .if eax==WM_INITDIALOG

  invoke SetTimer,hWnd,0,1,0

	 .elseif uMsg == WM_TIMER

 invoke CreateMutex,NULL,NULL,CTXT("XACKER")
				   invoke GetLastError
				   .if (eax == ERROR_ALREADY_EXISTS)
				   jmp terminate
					.endif
				   invoke RegisterHotKey,NULL,01234567h,MOD_CONTROL or MOD_ALT,VK_T
					invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr XACKER,hMod,NULL
					 mov  hook,eax
					  invoke GetMessage,addr msg,NULL,NULL,NULL
						invoke UnhookWindowsHookEx,hook
						invoke UnregisterHotKey,NULL,0DEADBEEFh
				 terminate:




 .elseif eax==WM_COMMAND

 .elseif eax==WM_CLOSE

 invoke EndDialog,hWnd,0

 .endif
 xor eax,eax
 ret

DlgProc endp



XACKER proc nCode:DWORD,wParam:DWORD,lParam:DWORD
 .if (nCode == HC_ACTION)
 .if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP)
 jmp next_key
 .endif
 invoke TranslateKeyCode,nCode,wParam,lParam
next_key:
invoke CallNextHookEx,hook,nCode,wParam,lParam
.else
 jmp  next_key
 .endif
 ret
XACKER endp 



TranslateKeyCode proc nCode:DWORD,wParam:DWORD,lParam:DWORD
LOCAL lpKeyState[256+1] :BYTE
LOCAL lpCharBuf[32+1]  :BYTE
LOCAL lpOut[5]   :BYTE
mov  esi,lParam
.if (dword ptr [esi] == VK_LCONTROL || dword ptr [esi] == VK_RCONTROL || dword ptr [esi] == VK_ESCAPE || dword ptr [esi] == VK_TAB || dword ptr [esi] == VK_DELETE || dword ptr [esi] == VK_BACK)


jmp next_hook
.endif
invoke RtlZeroMemory,addr lpKeyState,256+1
invoke GetKeyboardState,addr lpKeyState
push eax
pop  es
invoke GetKeyState,VK_RSHIFT
or  eax,esi
mov  byte ptr [lpKeyState+16],al
invoke GetKeyState,VK_CAPITAL
mov  byte ptr [lpKeyState+20],al
invoke RtlZeroMemory,addr lpCharBuf,32+1
mov  esi,lParam
lodsd
push eax
pop  ebx
invoke ToAsciiEx,ecx,ebx,addr lpKeyState,addr lpCharBuf,NULL,NULL
lea  esi,lpCharBuf
invoke wsprintf,addr lpOut,CTXT("%s"),esi
.if (byte ptr [lpOut] == "A")
	 invoke MessageBox,NULL,CTXT("ACTION!"),CTXT("Xacker"),MB_OK
.endif
next_hook:
ret
TranslateKeyCode endp 

end start

ينفد دون اخطاء لكن عند الضغط على R لا تضهر الرسالة

تم تعديل هذه المشاركة بواسطة aderfiad في 21 نوفمبر 2009 في 22:03

#9

Maybe

Only maybe

because you wrote this:

 

[color= #0000ff; font-weight: bold;].if [color= #0000a0; font-weight: bold;]([color= #aa007f;]byte [color= #7f00ff;]ptr [color= #0000a0; font-weight: bold;][lpOut[color= #0000a0; font-weight: bold;]] == [color= #0000a0;]"A"[color= #0000a0; font-weight: bold;])

     [color= #0000ff; font-weight: bold;]invoke MessageBox[color= #0000ff;],NULL[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"ACTION!"[color= #0000a0; font-weight: bold;])[color= #0000ff;],CTXT[color= #0000a0; font-weight: bold;]([color= #0000a0;]"Xacker"[color= #0000a0; font-weight: bold;])[color= #0000ff;],MB_OK

[color= #0000ff; font-weight: bold;].endif

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#10

اعتدر كنت اود قول A وليس R

رغم الضغط A لا ينفد كود الرسالة

هدا السروس في المرفقات

Clavier_hook.rar

تم تعديل هذه المشاركة بواسطة aderfiad في 21 نوفمبر 2009 في 23:27

#11

أول خطأ صريح

                    [color= #0000ff; font-weight: bold;]invoke SetWindowsHookEx[color= #0000ff;],WH_KEYBOARD_LL[color= #0000ff;],[color= #aa007f;]addr XACKER[color= #0000ff;],hMod[color= #0000ff;],NULL

إما أن تستبدل hMod بـ hInstance التي تستخدمها في بداية البرنامج.. أو تستبدل hInstance بـ hMod في بداية البرنامج أيهما تفضل :)

تم تعديل هذه المشاركة بواسطة Xacker في 22 نوفمبر 2009 في 01:28

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#12

اه نعم خطأ واضح

غيرتها الى hInstance

ولم تضهر الرسالة حتى الان :(

تم تعديل هذه المشاركة بواسطة aderfiad في 22 نوفمبر 2009 في 01:44

#13

أرفق لي الملف التنفيذي بعد التعديل، أستخدم RadASM وصراحة لا رغبة عندي بإضافة مشروع جديد و dialog الخ الخ..

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#14

هدا السورس كاملا بعد التعديل , معه الملف التنفيدي

انا استخدم winasm

Clavier_hook.rar

#15

حسناً أخطاؤك الأخرى ليست بهذه الوضوح لكنها أخطاء، إملائية..

فقد أنقصت بعض التعليمات في الكود الذي نقلته!

لديك على سبيل المثال

mov  esi,lParam
lodsd
push eax
pop ecx; ecx = Key
lodsd
push eax
pop  ebx

انظر في شفرتك سترى ما أنقصت.

ولديك

invoke	GetKeyState,VK_LSHIFT

أيضاً ناقصة..

أيضاً، وهذا الجزء الأهم والذي لم يخطر في بالي سبب له الآن، هو أن الكود الخاص بتثبيت hook على الكيبورد لا يعمل داخل DlgProc

أجري التصحيحات التي أخبرتك بها ثم اجعله كالتالي مثلاً

	   invoke GetModuleHandle,NULL
	   mov hInstance,eax

		invoke CreateMutex,NULL,NULL,CTXT("XACKER")
		invoke GetLastError
		.if (eax == ERROR_ALREADY_EXISTS)
	   		jmp ter
		.endif
		invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr XACKER,hInstance,NULL
		mov  hook,eax
		invoke GetMessage,addr msg,NULL,NULL,NULL
		invoke UnhookWindowsHookEx,hook

	   invoke DialogBoxParam,hInstance,1001,NULL,addr DlgProc,NULL
	   ter:
	   invoke ExitProcess,eax

وسيعمل إن شاء الله

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#16

صححت الاخطاء

ووضعت الكود كما قلت اخي ولم يشتغل

وضعت كود تتبيت الهوك في الاول هكدا

.code
start:



	   invoke GetModuleHandle,NULL
	   mov hInstance,eax
	   mov edi,eax

	   invoke DialogBoxParam,hInstance,1001,NULL,addr DlgProc,NULL 


	   invoke CreateMutex,NULL,NULL,CTXT("XACKER")
				   invoke GetLastError
				   .if (eax == ERROR_ALREADY_EXISTS)
				   jmp terminate
					.endif
				   invoke RegisterHotKey,NULL,01234567h,MOD_CONTROL or MOD_ALT,VK_T
					invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr XACKER,hInstance,NULL
					 mov  hook,eax
					  invoke GetMessage,addr msg,NULL,NULL,NULL
						invoke UnhookWindowsHookEx,hook
						invoke UnregisterHotKey,NULL,0DEADBEEFh
				 terminate:
	   invoke ExitProcess,edi

عند وضع الكود هكدا لم يعد يغلق Process البرنامج عند اغلاقه حاولت معه دون جدوى

ايضا حتى لو نجحت هده الطريقة فاضن انها ستستعمل مرة واحدة فقط

لهدا وضعت الكود في Timer كي تبقى الدوامة تدور وتستجيب في اي وقت :lol:

الا يوجد حل للقيام بهدا الامر ؟ :(

#17

سأقتبس هذا الرد القديم لي والذي كتبته أساساً لك

اقتباس
ولو لاحظت فأنت تقوم بإنشاء Modal Window من خلال استدعاء DialogBoxParam، هذه النوافذ توقف -إن جاز التعبير- من سير باقي البرنامج حتى يتم التعامل معها وإنهاءها، أي أن التنفيذ في النافذة الرئيسية يتوقف إلى أن يتم إغلاق النافذة الابن.

هل تستطيع أن تحدد أين الخطأ لديك الآن؟

aderfiad كتب:
ايضا حتى لو نجحت هده الطريقة فاضن انها ستستعمل مرة واحدة فقط

لهدا وضعت الكود في Timer كي تبقى الدوامة تدور وتستجيب في اي وقت :lol:

بمجرد تثبيت الـ hook فلا حاجة لإعادة تثبيته مرة بعد مرة بعد مرة.. يكفي مرة واحدة!

ثم إن WM_INITDIALOG لا تنفذ إلا مرة واحدة بالتالي SetTimer تستخدم أيضاً مرة واحدة.

تم تعديل هذه المشاركة بواسطة Xacker في 22 نوفمبر 2009 في 14:25

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#18

الخطأ اضنه اني وضعت كود الهوك بعد الدالة DialogBoxParam

لقد وضعته قبلها كما وضعته انت في مشاركتك ولم يشتغل البرنامج في هده الحالة

يشتغل بروسيس البرنامج لكن النافدة لا تضهر

#19

نعم هذا هو الخطأ.

من ناحية أخرى ثبت الـ hook خارج الـ Dialog (قبله) ومن ثم (باعتبار وجود dialog يمكنك من إغلاق البرنامج)، تخلص من RegisterHotKey() وGetMessage() UnregisterHotKey() باعتبارها مرتبطة به ثم ضمّن UnhookWindowsHookEx() داخل الـ DlgProc في WM_CLOSE قبل EndDialog()

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#20

مثّال عما ذكرته منذ قليل

HookWithDialog.rar

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#21

شكرا لك اخي الكريم

ساجرب السورس ولي عودة

فقط لدي ملاحضة بسيطة عند الضغط على A وضهور الرسالة يتجمد الجهاز لمدة 5 تواني تقريبا

#22

لا يحدث هذا لدي.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#23

تم بنجاح اخي

ازلت الدوال RegisterHotKey وGetMessageو UnregisterHotKey

ووضعت دالة ازالت الهوك UnhookWindowsHookEx في خاصية الاغلاق WM_CLOSE واشتغل تمام فقط مشكل التجمد

مادا كان دور تلك الدوال التي ازلتها ؟

فكل الدوال فهمتها الا التلات دوال التي ازلتها الان وقد سئلت عنها في الاول لم افهم دورها في البرنامج

#24

RegisterHotKey شرحتها لك مسبقاً، افرض البرنامج بدون GUI، وأيضاً يخفي نفسه في task manager، يعني تقريباً ليس لديك أي طريقة لإغلاقه لأنك لا تستطيع الوصول للـ Process (لا تقل لي أستخدم Kernel Detective :P)

في هذه الحالة تستخدم RegisterHotKey لتربط البرنامج بحدث النقر على مجموعة أزرار تقوم باختيارها

GetMessage هي ما سيلتقط هذا الحدث ويسمح لبرنامجك بتنفيذ إجرائية ما بناء على تنشيط الحدث (النقر على الأزرار التي خصصتها لجعل البرنامج يغلق نفسه).

UnregisterHotKey بكل بساطة تلغي ارتباط هذا الحدث بالبرنامج، بحيث عندما يغلق البرنامج لا يبقى هناك ارتباط لحدث نقر مجموعة أزرار ببرنامج لم يعد موجود في الذاكرة.

كما تفعل مع UnhookWindowsHookEx، تلغي الـ hook قبل أن تغلق البرنامج.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#25

بارك الله فيك اخي الكريم :clapping:

مواضيع مشابهة