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

[ تمت الإجابة ]اسئلة عن HOOK

مغلقرائج
بدأه الاخير زمانه في 6 أغسطس 2006 · 51 رد · 7,163 مشاهدة · في أرشيف قسم Windows APIs
مشاركة: واتساب X فيسبوك تيليجرام
#27

السلام عليكم ورحمة الله ،

مشكور اخي Asm4all على الاجابة ..

اخي cipher حمد لله على السلامة ،،

الله يعينك و يسهل امرك ان شاء الله ، ومشكور على المرور ..

سأقرء ردكما بأستفاضة ،، ولي عودة ،، بعون الله في القريب العاجل ..

جزاكم الله كل خير ،،

كالعادة .. ارجو التواصل ... :rolleyes:

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#28

ممكن اسأل سؤال شوية خارج الموضوع ،،

ما هذه الدوال

UnhookWinEvent
 SetWinEventHook

هذا من ال msdn

The SetWinEventHook function sets an event hook function for a range of events. 

The UnhookWinEvent function removes an event hook function created by a previous call to SetWinEventHook.

طبعا هذا تابع لشيء يدعى Event

بصرااحة قرأت لكن لم اي افهم شيء ، ما شا الله :wacko:

اظنه امر تابع للشبكات

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#29

الاخير زمانه :

انت عاوز النقاش في كل شئ .. على مهلك! ستصاب بعسر هضم .

لا داعي للتخبط ... خليك مع الـ system hook أولاً وأكمل فهم Global hook ..

لا تنسى تقول لي كم مرة عملت restart..

لاتنسى , لا تستخدم MessageBox ستعمل لك كوارث !

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#30

السلام عليكم

اقتباس
انت عاوز النقاش في كل شئ .. على مهلك! ستصاب بعسر هضم .

لا داعي للتخبط

حاضر :rolleyes:

وحدة وحدة ،،

المشكلة انا عندما اقرء احس بجهلي واتمنى ان حسن من مستواي بأقصر وقت ممكن ..

اقتباس
لا تنسى تقول لي كم مرة عملت restart..

:lol:

أنت بس شد حيلك وارجعلنا بالسلامة :rolleyes:

تروح وترجع بالسلامة ،، بأنتظارك ..

اخي Asm4all

اشكرك على سعة صدرك وعلى هذا الشرح الجميل ,, جزاك الله كل خير ،،

نرجع للموضوع ..

المحاولة رقم 2

تكونت ال dll ، لكن هناك مشاكل في استخدامها ..

(الكود لسه بداءي واكيد في عدة مشاكل فأنا لم انتهي منه ، لكن هناك امور اعجزتني !!!)

قبل ان ابدء ،

بالنسبة للمقالة Hook and Dll ،

ما كل هذا التعقيد في ملف MouseHook.h

#ifndef _DEFINED_44E531B1_14D3_11d5_A025_006067718D04
#define _DEFINED_44E531B1_14D3_11d5_A025_006067718D04
#if _MSC_VER > 1000
#pragma once
#endif
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
#ifdef _COMPILING_44E531B1_14D3_11d5_A025_006067718D04
#define LIBSPEC __declspec(dllexport)
#else
#define LIBSPEC __declspec(dllimport)
#endif // _COMPILING_44E531B1_14D3_11d5_A025_006067718D04
   LIBSPEC BOOL setMyHook(HWND hWnd);
   LIBSPEC BOOL clearMyHook(HWND hWnd);
#undef LIBSPEC
#ifdef __cplusplus
}
#endif // __cplusplus
#define UWM_MOUSEMOVE_MSG _T("UWM_MOUSEMOVE_MSG-44E531B1_14D3_11d5_A025_006067718D04")

// These declarations are because the latest SDK isn't installed...
#ifndef GET_X_LPARAM
#define GET_X_LPARAM(p) ((int)(short)LOWORD(p))
#define GET_Y_LPARAM(p) ((int)(short)HIWORD(p))
#endif

#endif // _DEFINED_44E531B1_14D3_11d5_A025_006067718D04

الا يكفي ان يكون ملف الهيدر فايل كالأتي ،

#define DLL_EXPORT __declspec(dllexport)


DLL_EXPORT BOOL SetMouseHook(HWND hwnd);

DLL_EXPORT BOOL RemoveHook(HWND hwnd);

#define UWM_MOUSEHOOK_MSG _T("UWM_MOUSEMOVE_MSG-44E531B1_14D3_11d5_A025_006067718D04")

هنا يظهر خطأ ، يقول

error : missing ';' before identifier 'SetMouseHook'

قمت بوضع

#include <windows.h>

في بداية الملف ، (كما رأيت في احد الامثلة )

شغلة اخرى ،

انا قمت بتعريف اكثر من رسالة ، يعني كالأتي:

#define UWM_LBUTTONMOUSE_MSG _T("UWM_LBUTTONMOUSE_MSG-44E531B1_14D3_11d5_A025_006067718D04")
#define UWM_RBUTTONMOUSE_MSG _T("UWM_RBUTTONMOUSE_MSG-44E531B1_14D3_11d5_A025_006067718D04")
#define UWM_MOUSEMOVE_MSG _T("UWM_MOUSEMOVE_MSG-44E531B1_14D3_11d5_A025_006067718D04")

طبعا غيرت الاسماء ،

هل يجب ايضا ان اغير الارقام ؟؟

وفي الملف .c (حسب المقالة اعلاه)

#include <tchar.h>
#include "hok.h"
#include<windows.h>

#pragma data_seg(".JOE")
HWND hWndServer = NULL;

static HINSTANCE hDllInst = NULL;
static HHOOK	 hHook	= NULL;

#pragma data_seg()
#pragma comment(linker, "/section:.JOE,rws")

UINT UWM_LBUTTONMOUSE;
UINT UWM_RBUTTONMOUSE;
UINT UWM_MOUSEMOVE;


LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam);


BOOL APIENTRY DllMain( HINSTANCE hInstance,  DWORD  Reason  LPVOID Reserved )
{
 switch(Reason)
	{ 
	 case DLL_PROCESS_ATTACH:
	hDllInst = hInstance;
	UWM_LBUTTONMOUSE = RegisterWindowMessage(UWM_LBUTTONMOUSE_MSG);
	UWM_RBUTTONMOUSE = RegisterWindowMessage(UWM_RBUTTONMOUSE_MSG);
	UWM_MOUSEMOVE = RegisterWindowMessage(UWM_MOUSEMOVE_MSG);

  return TRUE;
	 case DLL_PROCESS_DETACH:
	if(hWndServer != NULL)
	   RemoveHook(hWndServer);
	return TRUE;
	} 
	return TRUE;
}


__declspec(dllexport) BOOL SetMouseHook(HWND hWnd)
	{
	 if(hWndServer != NULL)
	return FALSE; 
	 hHook = SetWindowsHookEx(WH_MOUSE,
				(HOOKPROC)LowLevelMouseProc,
				hDllInst,
				0);
	 if(hHook != NULL)
	{ 
	 hWndServer = hWnd;
	 return TRUE;
	} 
	 return FALSE; 
	} 


__declspec(dllexport) BOOL RemoveHook(HWND hWnd)
	{
	 if(hWnd != hWndServer || hWnd == NULL)
	return FALSE;
	 BOOL unhooked = UnhookWindowsHookEx(hHook);
	 if(unhooked)
	hWndServer = NULL;
	 return unhooked;
	} 

هنا ، هل المقطع التالي صحيح ؟؟

LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) 

{ 

PMOUSEHOOKSTRUCT hok=(PMOUSEHOOKSTRUCT) lParam;

if(nCode < 0)
	  { 

  CallNextHookEx(hHook, nCode,wParam, lParam);
	   return 0;
	  }


if(wParam== WM_RBUTTONUP )
{

 PostMessage(hWndServer, UWM_RBUTTONMOUSE, 0, 0);  }
	 else

	  if(wParam== WM_MOUSEMOVE )
		  PostMessage(hWndServer, UWM_MOUSEMOVE, 0, 0);

	else
			if(wParam== WM_LBUTTONUP )
				PostMessage(hWndServer, UWM_LBUTTONMOUSE, 0, 0);


  return CallNextHookEx(hHook, nCode, 
					   wParam, lParam);

}

،،،

الحمد لله تم تكوين ال dll ،وفتحتها بأحد البرامج لفتح ال dll ووجدت الدالتين المصدرتين ..

،،،

الان بقي الشيء الاصعب !!!

كيف استدعي و اسنعمل هذه الدوال من برنامج اخر ؟؟

اولا ،

لقد رأيت البرنامج المرفق بالمقالة Hook and Dll

لقد تم بناء ال dll ،

وفي البرنامج الذي سيستخدم هذه ال dll ،

تم اضافة هذه الملفات ..

يعني اقصد في البرنامج الذي يعتمد على ال dll ، يحوي على 2 project في ال workspace احدها هو ال dll نفسه و ال Project الاخر هو البرنامج الذي يستخدم ال dll ،

قصدي انهم موضوعان معا ،،

انا قمت بعمل نفس الشيء ،

وفي ملف الهيدر فايل قمت بتعريف الدوال

LRESULT OnMyMouse_L(WPARAM , LPARAM);
LRESULT OnMyMouse_R(WPARAM , LPARAM);
LRESULT OnMouseMove(WPARAM , LPARAM);

طبعا في المقالة عرفها هكذا

afx_msg LRESULT OnMyMouseMove(WPARAM, LPARAM);

انا في البداية عملت نفس الشئ لكن اعترض الكومبايلر على afx_msg ، اظنها تابعة ل MFC ، ولهذا قمت بحذفها ، هل هذا صحيح ؟؟

وفي ملف ال .c

قمت اولا

static UINT UWM_MOUSEMOVE = RegisterWindowMessage(UWM_MOUSEMOVE_MSG);
static UINT UWM_LBUTTONMOUSE = RegisterWindowMessage(UWM_LBUTTONMOUSE_MSG);
static UINT UWM_RBUTTONMOUSE = RegisterWindowMessage(UWM_RBUTTONMOUSE_MSG);

ثم ،، وهنا المشكلة

هذا المقطع ،

اعتراض عليه

BEGIN_MESSAGE_MAP(?? , ??);
	ON_REGISTERED_MESSAGE(UWM_MOUSEMOVE, OnMouseMove)
	ON_REGISTERED_MESSAGE(UWM_LBUTTONMOUSE, OnMyMouse_L)
	ON_REGISTERED_MESSAGE(UWM_RBUTTONMOUSE, OnMyMouse_R)

END_MESSAGE_MAP()

ماذا اضع بدل علامات الاستفهام ؟

بالنظر الى ال msdn ،

يقول

BEGIN_MESSAGE_MAP( theClass, baseClass )

لكن انا هنا ليس لدي تعامل مع الكلاس ،

ما الحل ؟؟ هل يوجد عمل بديل ؟؟

طبعا انا بعد ذلك قمت بعمل ..

ال main كالأتي :

int WINAPI WinMain(HINSTANCE hInstance  , HINSTANCE  ,	LPSTR  , int  )
{

	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),
			  0, (DLGPROC) DlgProc );
return 0; 


}

وهذا جزء من دالة المعالجة الرئيسية

LRESULT CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

AA(hwnd);

	 switch(message)
   {


	case WM_COMMAND:
		switch(wParam)
		{
		case IDC_MOUSE_HOOK:

			SetMouseHook(hwnd);

			return TRUE;

…
…
…
…



}

وهذه احدى الدوال المعرفة ..

LRESULT OnMyMouse_L (WPARAM wParam, LPARAM lParam)

{
	PMOUSEHOOKSTRUCT hok=(PMOUSEHOOKSTRUCT) lParam;
	  SetDlgItemText(hWnd ,IDC_DISPLAY,"you pressed Left ");
			L++;
			SetDlgItemInt(hWnd,IDC_POS_X,hok->pt .x ,TRUE);
				SetDlgItemInt(hWnd,IDC_POS_Y,hok->pt .y ,TRUE);


}

.........................

اعتذر ، اعرف المشاركة اصبحت طويلة ، وملخبطة !!!

انا بس حبيت اوضح عملي وهل انا اسير بصورة صحيحة ،

واهم شيء ، كيف احل المشكلة مع

BEGIN_MESSAGE_MAP

جزاكم الله كل خير ,,

نسيت ،

اخي احمد (اذا لم اكن مخطأ) Asm4all

هل يوجد بمتناولك برنامج متكامل عن الهوك يعتمد على api فقط ،

لكي اتتبعه وأقارن الخطوات واكتشف اخطاءي ،

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

السلام عليكم ...

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#31
اقتباس
لا تنسى تقول لي كم مرة عملت restart..
لو عملت ريستارت غصب عنك , غير نسخة الويندوز :P , انت لسه ما استخدمتش الـ DDK ولا كتبت كود درايفر وبتجربه :D

#ifndef _DEFINED_44E531B1_14D3_11d5_A025_006067718D04
#define _DEFINED_44E531B1_14D3_11d5_A025_006067718D04
.

. 

.

#endif // _DEFINED_44E531B1_14D3_11d5_A025_006067718D04

بيضمن ان الملف يتم تضمينه مره واحدة فقط في المشروع , حتى لو تم تضمينه اكثر من مره

#if _MSC_VER > 1000
#pragma once
#endif

بيختبر اصدار المترجم ليرى دعمة للسطر #pragma once والزي يقوم بمنع تكرار التعريفات

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus 

....

....

#ifdef __cplusplus
}
#endif // __cplusplus

استبدلها بـ

 extern "C" { 

....

....
}

وريح دماغك

ودي فائدتها انها بتمنع تشويه اسم الدالة عند عملية بناء الـ DLL

لو شيلتها وبنيت الـ DLL وعرضت الدوال المصدرة من ال DLL تلاقيها مشوهه , أسماء غريبة

لكن لو ابقيتها , تلاقي أسماء الدوال كما هي , فقط مضاف لأولها العلامة "_" وفي أخرها "@" بعدها عدد البايتات الممرره للدالة

#ifdef _COMPILING_44E531B1_14D3_11d5_A025_006067718D04
#define LIBSPEC __declspec(dllexport)
#else
#define LIBSPEC __declspec(dllimport)
#endif // _COMPILING_44E531B1_14D3_11d5_A025_006067718D04

لو السطر

#define _COMPILING_44E531B1_14D3_11d5_A025_006067718D04

معرف قبل تضمين المكتبة , يكون الكود للتصدير يعني في الـ DLL , ولو لم يكن موجود يكون الكود للاستيراد يعني في الـبرنامج الذي يستدعي الـ DLL

اقتباس
طبعا غيرت الاسماء ،

هل يجب ايضا ان اغير الارقام ؟؟

لا يجب

LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)

أراك تستخدم الاسم القديم , طبعا لا مشكلة برمجية في هذا ولكن المشكلة في من يقرأ الكود بعدك ربما يحدث لبس في الامور, الأفضل انك تغير اسم الدالة مره تانيه , ولو حتى تسميها باسمك افضل من انك تسميها بمسمى له دلالة اخرى

LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) 

{ 

PMOUSEHOOKSTRUCT hok=(PMOUSEHOOKSTRUCT) lParam;

if(nCode < 0)
	  { 

  CallNextHookEx(hHook, nCode,wParam, lParam);
	   return 0;
	  }


if(wParam== WM_RBUTTONUP )
{

PostMessage(hWndServer, UWM_RBUTTONMOUSE, 0, 0);  }
	 else

	  if(wParam== WM_MOUSEMOVE )
		  PostMessage(hWndServer, UWM_MOUSEMOVE, 0, 0);

	else
			if(wParam== WM_LBUTTONUP )
				PostMessage(hWndServer, UWM_LBUTTONMOUSE, 0, 0);


  return CallNextHookEx(hHook, nCode, 
					   wParam, lParam);

}

الأفضل تعديلة الى :

LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
  PMOUSEHOOKSTRUCT hok=(PMOUSEHOOKSTRUCT) lParam;
  if (nCode < 0) { 
	return CallNextHookEx(hHook, nCode,wParam, lParam); // لاحظ التغير , راجع MSDN
  }
  if (wParam == WM_RBUTTONUP)
	PostMessage(hWndServer, UWM_RBUTTONMOUSE, 0, 0);
  else if (wParam == WM_MOUSEMOVE)
	PostMessage(hWndServer, UWM_MOUSEMOVE, 0, 0);
  else if(wParam == WM_LBUTTONUP)

	PostMessage(hWndServer, UWM_LBUTTONMOUSE, 0, 0);	   
  return CallNextHookEx(hHook, nCode, wParam, lParam);
}

بل الأفضل وأقل في الكود :

LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
  PMOUSEHOOKSTRUCT hok=(PMOUSEHOOKSTRUCT) lParam;
  if (nCode >= 0) { 
	if (wParam == WM_RBUTTONUP)
	  PostMessage(hWndServer, UWM_RBUTTONMOUSE, 0, 0);
	else if (wParam == WM_MOUSEMOVE)
	  PostMessage(hWndServer, UWM_MOUSEMOVE, 0, 0);
	else if(wParam == WM_LBUTTONUP)

	  PostMessage(hWndServer, UWM_LBUTTONMOUSE, 0, 0);

  }
  return CallNextHookEx(hHook, nCode, wParam, lParam);
}

وتوجد طريقة مختصرة تراها في المثال الذي سوف أطرحه

BEGIN_MESSAGE_MAP(?? , ??);
	ON_REGISTERED_MESSAGE(UWM_MOUSEMOVE, OnMouseMove)
	ON_REGISTERED_MESSAGE(UWM_LBUTTONMOUSE, OnMyMouse_L)
	ON_REGISTERED_MESSAGE(UWM_RBUTTONMOUSE, OnMyMouse_R)

END_MESSAGE_MAP()

هذا الكود خاص بالـ MFC

اليك مثال يعتمد فقط على الـ Win32 API :

MouseHook.h

// MouseHook.h

#include <windows.h>

#define UWM_MOUSEHOOK_MSG "UWM_MOUSEHOOK-7F888989-D7D3-4b9e-8B1F-C40F7CCF89DF"
#define DllImport extern "C" __declspec( dllimport )
#define DllExport extern "C" __declspec( dllexport )

// DLL_MODULE should be defined in all of the DLL's source
// code modules before this header file is included.

#ifdef DLL_MODULE
  DllExport void WINAPI MouseHook(HWND);
  DllExport void WINAPI MouseUnHook();
#else
  DllImport void WINAPI MouseHook(HWND);
  DllImport void WINAPI MouseUnHook();
#endif

MouseHook.c

// MouseHook.c

#define DLL_MODULE
#include "MouseHook.h"
#pragma data_seg(".share")
static HWND  hMyWnd = NULL;

static HINSTANCE hDllInst = NULL;
static HHOOK	 hHook	= NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.share,rws")
const UINT UWM_MOUSEHOOK = RegisterWindowMessageA(UWM_MOUSEHOOK_MSG);
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) {
  if(dwReason == DLL_PROCESS_ATTACH)
	hDllInst = hInst;
  return TRUE;
}
static LRESULT CALLBACK MouseProc(int Code, WPARAM wParam, LPARAM lParam) {
  if(Code >= 0) {

	if ( wParam == WM_RBUTTONUP ||

		 wParam == WM_MOUSEMOVE ||

		 wParam == WM_LBUTTONUP)
	  PostMessageA(hMyWnd, UWM_MOUSEHOOK, wParam, NULL);
  }
  return CallNextHookEx(NULL, Code, wParam, lParam);
}
void WINAPI MouseHook(HWND hWin) {
  hMyWnd = hWin;
  if(hHook) MouseUnHook();
  hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, hDllInst, NULL);
}
void WINAPI MouseUnHook() {
  if(hHook) {
	if(UnhookWindowsHookEx(hHook))
	  hHook = 0;
  }
}

MouseHook.def

LIBRARY MouseHook
EXPORTS
  MouseHook
  MouseUnHook

MouseHookTest.c

// MouseHookTest.c

#include "MouseHook.h"
#pragma comment(lib, "MouseHook.lib") 

LPCWSTR Title = TEXT("SKELETON");
static UINT UWM_MOUSEHOOK = RegisterWindowMessageA(UWM_MOUSEHOOK_MSG);
void MyRegisterClass(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpCmdLine,int nCmdShow) {
  MSG msg;
  MyRegisterClass(hInstance);
  if(!InitInstance (hInstance, nCmdShow)) return -1;
  while(GetMessage(&msg, NULL, 0, 0)) {
	if(!TranslateAccelerator(msg.hwnd, NULL, &msg)) {
	  TranslateMessage(&msg);
	  DispatchMessage(&msg);
	}
  }
  return 0;
}
void MyRegisterClass(HINSTANCE hInstance) {
  WNDCLASSEX wcex;
  wcex.cbSize		= sizeof(WNDCLASSEX); 
  wcex.style		 = CS_HREDRAW | CS_VREDRAW;
  wcex.lpfnWndProc   = (WNDPROC)WndProc;
  wcex.cbClsExtra	= 0;
  wcex.cbWndExtra	= 0;
  wcex.hInstance	 = hInstance;
  wcex.hIcon		 = LoadIcon(hInstance, (LPCWSTR)NULL);
  wcex.hCursor	   = LoadCursor(NULL, IDC_ARROW);
  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
  wcex.lpszMenuName  = (LPCWSTR)NULL;
  wcex.lpszClassName = Title;
  wcex.hIconSm	   = LoadIcon(wcex.hInstance, (LPCWSTR)NULL);
  RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
  HWND hWnd;
  hWnd  = CreateWindow(Title, Title, WS_OVERLAPPEDWINDOW,
					  CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL,
					  NULL, hInstance, NULL);
  if(!hWnd) return FALSE;
  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);
  return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  int wmId, wmEvent;
  if (message == UWM_MOUSEHOOK) {
	if (wParam == WM_RBUTTONUP) {
	  MessageBoxA(hWnd, "WM_RBUTTONUP", "Hook", MB_OK);
	}

	else if (wParam == WM_LBUTTONUP) {

	  // your code to handle this message

	}

	else if (WM_MOUSEMOVE) {

	  // your code to handle this message

	}
  }
  else {
	switch (message) {
	case WM_CREATE:
	  MouseHook(hWnd);
	  break;
	case WM_DESTROY:
	  MouseUnHook();
	  PostQuitMessage(0);
	  break;
	default:
	  return DefWindowProc(hWnd, message, wParam, lParam);
	}

  }
  return 0;
}

أخيرا , أنصحك بقرائة كتاب Programming Applications for Microsoft Windows للمؤلف Jeffrey Richter

خاصة الفصل 19 DLL Basics

اقتباس
اخي احمد (اذا لم اكن مخطأ) Asm4all

:rolleyes:

#32

السلام عليكم ،

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

و جزاك الله كل خير ،،

الظاهر الرد دسم ،، سأعود للبيت واقرء بتمعن ،، ولي عودة بعون الله ..

اقتباس
أخيرا , أنصحك بقرائة كتاب Programming Applications for Microsoft Windows للمؤلف Jeffrey Richter

اين هذا الكتاب ؟؟

من اين احصل عليه ؟؟

والله انا بحاجة جدا الى مصدر ،، فأنا لا املك -بعد عون الله - غير ال msdn وبعض المقالات من الانترنيت ،،

واكيد .. لا انسى جهودكما :rolleyes:

هلاّ تدلني على هذا الكتاب ،،

ابقى ممنون لك ..

اخي احمد ,,

اخي cipher (بعد ان تعود من سفرك بمشيئة الله ;) )

انا محتاجكم بمشورة لأمر مهم جدا لي ،،

هل تسمحان لي بأن اراسلكم على الخاص او ممكن تعطوني الايميل لكما اذا لا تمانعان ،،

ابغي مشورة منكما واخذ رأيكما ،،

جزاكم الله كل خير ،،

اكرر شكري لك اخي Asm4all على هذا التعاون جعله الله في ميزان حسناتك ..

السلام عليكم

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#33

السلام عليكم ،

اشكرك يا أخ Asm4all على جهدك معي ، ،

لأ املك لك الى الدعاء ،،،

قرأت ردك ،

و نفذت الكود الذي اعطيتني اياه وتنفذ تمام ،

يعطيك العافية ،،

فرج الله عنك كربة من كرب يوم القيامة ..

بس استفسار بسيط ،

ما فائدة هذا

#pragma comment(lib, "MouseHook.lib")

اعتقد اننا يمكن عمل ذلك يدويا من قائمة project ،

لكن ما الفائدة ؟؟

---------

لقد حاولت تحويل البرنامج الى نفس الترتيب الذي كتبت به برنامجي الاول (بدون dll)

وواجهتني مشكلة عقدتني ،

انا برنامجي يتكون من dialog box وبه مجموعة ازرار ،

الغريب الان ان ال dialog box لا يظهر عند تنفيذ البرنامج ،

او بمعنى اصح وادق ، هو يظهر لكن ليس كاملا ، مكان وجود الازرار تظهر اما الدايلوك ككل لا يظهر ، أي تظهر مربعات منفصلة ،

طبعا اولا ،

ملف MouseHook.h

بقي نفسه الذي اعطيتني اياه لم اغيره ،

وكذلك ملف MouseHook.c ، ايضا بقي نفسه .

التغيير حدث هنا ،

MouseHookTest.c

طبعا انا قمت بحذف معظم الكود الخاص ب الهوك وابقيت فقط الجزء الخاص ب ال dialog ولكن النتيجة نفسها لايظهر ال dialog

،

يعني عملت هكذا (بعدما أيست وانقطع الامل !!!!!)

int WINAPI WinMain(HINSTANCE hInsta  , HINSTANCE  ,	LPSTR  , int  )
{


	DialogBox(hInsta, MAKEINTRESOURCE(IDD_DIALOG1),
			  0, (DLGPROC) DlgProc );
return 0; 


}

LRESULT CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{


return TRUE ; 

}

معنى هذا ان هذه الدالة ليست السبب ،،

اذا لماذا لايظهر ال dialog ؟؟!!

طبعا لو قمت بحذف جميع الكود واستبدلته بكود برنامجي القديم سيظهر ال dialog كاملا ،

هل هناك طريقة مختلفة للتعامل مع ال resources ؟؟

وشي اخر ،،

مرات عندما انفذه يقول ان هذا البرنامج سبب خطأ ويجب ان يغلق !!!

اخي Asm4all ارجو ان لا اكون ازعجك بأسئلتي ،، معلش .. راح الكثير و بقي القليل !!!!

طبعا هذه اشكالات اظنها بسيطة .. المهم انا فهمت الفكرة وبرنامجك اخي الفاضل تنفذ ولله الحمد ،،

الان انا افكر في الخطوة القادمة ،،

لكن اولا ،،

اتمنى قراءة ردك ..

ارجو ان لا اكون ازعجتك بطلبي في ردي السابق :(

بالانتظار

السلام عليكم ..

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#34

السلام عليكم ورحمة الله ،

طبعت نسيت اخ احمد ان اقول لك مشكلة اخرى ،

عندما نفذت البرنامج الذي اعطيتني اياه وبعد ان اغلقه يبقى موجود في ال task manager ضمن قائمة ال processes ، لماذا ؟؟

هذه هي اهم مشكلة تواجهني للأن ،

لماذا يبقى البرنامج في ال process التي تعمل ،، مما يسبب ثقل واضح في الحاسبة ؟؟!!!!

*******

قمت بعمل برنامج لعمل هوك على الكيبورد ،

عند الظغط على الزر الايمن للماوس تظهر قائمة بها خيار Hook و UnHook ،

البرنامج نص شغال :lol:

عندما اضغط على خيار hook يبدأ بتنفيذ الهوك تمام ، وعندما اضغط على unhook يتم الغاء الهوك ،

لكن المشكلة انه عند الضغط مرة اخرى على الهوك ،، لا يعمل ،، لا ادري لماذا !!!

الغريبة ايضا ان البرنامج شغال تمام اذا لم اطبقه على ال system ، يعني لو بقيت في نافذة البرنامج والف مرة ضغط hook ثم unhook فالبرنامج شغال ،

لكن لو ضغط hook ثم انتقلت الى ال desktop مثلا وضغط أي مفتاح من الكيبورد (لأختبر الهوك) ثم بعد ذلك ضغط على unhook (الى الأن كل شي تمام )

بعدها اذا ضغط على زر الماوس الايمن واخترت hook من جديد لا يتنفذ الهوك ،،

لا ادري هل المشكلة واضحة ؟؟؟!!!

طبعا انا لا اريد ان ادوخكم معاي ،، بس اذا تعلمون سبب لهذه المشاكل او كن مرة عليكم سابقا فأرجو ان تفيدونني ،

طبعا انتو عملتو الي عليكو .. واكثر بكثير ،،

هذه المشاكل سأحاول ان احلها بعون الله ،

المهم ،

انا حاليا افكر بالخول في ال API Hook ..

ماذا رأيكم ؟؟

طبعا البداية ستكون مع مثال الاخ محمد عبد العزيز ، اظنه تطبيق بسيط ..

ثم بعد ذلك ...........

الله يسهل لنا ..

الووووووووو ...

هل من احد هنا ؟؟

Asm4all ...

ارجو ان اقرء ردك .. حتى لو لم تجيبني ،، المهم ان تدخل هنا لتشجعني للدخول في ال API hook

cipher ...

متى تعود ؟؟

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#35

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

اقتباس
ما فائدة هذا

#pragma comment(lib, "MouseHook.lib")

اعتقد اننا يمكن عمل ذلك يدويا من قائمة project ،

لكن ما الفائدة ؟؟

نقوم بربط المكتبة يدويا , لأن المترجم لن يقوم بعملية الربط آليا

بالنسبة للتعامل مع الواجهه راجع دروس الشمري وكتاب Programming Windows by Charles Petzold , دع هذا الموضوع جانبا ولنكمل في موضوع الهوك

اقتباس
عندما نفذت البرنامج الذي اعطيتني اياه وبعد ان اغلقه يبقى موجود في ال task manager ضمن قائمة ال processes ، لماذا ؟؟

هذه هي اهم مشكلة تواجهني للأن ،

لماذا يبقى البرنامج في ال process التي تعمل ،، مما يسبب ثقل واضح في الحاسبة ؟؟!!!!

هل تقصد الكود المرفق بالمشاركه السابقه ام شيء آخر ؟ الكود لا المرفق عند غلق البرنامج فانه ينتهي مباشرة حيث يقوم بغلق الهوك اولا ثم يقوم بغلق النافذة

لو تقصد برنامج آخر ارفقه لنتحقق منه

اقتباس
عندما اضغط على خيار hook يبدأ بتنفيذ الهوك تمام ، وعندما اضغط على unhook يتم الغاء الهوك ،

لكن المشكلة انه عند الضغط مرة اخرى على الهوك ،، لا يعمل ،، لا ادري لماذا !!!

الغريبة ايضا ان البرنامج شغال تمام اذا لم اطبقه على ال system ، يعني لو بقيت في نافذة البرنامج والف مرة ضغط hook ثم unhook فالبرنامج شغال ،

لكن لو ضغط hook ثم انتقلت الى ال desktop مثلا وضغط أي مفتاح من الكيبورد (لأختبر الهوك) ثم بعد ذلك ضغط على unhook (الى الأن كل شي تمام )

بعدها اذا ضغط على زر الماوس الايمن واخترت hook من جديد لا يتنفذ الهوك ،،

لا ادري هل المشكلة واضحة ؟؟؟!!!

فين الكود

اقتباس
انا حاليا افكر بالخول في ال API Hook ..

ماذا رأيكم ؟؟

طبعا البداية ستكون مع مثال الاخ محمد عبد العزيز ، اظنه تطبيق بسيط ..

والفصل 22 في الكتاب اياه DLL Injection and API Hooking

اقرأ المواضيع كثيرا كثيرا كثيرا

و ربنا يوفقك :)

تم تعديل هذه المشاركة بواسطة Asm4all في 2 سبتمبر 2006 في 02:52

#36

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

أين انت يا أخي ،،

ظننت انك غادرت الموضوع ،،

قلت اكيد اني ثقلت عليه .. وطفش مني :lol:

الحمد لله ،

نرجع للموضوع ،

اقتباس
هل تقصد الكود المرفق بالمشاركه السابقه ام شيء آخر ؟ الكود لا المرفق عند غلق البرنامج فانه ينتهي مباشرة حيث يقوم بغلق الهوك اولا ثم يقوم بغلق النافذة

اخي ،

البرنامج الذي اعطيتني اياه ،

اضافة الى انني قمت بكتابة 3 برامج اخرى وكلها نفس المشكلة ،

البرنامج يغلق تمام ،

لكن في ال task manager

طبعا هو ما موجود في خانة ال applications

لكن موجود ملف exe في خانة ال processes

،،

لا ادري ما السبب ،

طي اخي ،

انت هل قمت بتنفيذ البرنامج ؟؟

هل تواجهك نفس المشكلة ام هذا فقط معي ؟؟

اقتباس
فين الكود

هنا تصدير الدوال ، في ملف .h

#include <windows.h>

#define UWM_KBHOOK_MSG "UWM_KBHOOK-7F888989-D7D3-4b9e-8B1F-C40F7CCF89DF"
#define DllImport extern "C" __declspec( dllimport )
#define DllExport extern "C" __declspec( dllexport )

#ifdef DLL_MODULE
  DllExport void WINAPI KBHook(HWND);
  DllExport void WINAPI KBUnHook();
#else
  DllImport void WINAPI KBHook(HWND);
  DllImport void WINAPI KBUnHook();
#endif

وهنا ملف .c

#define DLL_MODULE
#include "MouseHook.h"
#pragma data_seg(".share")
static HWND  hMyWnd = NULL;

static HINSTANCE hDllInst = NULL;
static HHOOK	 hHook	= NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.share,rws")

const UINT UWM_KBHOOK = RegisterWindowMessageA(UWM_KBHOOK_MSG);



BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) {

  if(dwReason == DLL_PROCESS_ATTACH)
	hDllInst = hInst;
  return TRUE;
}

static LRESULT CALLBACK KBProc(int Code, WPARAM wParam, LPARAM lParam) {
  if(Code < 0) 
  {
	  MessageBoxA(hWnd, " Code < 0 ", "Hook", MB_OK);
  return CallNextHookEx(NULL, Code, wParam, lParam);
  }


	if ( wParam == 65 )

	   PostMessageA(hMyWnd, UWM_KBHOOK, wParam, NULL);

 return CallNextHookEx(NULL, Code, wParam, lParam);

}
void WINAPI KBHook(HWND hWin) {
  hMyWnd = hWin;

  if(hHook) KBUnHook();
  hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KBProc, hDllInst, NULL);

}
void WINAPI KBUnHook() {

  if(hHook) {
	if(UnhookWindowsHookEx(hHook))
	  hHook = 0;
  }
}

وهنا البرنامج الذي سيستخدم الهوك ،

ملف .c

#include "MouseHook.h"
#pragma comment(lib, "Asm4all_dll.lib") 



static UINT UWM_KBHOOK = RegisterWindowMessageA(UWM_KBHOOK_MSG);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpCmdLine,int nCmdShow) {




	  static TCHAR szAppName[] = TEXT ("HelloWin");

	 HWND		 hwnd;
	 MSG		  msg;
	 WNDCLASS	 wndclass;

	 wndclass.style		 = CS_HREDRAW | CS_VREDRAW;
	 wndclass.lpfnWndProc   = WndProc;
	 wndclass.cbClsExtra	= 0;
	 wndclass.cbWndExtra	= 0;
	 wndclass.hInstance	 = hInstance;
	 wndclass.hIcon		 = LoadIcon (NULL, IDI_APPLICATION);
	 wndclass.hCursor	   = LoadCursor (NULL, IDC_ARROW );
	 wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
	 wndclass.lpszMenuName  = NULL;
	 wndclass.lpszClassName = szAppName;

	 RegisterClass (&wndclass);

	  hwnd = CreateWindowEx (0,szAppName,TEXT ("main"),WS_OVERLAPPEDWINDOW,
						  CW_USEDEFAULT,CW_USEDEFAULT,400,400,	  
						  NULL,NULL,hInstance, NULL);	 


	 ShowWindow (hwnd, 1);
	 UpdateWindow (hwnd);

	while( GetMessage(&msg, hwnd, 0, 0) )
	{
			 TranslateMessage(&msg);
			 DispatchMessage(&msg);
	}







  return 0;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

	static HMENU menu;
	POINT po;
	int ID_HOOK=1;
	int ID_UNHOOK=2;
	int ID_CLOSE=3;

  if (message == UWM_KBHOOK) 

	  MessageBoxA(hWnd, "YOU PRESSED 'A' ", "Hook", MB_OK);


	else {
	switch (message) {
	case WM_CREATE:


		 menu =CreatePopupMenu();
		AppendMenu(menu,MF_STRING,ID_HOOK,"Hook");
		AppendMenu(menu,MF_STRING,ID_UNHOOK,"UnHook");
		AppendMenu(menu,MF_STRING,ID_CLOSE,"close"); 



	  break;

	case WM_RBUTTONDOWN :
		 GetCursorPos(&po);
		TrackPopupMenu(menu,TPM_LEFTALIGN,po.x ,po.y,0,hWnd,NULL);
		 break;



	case WM_COMMAND:
		{

			if(LOWORD(wParam) == ID_CLOSE )

				DestroyWindow(hWnd);
			else
				 if(LOWORD(wParam) == ID_HOOK )

					KBHook(hWnd);


				 else

					if(LOWORD(wParam) == ID_UNHOOK )

						KBUnHook();



		}


		break;

	case WM_DESTROY:
	  DestroyWindow(hWnd);
	  PostQuitMessage(0);
	  break;

	  case WM_CLOSE:
		DestroyMenu(menu);

		 break;

	default:

		return DefWindowProc(hWnd, message, wParam, lParam);
	}

  }
  return 0;
}

طبعا المثال بسيط ولا يكاد يفعل شيء ، بس انا كنت حابب اطبق الفكرة التي اعطيتني اياها ..

ارجو ان لا اكون اتعبك معي ..

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

اقتباس
والفصل 22 في الكتاب اياه DLL Injection and API Hooking

اقرأ المواضيع كثيرا كثيرا كثيرا

و ربنا يوفقك

بالفعل انا بدأت اقرء هذا الفصل ،

ولله الحمد

وجزاك الله كل خير على هذا الكتاب ،

لكن تواجهني مشكلة في تحويل برنامج اخونا محمد الى لغة سي ،

سأفتح موضوع جديد بهذا الخصوص ،

و اتمنى ان اراك هناك .. ;)

ربنا يفتح عليك ويسهل امرك ،،

يارب

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#37

السلام عليكم

حاولت ارفاق البرنامج لكن ظهر لي :

اقتباس
مجموع المساحة المطلوبة لرفع المرفقات تجاوزت الحد المسموحة به, الرجاء تقليل حجم أو عدد المرفقات

رغم ان حجم الملف 1.11 MB

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 3 سبتمبر 2006 في 08:55

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#38

السلام عليكم ،،

جزاك الله كل خير اخي على تعاونك وجهدك معي ،،

و ربنا يبارك لك بعلمك و وقتك ،،

سأقرء ردك ،، ولنا عودة ،،

و ارجو التواصل ،،

بارك الله بك ،،

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#39

السلام عليكم ورحمة الله

اخي احمد

سؤال صغير

ما فائدة هذا

#define DEBUG

البرنامج هذا لا يبقى في ال process كما في البرامج السابقة ،، يعني تمام ..

Asm4all

طلب صغير ،،

الكود المرفق في مشاركتك السابقة وايضا الكود الذي اعطيتني اياه اولا ،،

اذا كنت قد نفذتهم لديك وعندك البرنامج كاملا ،،

فأتمنى ان ترفقه اذا كان لديك وقت ولم يكن لديك مانع .. :rolleyes:

----

الحمد لله ،

عندما فتحت هذا الموضوع لم اكن اعرف شيء وكان هذا واضح من مشاركتي الاولى ،

ولله الحمد انه وضعكم في طريقي وسخركم لتعينوني

اولا cipher

ثم دخلت انت ،، وما قصرت ..

جزاك الله كل خير ،،

المهم انا افتهمت الفكرة وخاصة ربط الهوك مع ال dll

،،

ألن تساعدوني في ال api-hook ؟؟ :)

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#40

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

لدي ملحوظة بسيطة , هل نظرت في باقي الكود ؟

اكيد رايت

 #ifdef DEBUG 

....

#endif

و مكان النقاط كود ليس له أهميه على وظيفة البرنامج , فقط استخدمته لتتبع سير البرنامج

لو الغيت التعريف

 #define DEBUG

لن تتم ترجمة الكود مكان النقاط , وسيعامل كأنه تعليق

http://www.google.com/search?hl=en&q=%23ifdef

بعض الاسئلة تكسر النقاش لأنها تظهر عدم الجدية في البحث حتى عن الامور البسيطه

لو تريد تعلم امور مثل الـ hook و برمجة المكتبات وكيفية ربطها , و API Hook , أكيد تحتاج للتأني والبحث

أستطيع أن اعطيك مثال بسيط يشرح طريقة الـ API Hook لـ Process اخرى (هوك لـ MessageBoxA ) , ولكنه لن يفيد لو لم تكتشف الاخطاء والمشاكل واحده واحده

Projects.rar

تم تعديل هذه المشاركة بواسطة Asm4all في 4 سبتمبر 2006 في 13:15

#41

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

مشكور اخي على المرور وعلى هذا التواصل ،

اقتباس
#ifdef DEBUG

....

#endif

و مكان النقاط كود ليس له أهميه على وظيفة البرنامج , فقط استخدمته لتتبع سير البرنامج

لو الغيت التعريف

كود#define DEBUG

لن تتم ترجمة الكود مكان النقاط , وسيعامل كأنه تعليق

اخي انا عرفت هذا الشي ،

بس ظننت انه هناك فائدة اخرى تفيد البرنامج ،،

اقتباس
بعض الاسئلة تكسر النقاش لأنها تظهر عدم الجدية في البحث حتى عن الامور البسيطه

و الله يا اخي لا تتصور مدى جديتي في التعلم ،، لكن الظروف ايضا لها دور ،، الحمد لله على كل حال

اقتباس
لو تريد تعلم امور مثل الـ hook و برمجة المكتبات وكيفية ربطها , و API Hook , أكيد تحتاج للتأني والبحث

اليوم كنت اتكلم مع استاذ لدينا بالجامعة واخبرني نفس الكلام ،، وقال اقرأ كثيرا ،، ولا تتعجل ..

اقتباس
أستطيع أن اعطيك مثال بسيط يشرح طريقة الـ API Hook لـ Process اخرى (هوك لـ MessageBoxA ) , ولكنه لن يفيد لو لم تكتشف الاخطاء والمشاكل واحده واحده

اكيد لن استفيد من مثال جاهز وانا لازلت اجهل الكثير ،،

انا في موضوع ال API -hook بعدني بالبداية ولا زال مشواري طويل ،،

راح اتعبكم معاي ،، تمام ؟؟

كما قلت اخي

اقتباس
واحده واحده

جزاك الله كل خير ،،

وسأتعب نفسي اكثر

والله يعين ،،

ارجو التواصل

--------

اخوك زيد

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 5 سبتمبر 2006 في 10:02

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#42

السلام عليكم ،،

أخ احمد هناك مقالة في هذا القسم بعنوان Disable low level keys

هل اطلعت عليها ؟؟

تستخدم هذا النوع من الهوك

WH_KEYBOARD_LL

يقول ان هذا النوع تم دعمه في ويندوز NT

أتذكر في احدى مشاركاتي كنت ذكرته وقلت لي عرفه بأستخدام

define#

انا استخدم XP SP2 و VC 6

لماذا هذا النوع لايعمل معي ،

لو لاحظت اخي المثال المرفق لوجدته يستخدمه مباشرة بدون تعريفه

الغريب ايضا انه يعمل على ال system بدون استخدام ال dll

اظن ان هاذين النوعين

WH_MOUSE_LL

WH_KEYBOARD_LL

لا يحتاجان الى dll

مجرد تخمين !!!

هذا الموضوع بحاجة الى بحث !!

هل لديك معلومات اخي ؟؟ ،،

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#43

ذلك يسمى system hook

باستخدام الدالة SetWindowsHookEx

d4baa0.gif
#44

شاهد ما قاله cipher هناك

/index.php?showtopic=90427

نظرت في الملف Winuser.h فوجدت :

#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL	 13
#define WH_MOUSE_LL		14
#endif // (_WIN32_WINNT >= 0x0400)

 #if (_WIN32_WINNT >= 0x0400) 

/*
 * Low level hook flags
 */

#define LLKHF_EXTENDED	   (KF_EXTENDED >> 8)
#define LLKHF_INJECTED	   0x00000010
#define LLKHF_ALTDOWN		(KF_ALTDOWN >> 8)
#define LLKHF_UP			 (KF_UP >> 8)

#define LLMHF_INJECTED	   0x00000001

/*
 * Structure used by WH_KEYBOARD_LL
 */
typedef struct tagKBDLLHOOKSTRUCT {
	DWORD   vkCode;
	DWORD   scanCode;
	DWORD   flags;
	DWORD   time;
	ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

/*
 * Structure used by WH_MOUSE_LL
 */
typedef struct tagMSLLHOOKSTRUCT {
	POINT   pt;
	DWORD   mouseData;
	DWORD   flags;
	DWORD   time;
	ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT, FAR *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;

#endif // (_WIN32_WINNT >= 0x0400)

يعني الأمر كان معلق فعلا على اضافة هذا السطر للكود

#define _WIN32_WINNT  0x0400

وفي حالة عدم المعرفة بهذه النقطة نقوم بتعريفهم كما قلت لك

و بالنسبة للحاجة لـ dll أظنها واضحة من المثال أنه لم يحتاج لـ dll

#45

السلام عليكم

مشكور اخي الكريم على الايضاح ،،

،،

اخي احمد ،

كانت لديك مشاركة بعنوان اصطياد دوال ال Native API

فكرت البرنامج دفعتني لأعمل شيء صغير (على قدر معلوماتي)

ماذا لو عملت هوك على WM_CREATE و WM_INITDIALOG

لمعرفة اي برنامج يستخدمهما لأعطاءه الصلاحية او لا ،،

اعرف انه ليس كل البرامج تعتمد على هاتين المسجين ، لكن انا هدفي فقط لأزيد معلوماتي ،،

بكل تأكيد ستواجهني مشاكل جديدة وسأبحث عن الحل ،، وبالتالي استفدت اكثر ،،

ما رأيك هل هذا ممكن ؟؟

حسنا أي نوع من الهوك يفيدني ؟؟

انا فكرت ب WH_GETMASSAGE

-----

لدي فكرة اولية لا اعرف هل تنجح ام لآ ؟؟!!

هل يومين سأحاول ،،

السبت او الاحد ،، سأخبرك بما حصل معي ،،

تحياتي لك ،،

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#46

طبعا يمكن استخدام WH_GETMASSAGE لهذه العملية , لكن ما علاقة هذا بالـ Native API الموضوع Message Hook بحت

طرح الأخ احمد غريب في موضوع الكتب كتاب Windows 2000 API SuperBible اقرأ الفصل الخامس MESSAGE PROCESSING

#47

السلام عليكم ،

اخي اعرف انه لا علاقة له ب Native API ،

انا قصدي ان الفكرة مقتبسة من تلك المقالة ،

طبعا هناك فرق شاسع ،

وطريقة ال system hook لن تفي بالغرض لجميع البرامج ،،

لكن كما ذكرت فقط لأتعلم واتمكن من ال sys. hook

--

اليوم صاري 3 ساعات وانا اعمل ،، للأن لم يضبط معي ،،

سأحاول وأحاول ،،

وعندما ايأس ،، راجعلك !!!

--

حملت الكتاب وسأطلع عليه ،،

تحياتي لك ،،

وجزاك الله خير الجزاء على تعاونك الكبير معي ،،

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#48

السلام عليكم ،

اقتباس
السبت او الاحد ،، سأخبرك بما حصل معي ،،

ها قد عدت :D

وهذا ما فعلت ،،

في ملف Hook_dll.h

#include <windows.h>

#define UWM_CREATEINITDIALOG_MSG "UWM_CREATEINITDIALOG-7F888989-D7D3-4b9e-8B1F-C40F7CCF89DF"
#define DllImport extern "C" __declspec( dllimport )
#define DllExport extern "C" __declspec( dllexport )



#ifdef DLL_MODULE
  DllExport void WINAPI MsgHook(HWND);
  DllExport void WINAPI MsgUnHook();
#else
  DllImport void WINAPI MsgHook(HWND);
  DllImport void WINAPI MsgUnHook();
#endif

static int flag=0;

نفس الامثلة السابقة فقط اضافة متغير flag

في ملف Hook_dll.c

#define DLL_MODULE
#include "Hook_dll.h"
#pragma data_seg(".share")
static HWND  hMyWnd = NULL;

static HHOOK	 hHook	= NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.share,rws")

static HINSTANCE hDllInst = NULL;

const UINT UWM_CREATEINITDIALOG = RegisterWindowMessageA(UWM_CREATEINITDIALOG_MSG);

BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) {
  if(dwReason == DLL_PROCESS_ATTACH)
	hDllInst = hInst;
  return TRUE;
}

static LRESULT CALLBACK MyGetMsgProc(int Code, WPARAM wParam, LPARAM lParam) {



	if(Code <0)
  return CallNextHookEx(NULL, Code, wParam, lParam);

  else


  {

   //MessageBox(0 ,"do you want to running this program ..? ", " hook ",MB_YESNO);

 PMSG hok=(PMSG) lParam;


if ( LOWORD(hok->message) == WM_CREATE || LOWORD( hok->message )== WM_INITDIALOG )
{	 // begin if
MessageBox(0 ,"do you want to running this program ..? ", " hook ",MB_YESNO)  ;
PostMessageA(hMyWnd, UWM_CREATEINITDIALOG, wParam, lParam);

}	   // end if


  }

  if(!flag)
  return CallNextHookEx(NULL, Code, wParam, lParam);
}


void WINAPI MsgHook(HWND hWin)

 {

  hMyWnd = hWin;

  if(hHook) MouseUnHook();
  hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyGetMsgProc, hDllInst, NULL);
}


void WINAPI MsgUnHook() 
{
  if(hHook) 
  {
	if(UnhookWindowsHookEx(hHook))
	  hHook = 0;
  }
}

هنا الخطأ

الرسالة ابدا لا تبعث ،

اقصد هذا الجزء

if ( LOWORD(hok->message) == WM_CREATE || LOWORD( hok->message )== WM_INITDIALOG )
{	 // begin if
MessageBox(0 ,"do you want to running this program ..? ", " hook ",MB_YESNO)  ;
PostMessageA(hMyWnd, UWM_CREATEINITDIALOG, wParam, lParam);

}	   // end if

بدليل ان المسج بوكس ابدا لا تظهر (طبعا اقصد عندما استخدم هذه ال dll من برنامج ثاني ، راح اكتبو بالآسفل )

وللتأكد من ان ال dll تتنفذ قمت بحركة غبية !!!

في الكود في الاعلى يوجد سطر ملغي

هذا

   //MessageBox(0 ,"do you want to running this program ..? ", " hook ",MB_YESNO);

وضعته قبل جملة if فقط للتأكد من انه تم ربط ال dll ،

صارت مصيبة ،، قامت المسج بالظهور بأستمرار ولم استطع الغيها ابدا وكأن ال dll بقيت تتنفذ حتى بعد غلق البرنامج ،،

والحل ... restart !!!!

ملف CreateMsg.c

#include "Hook_dll.h"
#pragma comment(lib, "Hookl_dll.lib") 



static UINT UWM_CREATEINITDIALOG = RegisterWindowMessageA(UWM_CREATEINITDIALOG_MSG);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpCmdLine,int nCmdShow) {

	…
…
…



  return 0;
}



 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {


  if (message == UWM_CREATEINITDIALOG) 
  {

  if (MessageBox(0 ,"do you want to running this program ..? ", " hook ",MB_YESNO)==IDYES)
	flag=0;
  else 
	  flag=1;

	}


  else 

	switch (message) {
	case WM_CREATE:
	  MsgHook(hWnd);
	  break;
	case WM_DESTROY:
	  MsgUnHook();
	  PostQuitMessage(0);
	  break;
	default:
	  return DefWindowProc(hWnd, message, wParam, lParam);
	}

   return 0;
}

طبعا اساسا هذا الملف لا يقوم بشيء لآن كما ذكرتُ سلفا ،

الرسالة المسجلة لا تأتي ابدا

،،

اخ احمد

انا اعتمدت على ايقاف البرنامج بالتحكم بهذا الدالة CallNextHookEx بواسطة المتغير flag ،

لا ادري هل هذا ينفع ؟

لا استطيع الان ان اختبر صحة هذه الطريقة لأن الرسالة المسجلة لا تصل اصلا !!

،،

فكرت بطريقة اسهل ،، ولكن اظنها لا تصح ،،

هل من الممكن ان تكون المعالجة مباشرة من داخل ال dll ،، حتى بدون الحاجة الى تسجيل رسالة وكل هذه الدوخة !!

هكذا

static LRESULT CALLBACK MyGetMsgProc(int Code, WPARAM wParam, LPARAM lParam) {



	if(Code <0)
  return CallNextHookEx(NULL, Code, wParam, lParam);

  else


  {


 PMSG hok=(PMSG) lParam;

if ( LOWORD(hok->message) == WM_CREATE || LOWORD( hok->message )== WM_INITDIALOG )

if (MessageBox(hMyWnd ,"do you want to running this program ..? ", " hook ",MB_YESNO)==IDYES)
			 flag=0;else flag=1;



  }

 if(!flag)
 return CallNextHookEx(NULL, Code, wParam, lParam);
}

طبعا نفس الشي ،

لا تتحقق جملة if

لا اعرف اين الخطأ في التعامل مع الرسالة

ال msdn يقول

GetMsgProc


lParam 
[in] Pointer to an MSG structure that contains details about the message. 


MSG
The MSG structure contains message information from a thread's message queue. 
typedef struct tagMSG {
  HWND   hwnd; 
  UINT   message; 
  WPARAM wParam; 
  LPARAM lParam; 
  DWORD  time; 
  POINT  pt; 
} MSG, *PMSG;

،،،

اخي في الله ،

اعرف اني بدأت اثقل عليك ،،

بارك الله فيك فأنت الوحيد الذي استمريت معي للأن ،

لا اريد ان اثقل عليك ،

اذا كان لديك وقت لأجابتي فأكيد انت ما راح تقصر ، واذا كنت مشغول ،، لا ثقل على نفسك ،

بس خليك معي بموضوع ال API- Hook ;)

فأنا متشوق للخطوة القادمة

--

تحياتي لك ،،

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 9 سبتمبر 2006 في 09:11

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#49

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

 

static LRESULT CALLBACK MyGetMsgProc(int Code, WPARAM wParam, LPARAM lParam) {
  if (Code < 0)
	return CallNextHookEx(NULL, Code, wParam, lParam);
  else {
	//MessageBox(0 ,"do you want to running this program ..? ", " hook ",MB_YESNO);
	PMSG hok = (PMSG) lParam;
	if ( LOWORD(hok->message) == WM_CREATE || LOWORD( hok->message ) == WM_INITDIALOG ) { // begin if
	  MessageBox(0 , "do you want to running this program ..? ", " hook ", MB_YESNO);
	  PostMessageA(hMyWnd, UWM_CREATEINITDIALOG, wParam, lParam);
	} // end if
  }
  if (!flag)
	return CallNextHookEx(NULL, Code, wParam, lParam);
}

هذا الكود خطأ بكل ما تحمله الكلمة من معاني

أولا من هذا الـ flag , أين تعريفه , ما هي قيمته وأين تتغير هذه القيمة؟

ثانيا بهذه الطريقة ليس في كل الحالات تعيد الدالة قيم

ثالثا

 

  //MessageBox(0 ,"do you want to running this program ..? ", " hook ",MB_YESNO);

طبعا مكان خطأ 100% لأن الرسالة دي حتتنفذ في أي حالة يتم ارسال أي رسالة في أي برنامج يعني عدد لا نهائي من الرسائل

رابعا

 

if ( LOWORD(hok->message) == WM_CREATE || LOWORD( hok->message ) == WM_INITDIALOG )

لماذا LOWORD ؟؟

أخيرا

اقتباس
"do you want to running this program ..? "
حتعمل ايه طيب لو مش عايز :P ؟

راجع WM_CREATE و WM_INITDIALOG . ملكش سلطة على انشاء النافذة يا مسكين

اقتباس
The WM_CREATE message is sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. (The message is sent before the function returns.) The window procedure of the new window receives this message after the window is created, but before the window becomes visible.
اقتباس
The WM_INITDIALOG message is sent to the dialog box procedure immediately before a dialog box is displayed. Dialog box procedures typically use this message to initialize controls and carry out any other initialization tasks that affect the appearance of the dialog box.
يعني النافذة تم انشائها من زماااااااااااااان قوي ويادوب بيعرفوك انها خلصت لو عايز تعمل انت حاجه
اقتباس
بس خليك معي بموضوع ال API- Hook ;)

فأنا متشوق للخطوة القادمة

وانا قلق جدا من نوعية الأسئلة في المرحلة القادمة

we will not go into the nitty-gritty details of WIN32 API Programming

#50

السلام عليكم

اقتباس
هذا الكود خطأ بكل ما تحمله الكلمة من معاني

لماذا ؟؟

انا هذا ما اقصده

static LRESULT CALLBACK MyGetMsgProc(int Code, WPARAM wParam, LPARAM lParam) {
  if (Code < 0)
	return CallNextHookEx(NULL, Code, wParam, lParam);
  else {
	PMSG hok = (PMSG) lParam;
	if ( LOWORD(hok->message) == WM_CREATE || LOWORD( hok->message ) == WM_INITDIALOG ) 

	  PostMessageA(hMyWnd, UWM_CREATEINITDIALOG, wParam, lParam);

  }
  if (!flag)
	return CallNextHookEx(NULL, Code, wParam, lParam);
}

يعني بالنسبة لهذه الجملة

 MessageBox(0 , "do you want to running this program ..? ", " hook ", MB_YESNO);

وضعتها فقط لأرى هل جملة if تتحقق ..

اقتباس
أولا من هذا الـ flag , أين تعريفه , ما هي قيمته وأين تتغير هذه القيمة؟

التعريف هنا

اقتباس
في ملف Hook_dll.h

و تتغير قيمته هنا

اقتباس
ملف CreateMsg.c

،

هل هذا الخطأ الذي تقصد ،،

التغير هنا CreateMsg.c لا ينعكس داخل Hook_dll.h

،،

اقتباس
لماذا LOWORD ؟؟

جربت معها و بلاها وماكو فايدة ،

ال msdn يقول ان ال LOWORD يحوي على الرسالة وال high word يكون محجوز او شيء من هذا القبيل ،،

اقتباس
ملكش سلطة على انشاء النافذة يا مسكين

،،

مع الاسف :(

اذا الغي الفكرة ،،

والا هناك امل

هنا

اقتباس
but before the window becomes visible

يعني ممكن جعل النافذة لاتظهر ؟؟

،

طيب والطريقة الثانية وهي ان اعالج المشكلة من داخل ال dll ، ممكن ،،

اقتباس
فكرت بطريقة اسهل ،، ولكن اظنها لا تصح ،،

هل من الممكن ان تكون المعالجة مباشرة من داخل ال dll ،، حتى بدون الحاجة الى تسجيل رسالة وكل هذه الدوخة !!

هكذا

كود

static LRESULT CALLBACK MyGetMsgProc(int Code, WPARAM wParam, LPARAM lParam) {



	if(Code <0)
  return CallNextHookEx(NULL, Code, wParam, lParam);

  else


  {


PMSG hok=(PMSG) lParam;

if ( LOWORD(hok->message) == WM_CREATE || LOWORD( hok->message )== WM_INITDIALOG )

if (MessageBox(hMyWnd ,"do you want to running this program ..? ", " hook ",MB_YESNO)==IDYES)
			 flag=0;else flag=1;



  }

if(!flag)
return CallNextHookEx(NULL, Code, wParam, lParam);
}

مع تعريف ال flag داخل Hook_dll.c

----------

موضوع ال system hook محدد و ليس مرن ،،

بصراحة موضوع ال API hook اكثر من رائع ،، يعني تتحكم في كل حاجة زي ما انت عايز ،،

اقتباس
وانا قلق جدا من نوعية الأسئلة في المرحلة القادمة

لماذا ؟؟

اكيد تقصد مستوى الاسئلة ؟؟

قول يارب وان شاء الله راح يكون موضوع كويس ..

الله يسهل :)

تحياتي

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…