delphi4arab منتديات دلفي للعرب

نسخة كاملة : استفسار عن عمل هوك لدالة CreateWindowEx
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم ورحمة الله وبركاتة

في البدااية لا اعرف اسااسيات الهوك .. لكني اعرف انه تغيير عمل دالة او شيء ما ليعمل لصالحنا Smile

... الحالة ...
لدي لعبة تعمل بنمط Full window mode ... و**** ان اجعلها Window mode
فعندما قمت بتنقيح اللعبة وجدت اني استطيع عمل ذلك عن طريق الدالة CreateWindowEx
فعندما يتم إنشاء النافذة عن طريق CreateWindowEx يتم إعطائها بارمترات ... وعندما اقوم
بتغيير بارمتر dwStyle واجعل قيمته 0 احصل على Window mode وذلك كان في OllyDBG

الدالة CreateWindowEx
كود :
HWND CreateWindowEx( DWORD dwExStyle, // extended window style LPCTSTR lpClassName, // pointer to registered class name LPCTSTR lpWindowName, // pointer to window name DWORD dwStyle, // window style int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window HMENU hMenu, // handle to menu, or child-window identifier HINSTANCE hInstance, // handle to application instance LPVOID lpParam // pointer to window-creation data );

والآن إذا اردت عمل برنامج يقوم بتغيير نمط نوافذ الألعاب من Full window mode إلى
Window mode ... كيف افعل ذلك ؟؟
السلام عليكم
أخي العزيز ليس هناك داعي لاستخدام الهوك يكفي أن تحصل على مقبض النافذة و تطلع على الدالة SetWindowPos
الطريقة الثانية استخدام الدالة WriteProcessMemory (مبدأ عمل اللودر ) :: من خلال Olly أحصل على عنوان dwStyle ثم قم بتغييره بالدالة السابقة ..
الطريقة الثالثة تعتمد على الكتابة على اللعبة في القرص الصلب :: مبدأ عمل الباتش

حاول دائما اللجوء الى الطرق السهلة و المختصرة لأداء مهمتك
ويفضل أن تستخدم الطريقة الأولى لأنها لا تعدل بشكل مباشر في الذاكرة لذلك فهي آمنة
قمت بتنقيح بعض الألعاب بعضها يمر بالدالة SetWindowPos والبعض الآخر لا ينفذها ... اي انها لن تفيدني مع جميع الألعاب Smile !

ام هل تقصد ان استعملها من خلال برنامجي هكذا ... ؟
كود :
SetWindowPos(........);
ALmuhhnad كتب :هل تقصد ان استعملها من خلال برنامجي هكذا ؟
كود :
SetWindowPos(........);
نعم هذا ما أقصده ..
بمجرد حصولك على مقبض نافذة اللعبة فستعمل الدالة ان شاء الله
+++
زائد ألغ فكرة الهوووك : هل تعلم أنه عندما تقوم بعمل الهووك على الدالة CreateWindowEx
ستحتاج الى dll تقوم بحقنها في بروسس اللعبة ثم عند مناداة الدالة CreateWindowEx يتم العبور أولا عن دالتك وكما تعلم فأغلب الكونترول تمر على الدالة CreateWindowEx مثل (الفورم , Button , Edit) ..
هل ستقوم بتغيير dwStyle لجميع هذه الكونترولات أم ماذا ؟

وان أصريت على التعديل على dwStyle فيمكنك أن تستعمل WriteProcessMemory
السلام عليكم ورحمة الله وبركاتة
عندما قمت بإستعمال :
كود :
SetWindowPos();
حصلت على ما أريـ د لكن لكن مع بعض المشااكل ... التي تتطلب عمل هوك لبعض الدوال مثل
ChangeDisplaySettings ... كي لا يتم تغيير ابعاد الجهاز الخاص بي
ShowWindow ... كي لا يتم تصغير نافذة اللعبة عندما اعمل على برنامج آخر

ولم اذكر اني أريـ د ان اعمل برنامج يقوم بإحتواء النافذة ... الهدف وجعلها Window mode

بالمناسبة جربت إستعمال الدالة ChangeDisplaySettings من خلال برنامجي ولم تنفع عندما تكون اللعبة
تعمل لا اعرف اين المشكلة ... لكن بدون اللعبة فالدالة تعمل Smile

بالنسبة للهوك لا بأس بإستعمال dll لاحظ اني اتعامل مع العاب وليس برامج لذلك ستعمل الدالة CreateWindowEx فقط على النافذة حيث انها المكون الوحيد Smile ولا يوجد Button
لدي احسااس انك تريد ابعادي عن الهوك ... لسبب اجهله p:

ارفقت سرووس كود برنامجي لكي ترى إلى اين وصلت بالضبط ( الكود ربما تجده معقد قليلاً لانه طور البرمجة Smile )
كنت افكر بطرحه متكاملاً لكني ساطرحه الآن ...
ملاحظة : تم تطويرة من خلال DXE3
ALmuhhnad كتب :السلام عليكم ورحمة الله وبركاتة

تعمل لا اعرف اين المشكلة ... لكن بدون اللعبة فالدالة تعمل Smile

بالنسبة للهوك لا بأس بإستعمال dll لاحظ اني اتعامل مع العاب وليس برامج لذلك ستعمل الدالة CreateWindowEx فقط على النافذة حيث انها المكون الوحيد Smile ولا يوجد Button
لدي احسااس انك تريد ابعادي عن الهوك ... لسبب اجهله p:
احساسك في محله .. بالطبع أريـــــد ابعادك عن الهوووك (فأنت تريـــد استعمال Remote hooks)لأنها الطريقة الأخيرة التي نلجأ اليها ..
قد تتسائل لماذا ؟
اليك الجواب :
كود :
When you install hooks, remember that they affect system performance. System-wide hooks are the most notorious. Since ALL related events will be routed through your filter function, your system may slow down noticeably.

ALmuhhnad كتب :بتغيير بارمتر dwStyle واجعل قيمته 0 احصل على Window mode وذلك كان في OllyDBG
بما أنك حصلت على Window mode , فاستخدم الدالة SetWindowLong مع تمرير البرامتر 0
PHP كود :
SetWindowLong(WindowGameHandle,GWL_STYLE,0); 
وعليكم السلام ورحمة الله وبركاتة
كود :
SetWindowLong(WindowGameHandle,GWL_STYLE,0);
لم يفلح مع اغلب الالعاب ... واعتقد ان السبب .. اني يجب ان اعطي المبرامتر dwStyle قيمة 0 قبل ان يتم جلب موارد اللعبة ...إلخ

بالنسبة لـ :
إقتباس :When you install hooks, remember that they affect system performance. System-wide hooks are the most notorious. Since ALL related events will be routed through your filter function, your system may slow down noticeably.
هل هذا فقط مع دوال النظام API ام حتى الدوال الخاصة بالبرامج ؟؟


ايضاً عند إستعمال الامر ChangeDisplaySettings لكي ارجع ابعاد حاسوبي لما كانت عليه قبل تشغيل اللعبة ... بعض الالعاب
تختفي نوافذة وبعضها يحصل معها Crash... إلخ

لذلك اضن ان الحل الاخير هو عمل Hook ...
إن لم يكن لديك مانع ان تعمل لي مثال صغير عن طريقة وضع النافذة بنمط Window mode بستعمال :
كود :
SetWindowPos(); SetWindowLong();
ربما اني لم استعملها بشكل جيد Smile
ALmuhhnad كتب :وعليكم السلام ورحمة الله وبركاتة
كود :
SetWindowLong(WindowGameHandle,GWL_STYLE,0);

بالنسبة لـ :

هل هذا فقط مع دوال النظام API ام حتى الدوال الخاصة بالبرامج ؟؟

لا مع جميع الدوال .. ويمكن أن يسبب مشاكل مع تطبيقات ال Multi Thread ...


إقتباس :لم يفلح مع اغلب الالعاب ... واعتقد ان السبب .. اني يجب ان اعطي المبرامتر dwStyle قيمة 0 قبل ان يتم جلب موارد اللعبة ...إلخ
اذن ليس هناك داعي لعمل مثال ...
قم بتجربة الطريقة الثانية WriteProcessMemory و أخبرني !!
إقتباس : قم بتجربة الطريقة الثانية WriteProcessMemory و أخبرني !!

كيف اقوم بذلك
وانا أريـ د ان اعمل ذلك مع اكثر من لعبة حيث سيتغير عنوان قيمة الـ dwStyle
من لعبة لإخرى

فإذا عرفت مكان البارمتر dwStyle في لعبة سيختلف في الألعاب الآخرى !؟
ALmuhhnad كتب :كيف اقوم بذلك
وانا أريـ د ان اعمل ذلك مع اكثر من لعبة حيث سيتغير عنوان قيمة الـ dwStyle
من لعبة لإخرى

فإذا عرفت مكان البارمتر dwStyle في لعبة سيختلف في الألعاب الآخرى !؟

مع حميع اللعب !!!
ممكن أن سبب فشل الدالة SetWindowPos يعود لأن اللعبة تتحقق في كل مرة من برامتر الشاشة وهدا أمر عادي فأغلب الألعاب تقوم بدلك ويتم في حدث الرسم paint

ادن ليس هناك حل آخر .. سيتوجب عليك استعماك الهوووك
استعمل مكتبة madCodeHook فهي توفر لك دوال سريعة وسهلة لعمل ماتطلبه ..
قبل أن تبدأ بالعمل ألق نظرة على ال documentation
كود :
http://help.madshi.net/madCodeHook.htm
الصفحات : 1 2