السلام عليكم
سؤال بسيط شباب
كيف يمكنني عمل هوك على الكايبورد ؟
متلا عند الضغط على R وبرنامجي مفتوح يقوم بنتفيد عمل ما
شكرا لكم
السلام عليكم
سؤال بسيط شباب
كيف يمكنني عمل هوك على الكايبورد ؟
متلا عند الضغط على R وبرنامجي مفتوح يقوم بنتفيد عمل ما
شكرا لكم
وعليكــم السـلام ورحمة الله وبركاتـه..
هذا مثال
[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
بارك الله فيك اخي
فقط هناك بعض الامور غير واضحة لو امكن شرحها
--------------------------------------------------------------------------------------------------------------
لمدا هدا السطر بما اننا نريد فقط R ومادا يعني البارامتر 01234567h
invoke RegisterHotKey,NULL,01234567h,MOD_CONTROL or MOD_ALT,VK_T
--------------------------------------------------------------------------------------------------------------
لم افهم جيدا هده الدالة GetKeyState
---------------------------------------------------------------------------------------------------------------
بالنسبة للاكواد الاخرى فهي مفهومة
***********************************************
- المفترض أن يمرر كل حرف إلى باقي عناصر الـ hook chain لكنه عند إظهار الرسالة من أجل الحرف R، لا يفعل، لماذا؟ لم أنظر كثيراً في السبب.. ابحث أنت
****
الضاهر من الكود انه بعد الترجمة والتحويل ستتم المقارنة مع R ان كان هناك توافق ستضهر الرسالة
لم اجرب بعد الكود حتى افهمه جيدا
aderfiad كتب:لمدا هدا السطر بما اننا نريد فقط R ومادا يعني البارامتر 01234567hinvoke 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
ما معنى Clavier الموجودة في عنوان الموضوع؟
--------------
Clavier بالفرنسية و تعني الكايبورد (:
---
بالمناسبة اول مرة ارى هدا التعريف للمتغير
lpKeyState[256+1] :BYTE
lpCharBuf[32+1] :BYTE
هل هو جدول ؟ ممكن توضيح بسيط
ايضا هده مرة وضعت 16 ومرة 20 لم افهم هده العملية
mov byte ptr [lpKeyState+16],al
الا يمكن تعريف متغير بحجم 1 بايت ونقل محتوى al اليه مباشرة ؟
سأقوم بتغيير 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
بارك الله فيك اخي
لي عودة بعد التجريب ^^
قمت بتجربة هكدا :
.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
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;].endifDo as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
تم تعديل هذه المشاركة بواسطة aderfiad في 21 نوفمبر 2009 في 23:27
أول خطأ صريح
[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
اه نعم خطأ واضح
غيرتها الى hInstance
ولم تضهر الرسالة حتى الان :(
تم تعديل هذه المشاركة بواسطة aderfiad في 22 نوفمبر 2009 في 01:44
أرفق لي الملف التنفيذي بعد التعديل، أستخدم RadASM وصراحة لا رغبة عندي بإضافة مشروع جديد و dialog الخ الخ..
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
حسناً أخطاؤك الأخرى ليست بهذه الوضوح لكنها أخطاء، إملائية..
فقد أنقصت بعض التعليمات في الكود الذي نقلته!
لديك على سبيل المثال
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
صححت الاخطاء
ووضعت الكود كما قلت اخي ولم يشتغل
وضعت كود تتبيت الهوك في الاول هكدا
.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:
الا يوجد حل للقيام بهدا الامر ؟ :(
سأقتبس هذا الرد القديم لي والذي كتبته أساساً لك
اقتباسولو لاحظت فأنت تقوم بإنشاء 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
الخطأ اضنه اني وضعت كود الهوك بعد الدالة DialogBoxParam
لقد وضعته قبلها كما وضعته انت في مشاركتك ولم يشتغل البرنامج في هده الحالة
يشتغل بروسيس البرنامج لكن النافدة لا تضهر
نعم هذا هو الخطأ.
من ناحية أخرى ثبت الـ 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
مثّال عما ذكرته منذ قليل
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
شكرا لك اخي الكريم
ساجرب السورس ولي عودة
فقط لدي ملاحضة بسيطة عند الضغط على A وضهور الرسالة يتجمد الجهاز لمدة 5 تواني تقريبا
لا يحدث هذا لدي.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
تم بنجاح اخي
ازلت الدوال RegisterHotKey وGetMessageو UnregisterHotKey
ووضعت دالة ازالت الهوك UnhookWindowsHookEx في خاصية الاغلاق WM_CLOSE واشتغل تمام فقط مشكل التجمد
مادا كان دور تلك الدوال التي ازلتها ؟
فكل الدوال فهمتها الا التلات دوال التي ازلتها الان وقد سئلت عنها في الاول لم افهم دورها في البرنامج
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
بارك الله فيك اخي الكريم :clapping: