PDA

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



mahdi7s
29-06-2009, 11:44
سلام

سوالاتی در مورد کنترل رویدادهای موس و کیبورد برام پیش اومده که از شما دوستان می خوام تا کمکم کنید.:46:


1) چه طوری می تونم بفهمم موس در کجای محیط ویندوز کلیک کرده یا دابل کلیک کرده و ... ؟

2) چه طوری می تونم کلید های کیبورد رو کنترل کنم؟(مثلا بنویسم MAHDI با استفاده از کلید های کیبورد و بدون فشردن آن ها!!!)


نکته: در سوالات فوق منظور برنامه ی خاصی نبود و کنترل موس و کنترل کیبورد به صورت کلی و در هر جایی از ویندوز هدف من هست.


ممنونم.:11:

عــــلی
29-06-2009, 12:12
نگاهي اجمالي به هوكهاي ويندوز
محمد شمس
چكيده
استفاده از هوك، يكي از مباحث تكنيكي مطرح در زمينه برنامه نويسي سيستمي بوده كه كاربرد بسياري در ساخت برنامه هاي كنترل كننده
سيستم عامل دارد. هوك به معني ايجاد شنود بر روند اجراي وقايعي مانند فراخواني توابع، ارسال پيامها و پاسخ به رخدادها در سيستم عامل
مي باشد. از اين تكنيك در ساخت نر مافزارهايي مانند آنتي ويروسها، فايروالها، ديباگرها، نرم افزارهاي جاسوسي و ويروسها استفاده م يشود.
معرفي و تشريح شده و در پايان، ساختار فايلهاي اجرايي ويندوز و نحوه اجراي آنها API همچنين در اين مقاله روشهايي جهت شنود بر توابع
در سيستم عامل مورد بررسي قرار م يگيرد.
كلمات كليدي
PE سيستم پيام رسان; تزريق كد; ساختار فايل ; API هوك; شنود توابع

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مقدمه
يكي از مباحث مهمي كه در زمينه برنامه نويسي سيستمي مطرح
مي شود، كنترل دقيق نحوه انجام كارها توسط سيستم عامل است.
بدين منظور، برنامه نويسان اقدام به نصب و راه اندازي شنودگرهايي
نرم افزاري جهت كنترل نحوه پاسخدهي سيستم عامل به وقايع سيستم
مي كنند. بديهي است كه در حين كنترل اين روند، م يتوان تغييراتي
دلخواه، بسته به نياز و هدف برنام هنويس، در نحوه انجام آن اعمال كرد.
١- هوك چيست
همانطور كه مي دانيم سازوكار سيستم عامل ويندوز، يك سيستم
مبتني بر پيام است. يعني تمام اعمالي كه در ويندوز انجام مي شود از
طريق ارسال پيامهايي از بخشهاي مختلف اين سيستم عامل به ساير
بخشها صورت مي گيرد. به عنوان مثال وقتي كه پنجره اي را در ويندوز
تغيير مكان مي دهيم، پيامي توسط بخش كنترل كننده اينترفيس
به نام API برنامه، حاوي اطلاعات موقعيت پنجره و از طريق تابع
به بخشي از هسته سيستم عامل ارسال گشته و SendMessage()
سيستم عامل بر اساس پارامترهاي دريافتي، كار مورد نظر را انجام
مي دهد. با توجه به مكانيسم ذكر شده، به عمل نصب شنودگرها در
.[ سيستم پيام رسان سيستم عامل، هوك گفته م يشود [ 1
احتمالا در ابتدا هوكها جهت استفاده در ديباگرها و اعمال كنترلي
سيستم معرفي و بوجود آمده بودند اما امروزه، برنامه نويسان كاربردهاي
فراواني براي آنها پيدا كردند. مثلاً برنامه اي براي ثبت كليدهاي فشرده
شده در سيستم.
هوكها بر روي انواع خاصي از پيامهاي ارسالي نصب شده و شنود بر
تمامي انواع پيامهاي سيستم عامل به سادگي امكانپذير نيست. ايده
اصلي هوك، در واقع نوشتن تابعي است كه به محض فعال شدن
در سيستم عامل، اجرا مي شود. حال اين تابع (Event) رويدادي خاص
مي تواند فقط شاهد داد ههاي ارسالي بوده و يا آنها را تغيير هم بدهد.
١- فوايد استفاده از هوك -١
- تغيير مكانيسم يا روند اجراي برنام هها: با استفاده از هوك م يتوان
اعمال دلخواهي، قبل و يا بعد از فعال شدن رويدادهاي برنامه
انجام داد. بدين وسيله مي توان امكاناتي به برنامه هاي آماده و
كامپايل شده افزوده و يا روند پي شفرض آنها را تغيير داد. مثلاً
CD جلوگيري از عملي كه يك قفل نر مافزاري براي بررسي وجود
در درايو انجام م يدهد.
- ديباگ و مهندسي معكوس: معمول ترين روش ديباگ كردن
برنامه هاي كامپايل شده استفاده از هوكهاي سيستم عامل است.
با اين كار م يتوان رابطه مابين بخشهاي مختلف يك نرم افزار و
نحوه تعامل آنها با سيستم عامل را بررسي كرده و به ايرادات
احتمالي آن پي برد. به اين عمل اصطلاحاً مهندسي معكوس
گفته مي شود.
API - كشف قابليتهاي مخفي سيستم عامل: تعداد زيادي از توابع
موجود در ويندوز، مخفي بوده و هيچگونه مستنداتي از طرف
شركت مايكروسافت جهت معرفي آنها ارائه نشده است كه
گفته مي شود. Undocumented API اصطلاحا به آنها
در حال حاضر كتب بسياري به اين مقوله پرداخته كه حاصل
مدتها تحقيق و بررسي و استفاده از روشهاي مهندسي معكوس بر
ساختار سيستم عامل ويندوز مي باشند. در اين كتب، تعداد زيادي
از توابع مستند نشده ويندوز معرفي شده و نحوه كار آنها تشريح
شده است.
يكي از نكاتي كه قبل از استفاده از هوك مي بايست به آن توجه شود
اينست كه هدف، شنود بر يك برنامه خاص بوده يا به منظور بررسي
عملي، در كل سيستم عامل است.
به SendMessage() مثلا اگر بخواهيم پارامترهاي ارسالي در تابع
پنجره هاي ويندوز را بدست آوريم، مي بايست يك هوك سراسري
نصب شود، اما اگر هدف فقط بررسي يك برنامه تنها (Global hook)
(Local hook) باشد نيازي به اينكار نبوده و از يك هوك محلي
استفاده مي شود. به عبارتي يك هوك سراسري، رويدادهاي تمام
پروسه هاي موجود را شنود مي كند.
٢- ساختار كلي هوك
و درايور تشكيل م يشود. (Hook server) از دو بخش سرويس دهنده
درايور كار اصلي را انجام داده و پيامهاي مورد نظر را از سيستم دريافت
مي كند. سرور نيز در تعامل با درايور بوده و بنا به خواست برنامه نويس،
براي نحوه برخورد با پيامها تصميم م يگيرد.
و كاملاً مجزا DLL در يك سيستم هوك سراسري، درايور در يك فايل
از قسمت سرور قرار م يگيرد. به عبارتي برنامه سرور اقدام به راه اندازي
مي نمايد. DLL درايور از درون فايل
و LoadLibrary() به طور دقيق تر سرور مي بايست با استفاده از تابع
آن را Handle نموده و DLL به طور پويا، اقدام به بارگزاري فايل
اشاره گر GetProcAddress() بدست آورد. سپس با استفاده از تابع
مربوط به تابع نصب هوك را بدست آورده و از آن استفاده كند. با
تابع هوك SetWindowsHookEx() اينكار درايور با استفاده از تابع
را به عنوان اولين حلقه از زنجيره هوكهاي سيستم نصب مي كند.
اشاره گر مربوط به آدرس هوك نصب SetWindowsHookEx() تابع
شده را به عنوان مقدار بازگشتي برمي گرداند. اين مقدار اهميت زيادي
اين CallNextHookEx() دارد زيرا م يبايست با استفاده از تابع
آدرس را به ادامه زنجيره هوكها متصل كنيم. همچنين پس از پايان كار
.[ براي حذف هوك از اين آدرس استفاده مي شود [ 2
در مورد هر نوع از پيامهاي ارسالي در سيستم عامل، ممكن است تعداد
زيادي هوك به شكل يك زنجيره به هم متصل نصب شده باشند. پس
از فعال شدن رويداد مربوطه و ارسال پيام مورد نظر، سيستم عامل
اولين حلقه از اين زنجير را فراخواني كرده و پس از آن هر كدام از
هوكها بايد پس از انجام كارشان، حلقه بعدي را توسط تابع
فراخواني كنند. بديهي است كه اگر اين عمل CallNextHookEx()
به درستي انجام نشود، زنجيره مذكور قطع شده و هوكهاي بعدي هيچ
پيامي دريافت نمي كنند. به عنوان مثال ممكن است كه دو برنامه به
طور همزمان اقدام به شنود بر داده هاي ارسالي توسط دستگاه ماوس
كنند. در اين ميان مي بايست هر دوي اين برنامه ها، داده هاي مورد نياز
خود را بدرستي دريافت نمايند.
شايان ذكر است كه استفاده گسترده از هوكها شديداً، سرعت پردازش
سيستم عامل را كند مي كند. زيرا با نصب زنجيره اي از هوكها ميزان
پردازشي كه سيستم در ازاي ارسال هر پيام انجام مي دهد افزايش
مي يابد و در اين حين توابع مربوط به تمام هوكها م يبايست ت كتك
پردازش شده تا در نهايت پيام مربوطه به مقصد نهايي برسد. در نتيجه
تنها زماني از هوكها استفاده م يشود كه راه ديگري وجود نداشته باشد.
همچنين اگر كوچكترين خطايي در حين كار برنامه سرويس دهنده يا
درايور آن رخ دهد، ممكن است روند اجراي سيستم عامل مختل گردد.
مربوطه را در فضاي DLL پس از نصب هوك سراسري، ويندوز فايل
مربوط به تمام پروس هها نوشته و آن را به (Address space) آدرس
( عنوان قسمتي از روند ارسال پيام، مسيردهي مي كند. (شكل ۱
پس از پايان عمل شنود و يا زماني كه نياز به خروج از برنامه سرويس
دهنده باشد، هوك نصب شده بايد از زنجيره هوكها خارج شود. براي
استفاده مي شود. اين UnHookWindowsHookEx() اينكار از تابع
را به عنوان SetWindowsHookEx() تابع اشار هگر دريافت شده از
پارامتر ورودي دريافت كرده و اقدام به حذف هوك م يكند.
هنگامي كه اين تابع فراخواني مي شود، سيستم عامل صبر مي كند تا
تمام پروس ههايي كه در حال استفاده از تابع هوك هستند پردازش خود
را تمام كرده و سپس اقدام به حذف هوك از فضاي آدرس پروس هها
مي نمايد. ساختار توابع ذكر شده در جداول ۱ تا ۶ تشريح شده است.
۱- پيامهاي مورد استفاده در هوك -۲
شنود بر پيامهايي كه با استفاده از :WH_CALLWNDPROC
به پنجره ها ارسال م يشوند. نوع تابع آن SendMessage() تابع
بوده و درست قبل از ارسال پيام ذكر شده اجرا CallWndProc
مي گردد.
پس از پردازش پيامهاي مذكور :WH_CALLWNDPROCRET
در برنامه پنجره مقصد، توسط اين هوك مي توان آنها را مشاهده كرد.
است. CallWndProcRet نوع تابع آن
بوده و قبل از اعمالي مثل CBTProc نوع تابع خروجي :WH_CBT
فعال شدن پنجر هها، ساخت، تخريب، تغيير مكان يا اندازه پنجره ها و يا
و به عبارتي قبل از پردازش هر عملي كه (Focus) تمركز روي كنترلها
توسط ماوس يا كيبورد بر روي پنجره ها انجام مي شود، اجرا مي گردد.
است و دقيقاً قبل از DebugProc نوع تابع آن :WH_DEBUG
فراخواني توابع هوك نصب شده در سيستم اجرا شده و اطلاعاتي در
مورد هوك فعال شده دريافت مي كند. به عبارتي به منظور ديباگ
كردن روند اجراي ديگر هوكها از آن استفاده م يشود.
بوده و دقيقا GetMsgProc نوع تابع آن :WH_GETMESSAGE
و GetMessage() زماني اجرا مي شود كه برنامه اي با استفاده از توابع
اقدام به خواندن يك پيام از صف پيامهاي PeekMessage() يا
دريافتي خود مي كند. قبل از پردازش پيام دريافت شده توسط برنامه،
اين هوك فعال ميگردد.
از اين هوك براي اجراي :WH_JOURNALPLAYBACK
دنباله اي از رويدادهاي ماوس و كيبورد كه قبلاً توسط هوك ديگري با
از سيستم ضبط شده اند، استفاده WH_JOURNALRECORD نام
مي گردد. پس از نصب اين هوك، وروديهاي استاندارد ماوس و كيبورد
غير فعال شده و دنباله مذكور اجرا م يشود. همچنين نوع تابع آن
است. JournalPlaybackProc
JournalRecordProc تابع آن :WH_JOURNALRECORD
بوده و براي ضبط دنباله ذكر شده مورد استفاده قرار م يگيرد. كاربرد
بوده كه در ابتدا اعمال Macro Recorder اين دو هوك در برنام ههاي
انجام شده توسط ماوس و كيبورد را ضبط نموده و سپس در زمان
مناسب دوباره اجرا م ينمايند.
بوده و تمام KeyboardProc نوع تابع آن :WH_KEYBOARD
رويدادهاي صفحه كليد را شنود مي كند. به عبارتي هر وقت كه
اقدام به PeekMessage() يا GetMessage() برنامه اي با استفاده از
كند، WM_KEYDOWN يا WM_KEYUP پردازش پيامي از نوع
هوك مذكور آن پيام را دريافت خواهد كرد.
بوده و تمام رويدادهاي MouseProc نوع تابع آن :WH_MOUSE
دستگاه ماوس را شنود مي كند.
نوع تابع :WH_SYSMSGFILTER و WH_MSGFILTER
،DialogBox بوده و تمام پيامهايي كه توسط MessageProc آنها
و منوها ارسال مي گردند را دريافت Scrollbar ،MessageBox
مي كنند.
پيامهاي مربوط به برنامه هاي كنسولي را دريافت :WH_SHELL
است. ShellProc كرده و نوع تابع آن
به همراه پيامهاي ذكر SetWindowsHookEx() استفاده از تابع
شده، روش استاندارد سيستم عامل ويندوز براي استفاده از هوكها و
شنود مي باشد. حال آنكه ممكن است بخواهيم بر روي پيامهاي ديگر و
شنود نماييم. اين مبحث در DLL يا بر روي توابع موجود در فايلهاي
بخش بعدي تشريح خواهد شد.
API ۳- شنود بر توابع
توسط API تا كنون روشهايي متفاوتي براي شنود بر توابع
برنامه نويسان مختلف ارائه شده است كه برخي از آنها در اين بخش
تشريح م يشوند [ 3]. اما قبل از ادامه اين بحث بهتر است به توضيح
مختصري در مورد مهمترين فايلهاي كتابخان هاي ويندوز، توجه نماييد:
I/O مانند توابع مديريت GUI حاوي توابع غير :Kernel32.dll -
و فايلها، مديريت حافظه، مديريت اشياء، پروس هها و نخها
مي باشد. همچنين رابطي بين توابع سطح پايين (Threads)
و سرويسهاي سيستم عامل است. NTDll.dll موجود در
حاوي تمام توابع مربوط به اعمال گرافيكي مثل :GDI32.dll -
و كار با رنگها م يباشد. Bitmap ترسيم خطوط، قلمها، فايلهاي
البته تمام توابع بصري سطح پايين سيستم در فايل
در حين اجرا، GDI قرار داشته و توابع موجود در Win32k.sys
آنها را فراخواني م يكنند.
مانند توابع GUI تمام توابع سطح بالاي مرتبط با :User32.dll -
كار با فرمها، پنجر هها، منوها و كنترلها در اين كتابخانه قرار دارند.
GDI البته اين كتابخانه براي انجام اعمال بصري خود از توابع
استفاده م يكند.
۱- استفاده از رجيستري -۳
يكي از روشها تزريق كد به برنام هها، استفاده از كليد زير در رجيستري
است:
HKLM\Software\Microsoft\WindowsNT\CurrentVersion
\Windows\AppInit_DLLs
هايي كه نام آنها در اين كليد ذكر شده باشد به عنوان DLL تمام
محسوب شده و با استفاده از تابع User32.dll بخشي از كتابخانه
به درون حافظه تمام پروسه ها بارگزاري مي گردند. LoadLibrary()
البته اين روش هم مشكلاتي دارد از جمله اينكه فقط در مورد
برنامه هايي مي تواند به كار برود كه از كتابخانه ذكر شده استفاده
مي كنند و به عبارتي برنامه هاي كنسولي را شامل نمي شود، زيرا اين
نمي كنند. Import را User برنامه ها معمولا هيچ يك از توابع 32
مشكل ديگر اين است كه براي غير فعال كردن اين روش مي بايست
گردد. Restart كليد مربوطه در رجيستري پاك شده و سيستم
مربوطه به حافظه تمام پروسه ها، سرباري DLL همچنين اضافه شدن
بوجود م يآورد كه باعث اشغال حافظه سيستم و كند شدن پردازش
مي شود.
واسطه DLL ۲- استفاده از -۳
مثلاً فرض كنيد كه م يخواهيم بر فراخوانيها و پارامترهايي شنود كنيم
ارسال Wsock32.dll به فايل كتابخان هاي IE كه توسط برنامه
حاوي توابع ويندوز جهت كار با DLL مي گردند. اين
و ارسال و دريافت داده ها در شبكه است. به WindowsSocket
عبارتي تمام برنام ههايي كه نياز به ارتباط با شبكه از طريق
داشته باشند، از توابع موجود در اين فايل استفاده WindowsSocket
مشابه اين فايل درست كرده و DLL مي كنند. حال مي بايست فايلي
تمامي توابع مورد نظر را در آن قرار داده و فايل مذكور را در فهرست
حاوي برنامه مورد نظر قرار دهيم.
از اين پس هر وقت برنامه مورد نظر اجرا شود، در صورت نياز به
اي است كه در DLL اولويت اول با ،DLL فراخواني توابع موجود در
دايركتوري خود برنامه قرار دارد. در صورتي كه اين فايل موجود نباشد
و غيره جستجو خواهند شد. بدين System32 ،System مسيرهاي
رسيده و مي توان اقدام به DLL شكل تمام فراخوانيهاي برنامه به اين
شنود يا تغييرات دلخواه در پاسخ به برنامه نمود.
البته نقطه ضعف بسيار بزرگ اين روش اين است كه م يبايست تمام
واسطه نيز وجود داشته DLL اصلي، عيناً در DLL توابع موجود در
باشند، تا امكان استفاده از آنها توسط برنامه وجود داشته باشد. در
نتيجه ممكن است براي مانيتور كردن يك تابع مجبور شويم بيش از
صدها تابع ديگر را نيز تعريف نماييم.
براي رفع اين مشكل مي توان با بررسي دقيق برنامه مربوطه، تمام
مربوطه را پيدا كرده و فقط توابع DLL فراخوانيهاي مربوط به
شده را بازسازي كنيم كه خود اين مسئله هم ممكن است Import
بسيار وقتگير و مشكل باشد.
API ۳- تغيير در خود تابع -۳
DLL براي اينكار روشهاي مختلفي وجود دارد كه يكي از آنها ديباگ
Breakpoint با فرمان API مربوطه در حافظه و تنظيم بايت اوليه
مي باشد. بدين شكل هر فراخواني از تابع مربوطه، منجر به (Int (وقفه 3
شده كه به برنامه ديباگر ما ارسال (Exception) توليد يك استثناء
مي گردد.
مشكلات اين روش، كند شدن سيستم عامل به خاطر درگير شدن با
سيستم مديريت استثناء در ويندوز بوده و ديگري مشكلي است كه
زمان خاتمه پروسه ديباگر پيش م يآيد. همانطور كه م يدانيد پس از
پايان پروسه يك ديباگر، تمام برنامه هاي تحت كنترل آن ديباگر نيز
بسته خواهند شد.
راهكار ديگر تغيير كنترل اجراي تابع با استفاده از فرمانهاي پرش
به قسمت شنودگر است. بدين شكل كه م يتوان تابع CALL يا JMP
كرده و در ابتداي آن، فرمان پرش را قرار Dissassemble مربوطه را
دهيم. مشكلي كه در اين زمينه ممكن است پيش بيايد كمبود فضا
مربوطه API براي درج فرمان پرش است. زيرا ممكن است روتين
حجم بسيار كمي مثلاً در حدود ۴ بايت داشته باشد، حال آنكه خود
فرامين پرش، پس از كامپايل به ۵ بايت تبديل م يشوند.
مشكل ديگر دشواري حذف روتين شنود است. زيرا براي اينكار
مي بايست كد برنامه در حافظه و به طور پويا رونويسي شده و فرمان
پرش از بين برود.
۴- تغيير فراخوانيها -۳
براي شنود بر فراخوانيهاي يك برنامه، نقطه ديگري كه مي توان بر آن
متمركز شد خود فراخوانيها در فايل برنامه مذكور هستند. اينكار را
مي توان با تغيير در فايل اجرايي برنامه و يا پس از اجراي برنامه و با
رونويسي مكانهاي اجراي فراخواني در حافظه انجام داد. قسمت مشكل
اينكار پيدا كردن يك به يك اين نقاط در كد برنامه م يباشد كه كار
دشواري است.
(Import Table Address) IAT ۵- تغيير در -۳
ها DLL اين روش بر اين اصل بنا نهاده شده كه فايلها اجرايي ويندوز و
هستند. در اين فرمت، فايلهاي اجرايي از PE همگي داراي فرمت
بخشهاي منطقي مجزايي به نام سكشن تشكيل شده اند. هر كدام از
.text سكشنها حاوي نوع خاصي از داده ها مي باشند. مثلاً سكشن
حاوي .rsrc حاوي كد اجرايي كامپايل شده برنامه بوده و يا سكشن
ريسورسهاي مورد استفاده برنامه مثل تصاوير، اصوات يا فرمها است.
حاوي جدول آدرسهاي وارد شده .idata در ميان تمام آنها، سكشن
Import مي باشد. اين جدول حاوي آدرس نسبي تمام توابع (IAT)
شده به فايل اجرايي است.
پس از اجراي يك برنامه، سيستم عامل آن را درون حافظه بارگزاري
كرده و اين آدرسها را به آدرس صحيح توابع مذكور در حافظه تغيير
مي دهد. دليل وجود اين جدول اين است كه فايلهاي اجرايي هميشه
در مكان ثابتي از حافظه بارگزاري نم يشوند.
در نتيجه پس از هر بار اجراي برنامه، مي بايست در تمام فراخوانيهاي
موجود، آدرس نسبي تصحيح گشته كه اين عمل بسيار مشكل است.
اين مشكل با مجتمع كردن تمام آدرسهاي وارد شده در مكاني از فايل
حل م يشود. IAT به نام
بدين منظور كافي است كه هر يك از فراخوانيها را به طور نسبي
آدرس دهي كنيم و آدرسهاي اصلي را در خود IAT (محلي) نسبت به
نگهداريم. بدين شكل سيستم عامل به سادگي م يتواند يك بار IAT
تغيير دهد كه به ازاي آن تمام فراخوانيها از IAT آدرس مربوطه را در
.[ طريق همين آدرس تصحيح شده انجام خواهند شد [ 4
با توجه به مطالب ذكر شده، در اين روش مي توانيم كد اجرايي شنودگر
بارگزاري (Memory context) را در فضاي پروسه مربوطه در حافظه
به آدرس شنودگر ،IAT كرده و سپس آدرس تابع مورد نظر را در
تغيير داده و در خود شنودگر تابع اصلي را فراخواني كنيم.
بدين شكل قبل از اينكه تابع اصلي فراخواني شود، محتواي پارامترهاي
ورودي آن به شنودگر ارسال مي شوند كه مي توان تغييرات دلخواه را
روي آنها اعمال نمود. تنها مشكلي كه در اين زمينه پيش مي آيد نحوه
بارگزاري كد اجرايي شنودگر در فضاي پروسه مربوطه در حافظه است.
PE ۴- نگاهي كوتاه به ساختار فايل
فرمت جديدي را براي ،NT شركت مايكروسافت در زمان عرضه ويندوز
معرفي (Portable Executable) PE فايلهاي اجرايي ويندوز با نام
به معني اجرايي قابل حمل مي باشد كه دليل آن اين PE نمود. كلمه
است كه در ميان تمام سيستم عاملهاي ۳۲ بيتي مايكروسافت قابل
.[ استفاده بوده و توسط آنها پشتيباني م يشود [ 5
كه (Common Object File Format) COFF اين فرمت بر اساس
فرمت فايل رايج و مورد استفاده در سيستم عامل يونيكس است
در سال ۱۹۹۳ توسط كميت هاي به نام PE طراحي شده بود. فرمت
متشكل از شركتهاي اينتل، (Tool Interface Standard) TIS
مايكروسافت، بورلند و آي بي ام به استانداردي همگاني تبديل شد.
به بلاكهايي به نام سكشن تقسيم شده كه حاوي داده هايي با PE فايل
خصلتهاي مختلف مثل داده/كد اجرايي/خواندني/نوشتني هستند. اين
فايل را مي توان مشابه يك ديسك منطقي فرض كرد كه هدر
مثل بوت سكتور آن بوده و سكشنها همان فايلهاي PE فايل (Header)
نوشته شده روي ديسك مي باشند.
(Section table) پس از هدر فايل، قسمتي به نام جدول سكشنها
در ديسك مي باشد. اين جدول FAT موجود است كه مانند جدول
آرايه اي از هدر تمام سكشنهاي موجود در فايل است. به عبارتي به
تعداد سكشنهاي موجود در فايل، در اين جدول هدر وجود دارد. در هر
كدام از اين هدرها اطلاعاتي مثل خصلت سكشن مربوطه، آفست و
سايز آن در فايل و نحوه بارگزاري آن در حافظه موجود است.
در نهايت پس از اين جدول به خود سكشنها مي رسيم كه حاوي تمام
داده هاي موجود در فايل، با توجه به نوع سكشن مي باشند.
يك جدول بزرگ حاوي هدرها و PE پس به طور كلي يك فايل
در PE سكشنها مي باشد. خلاصه اي از مهمترين قسمتهاي فرمت
جدول ۷ ذكر شد هاند.
PE ۱- روند اجراي فايلهاي -۴
سيستم بارگزار ويندوز فضايي را در ،PE پس از اجراي يك فايل
حافظه به آن پروسه اختصاص داده و اقدام به بارگزاري فايل اجرايي در
آن فضا مي كند. بدين منظور جداول هدر را در آدرس پايه پيش فرض
قرار داده و به همين ترتيب سكشنها نيز با محاسبه آدرس نسبيشان
نسبت به آدرس پايه، در حافظه قرار م يگيرند. (RVA)
در همين حين خصلتهاي هر سكشن نيز با توجه به تعاريف موجود در
هدر آن تنظيم م يشوند. پس از اينكه تمام سكشنها در حافظه قرار
بررسي شده و تمام (Import table) گرفتند، جدول توابع ورودي
فايلهاي كتابخان هاي مورد نياز، در فضاي رزرو شده توسط اين پروسه
بارگزاري مي شوند.
تك تك (Export table) پس پايان بارگزاري، جدول خروجي
IAT هاي مذكور بررسي شده و آدرس توابع مورد نظر آنها در DLL
حاوي اشاره گر تمام توابع مورد IAT پروسه ثبت مي گردد. در نتيجه
نياز پروسه در حافظه مي باشد. با استفاده از اين مكانيسم ديگر نيازي
به تغيير آدرس در خود فراخوانيهاي تابع در كد برنامه نبوده و تمام
انجام م يشوند. IAT آدرس دهي ها به طور نسبي و نسبت به
۵- نتيجه
همانطور كه ذكر شد، استفاده از هوكها، جزئي اجتناب ناپذير از
برنامه هاي سيستمي م يباشد.
در اين زمينه برنامه نويسان زيادي اقدام به انتشار كامپوننتها و
كتابخانه هايي از توابع، جهت تسهيل روند هوك كردن توابع سيستمي
كرده اند.
براي MadshiSDK يكي از كتابخانه هاي معروف در اين زمينه
از HookToolSDK پياده سازي در زبان دلفي و ديگري مجموعه
به منظور استفاده در برنام ههاي دات نت InfoProcess شركت
مي باشد.
تمامي اين كتابخانه ها به دفعات در ويروسهاي كامپيوتري مورد سوء
استفاده قرار گرفته و خسارات بسياري به بار آورد هاند. به عنوان مثال
فرض كنيد كه ويروس مورد نظر با هوك كردن تابع
كنترل اجراي برنامه ها را بدست گرفته و يا با هوك CreateProcess()
روند مديريت حافظه را مختل WriteProcessMemory() تابعي مثل
كند.
در چنين مواردي، آنت يويروسها نيز با استفاده از روشهاي مشابهي اقدام
به مقابله با آنها م ينمايند.
نهايتاً كاربرد هوك بسيار وسيعتر از موارد ذكر شده بوده و در اكثر
برنامه هاي مورد استفاده كاربران، مانند فايروالها، برنامه هاي گرافيكي،
نرم افزارهاي اداري، محيطهاي برنامه سازي، ديباگرها و غيره مورد
استفاده قرار مي گيرد.
از اين رو كسب اطلاعات و دانشي نسبي در اين زمينه، امري ضروري
براي تمام برنامه نويسان محسوب مي شود.
شكل ( ۱): بارگزاري درايور در حافظه پروس ههاي ديگر
نام پارامتر نوع توضيحات
WH_KEYBOARD نوع پيامي كه هوك مي شود را مشخص م ينمايد. مثلا Integer idHook
آدرس تابع هوك در حافظه TFNHookProc lpfn
اي كه هوك درون آن قرار دارد. براي هوكهاي محلي از صفر استفاده م يشود DLL هندل مربوط به Hinst hMod
مربوط به پروسه اي كه قرار است هوك شود. براي هوكهاي سراسري از صفر استفاده م يشود thread id Cardinal dwThreadID
را بازم يگرداند Null در صورت موفقيت هندل تابع هوك در زنجيره و در غير اينصورت HHOOK مقدار بازگشتي
SetWindowsHookEx() جدول ( ۱): مشخصات تابع
نام پارامتر نوع توضيحات
هندل تابع هوك در زنجيره HHOOK hhk
در صورت موفقيت مقداري غير صفر و در غير اينصورت صفر را بازم يگرداند BOOL مقدار بازگشتي
UnhookWindowsHookEx() جدول ( ۲): مشخصات تابع
نام پارامتر نوع توضيحات
هندل تابع هوك در زنجيره HHOOK hhk
طريقه برخورد تابع با دو پارامتر بعدي را مشخص م يكند Integer Code
پارامتر ارسالي اول به تابع هوك با توجه به نوع آن Word wParam
پارامتر ارسالي دوم به تابع هوك با توجه به نوع آن Longword lParam
در صورت موفقيت مقداري غير صفر است كه تابع بعدي در زنجيره هوك بازگردانده است LRESULT مقدار بازگشتي
CallNextHookEx() جدول ( ۳): مشخصات تابع
نام پارامتر نوع توضيحات
اشاره گر به رشت هاي حاوي نام ماژول مورد نظر LPCTSTR lpFileName
را بازم يگرداند Null در صورت موفقيت هندل ماژول و در غير اينصورت HMODULE مقدار بازگشتي
LoadLibrary() جدول ( ۴): مشخصات تابع
نام پارامتر نوع توضيحات
هندل ماژول مورد نظر HMODULE hModule
در صورت موفقيت مقداري غير صفر و در غير اينصورت صفر را بازم يگرداند BOOL مقدار بازگشتي
FreeLibrary() جدول ( ۵): مشخصات تابع
نام پارامتر نوع توضيحات
هندل ماژول مورد نظر HMODULE hModule
اشاره گر به رشت هاي حاوي نام تابع مورد نظر LPCTSTR lpProcName
را بازم يگرداند Null در صورت موفقيت آدرس تابع مورد نظر و در غير اينصورت BOOL مقدار بازگشتي
GetProcAddress() جدول ( ۶): مشخصات تابع
PE جدول ( ۷): ساختار فايل
مراجع
[1] Microsoft© Developer Network - October 2003
[2] "An Introduction to Hook Procedures" by Zarko Gajic
[3] "API Spying Techniques for Windows" by Yariv
Kaplan, May 2001
[4] "Peering Inside the PE: A Tour of the Win32 Portable
Executable File Format" byMatt Pietrek, March 1994
[5] "An In-Depth Look into the Win32 PE file format" by
Matt Pietrek, February 2002
IMAGE_DOS_HEADER
DOS EXE Signature
DOS_ChkSum
PE Pointer
MS-DOS ...
information
MS-DOS Stub Program This program cannot be run in DOS mode
IMAGE_FILE_HEADER
PE signature (PE)
NumberOfSections
TimeDateStamp
SizeOfOptionalHeader
Characteristics
...
Windows NT information
IMAGE_NT_HEADERS
IMAGE_OPTIONAL_HEADER
MagicNumber
SizeOfCode
AddressOfEntryPoint
ImageBase
SizeOfImage
SizeOfHeaders
CheckSum
SizeOfStackReserve
SizeOfHeapReserve
IMAGE_DATA_DIRECTORY[]
[Export Table]
[Import Table]
[Resource Table]
...
Section table
IMAGE_SECTION_HEADER[0]
.
.
.
IMAGE_SECTION_HEADER[N]
Name
VirtualSize
VirtualAddress
SizeOfRawData
PointerToRawData
Characteristics
...
Section Images
SECTION[0]
.
.
.
SECTION[N]
Binary data of sections:
".text"
".data"
".idata"
".edata"
".reloc"
".rsrc"

دانلود PDF:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق باشید.

mahdi7s
29-06-2009, 13:06
ممنونم رفیق

Dolphin 7
08-01-2011, 17:19
لینکت کار نمی کنه [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

mahdi7s
10-01-2011, 16:31
با یک جستجوی ساده لینک پیدا می شود:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

-بیشتر:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

paradox(-_-)
19-05-2013, 12:54
ممنون :n02::n02::n02::n02::n02::n02::n02::n02::n02::n02: :n02: