• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

Asm4all

المشرفين القدامى
  • عدد المشاركات

    1,262
  • تاريخ الانضمام

  • تاريخ اخر زياره

كل شيء نشر بواسطة Asm4all

  1. السلام عليكم ورحمة الله وبركاته... واضح ان أي موضوع يتم فتحه حول الروبوت لا يستمر طويلا حتى يهجره اصحابه دون انجاز ولو البسيط. ولهم عزرهم فالموضوع خليط من العلوم المتشعبه بتخصصات مختلفه ولا تتوقف على المعرفه فقط بل تمتد الى التنفيذ والذي يتطلب بدوره تمويل كافي لتغطيه المشروع و تغطية الأخطاء العفويه التي تحدث أثناء التنفيذ. ونظرا لأن كل مرحله من مراحل تصنيع الروبوت لها المختصين بها , ونظرا لأن كل مره لا يكتمل المشروع بسبب التوقف عند المشاكل الميكانيكيه والمشاكل الفنيه من جهه , وعند الامور المتقدمه من جهه اخرى , و هذا قبل ان نبدأ العمل في أحد تخصصاتنا ألا وهي الالكترونيات والبرمجه وقبل أن نحصل على أي نتيجه مرضيه , لذلك فكرت في فكره تردم الهوه بين المتخصصين في الالكترونيات و المبرمجين المهتمين بعلم الروبوت وبين التطبيق شبه الواقعي لعملية تحكم آلي بالروبوت. ولناخذ مثل بسيط : تخيل انه في مختبرات تجري ابحاثا حول القنبله الزريه , فهل من المعقول تفجير عدة قنابل للحصول على نتائج تفيد الأبحاث ؟ بالطبع لا , هناك ما يسمى بالمحاكي , والذي يتم استخدامه لمحاكاة عملية التفجير ويعطي النتائج المتوقعه له ويتم التغيير في عمليات التفاعل حسب رغبة الباحثين دون اي تكلفه أو عناء. فالموضوع لن يخرج عن إطار الكمبيوتر. مثال آخر : هل من المنطقي أن يتم تدريب طيار لأول مره على طائره حقيقيه خاصة لو كانت حربيه وسيتم تدريبه على المناورات العسكريه , فهل من المعقول أن يراقبوا رد الفعل عند الطيار لأول مره على طائره حقيقيه , ألن تكون مكلفه ؟ بالطبع يستخدم المحاكي ليحاكي نظام طائره بالكامل وهي عباره عن غرفه تشبه من الداخل طائره حقيقيه وتحاكيها تماما.. وللعلم محاكي الطائره أغلى من الطائره نفسها نظرا لتوفير الأمن أثناء الاختبارات وتوفير الوقت وتوفير التكلفه أيضا ( أفضل من أن تسقط طائره بمن فيها ) اظن اتضح ما اقصده , أقصد بناء محاكي للروبوت افضل ( على الأقل بالنسبه لنا ) من انتظار بناء الروبوت الموعود . بعد بناء هذا المحاكي والذي لا يتكلف أي شيء سوى ما تملكه بالفعل ( جهاز كمبيوتر ) ولا يحتاج منك بعد هذا سوى عقل ( كل منا يملك واحد وهذا يكفي ) , يمكننا كتابة برامج التحكم في الروبوت واختبار نتائجها على المحاكي والحصول على أفضل النتائج دون أي تكلفه تذكر وقبل بناء الروبوت الحقيقي و مواجهة مشاكله. ولكن يبقى أمامنا هدف وهو جعل المحاكي يمثل الواقع بصوره تقترب الى 100% وهذا لضمان أن النتائج صحيحه وتمثل الواقع. فهل هناك من يرى نفس التوجه أو يقترب منه وله تعليق ؟ أعتقد أن البدا في مثل هذا المشروع لن يحتاج كثيرا من الوقت لنحصل على نتائج , فكما درسنا في الرياضيات أقرب طريق بين نقطتين هو الخط المستقيم اتضح أن اقرب طريقه للحصول على نتيجه هو طريق البرمجه , يمكنك أن تبدأ مشروع صباحا لتنته منه قبل النوم. نتابع ان شاء الله فكرة محاكاة الروبوت على الكمبيوتر
  2. السلام عليكم ورحمة الله وبركاته لي زمن طويل لم ادخل المنتدى سوى مرات معدوده, منذ هذه المشاركة لم اشارك بشيء يذكر نظرا لانشغالي كوال الوقت سنة التخرج يليها الجيش يليها خطبة وعمل يليها زواج يليها طفل والحمد لله بالمناسبة عقيقة عمر ابني يوم الاربع القادم ان شاء الله , وادعو القادرين على الحضور للمنزل نعود مره اخرى الى الموضوع, كنت اتمنى ان احضر هذا النقاش, خاصة انني في فترة ما قبل الجيش عكفت على حل مشكلة اللغة العربية و انتهيت من حلها اثناء الجيش (لولى هذا المشروع كان زماني ناسي البرمجه كلها بسبب الجيش) تعلمت الكثير من هذا المشروع لو يوجد من يهتم لاستكمال المناقشة للاستمتاع بالبرمجه !!! السلام عليكم
  3. طبعا بم أن القسم هنا من أقل الأقسام عدد في الزوار والأسئله , والمشاريع أيضا . فكرت في تقليصهم لدرجه غلق القسم أمزح فقط ولكن بم أن الأسئله في الغالب تدور حول الأساسيات , وتتكرر المواضيع فيها , رايت تثبيت موضوع يحتوي على معظم هذه المعلومات الأساسيه والتي تخفى على البعض وتسبب كثرة المواضيع التي تناقش نفس الشيء الموضوع ان شاء الله متجدد , وسوف يحتوي على مصادر المعلومات لو هي من خارج النتدى ( في الغالب هي من الخارج ) المصادر : 1 - هنا عربي (رائع للمبتدئين والمتقدمين في المستوى) 2 - هنا أجنبي 3 - هنا عربي (به بعض المعلومات لا بأس بها) 4 - موقع نورة الله يرحمه 5 - هنا أجنبي 6 - هنا أجنبي 7 - هنا أجنبي 8 - هنا أجنبي (ممتاز) 9 - هنا أجنبي (يحتوي على كتب مجانيه) 10 - هنا أجنبي (منافذ الحاسب) 11 - هنا أجنبي 12 - هنا أجنبي 13 - هنا عربي 14 - هنا أجنبي (جنة المبرمجين - هنا من أجل أدوات الأسمبلي للمتحكمات - خساره انه يتفوت يا جماعه) 15 - هنا عربي أختار لكم من بينها الدروس الآتيه : الميكروكنترولر من عائلة PIC المصدر الأول , المصدر الثاني , المصدر الثالث الميكروكنترولر من عائلة ATMEL مصدر دعائي بعض الشيء,عائلة 8051 , AVR, منتجات الشركه وادواتها وأمثله FPGA المصدر الأول , المصدر الثاني - بعض الأمثله مع الشرح ,VHDL-Tutorial للتحميل : اضغط كليك يمين ثم حفظ الهدف كـ The FPGA Tour Architecture of FPGAs and CPLDs: A Tutorial كتب إضافية في الـ VHDL رجاء : إذا كان هناك طلبات لأي شرح أو معلومات عن موضوع معين كتابتها هنا لجمع كل المعلومات وحصرها في مكان واحد يسهل البحث فيه
  4. بسم الله الرحمن الرحيم سيتم ان شاء الله إضافة الدروس التي يتم طرحها في القسم ليسهل الحصول عليها في أي وقت بسم الله نبدأ .. دروس في نظم الأعداد الكاتب smart_fox لماذا يجب علينا تعلم الميكروكنترولر؟ - شرح لاهمية الميكروكنترولر الكاتب عماد الخليل شرح تفصيلي للميكروكنترولر - عائلة PIC16F876A من انتاج MicroChip الكاتب smart_fox تعلم برمجة الميكروكنترولر من الصفر الكاتب mohamad1977 كيفية استخدام ال ADC و توصيله مع المايكروكنترولر الكاتب akrumooz
  5. سبحان الله, هل كلمة استفاده باتت تعني سرقه ؟ مجمل كلامك يوحي بوجود فتوى بتحريم الاستفاده من افكار مشاريع ناجحه!! هل لديك دليل يا اخي ؟ " البينة على من ادعى " يا أخي لا اعرف منطق احدثك به فمثل هذه الكلمات تخرج من رجال لديهم لبس في المسميات والمفاهيم , وهؤلاء لا يستقيم معهم المنطق ولا الحجه لهذا فالمطلوب منك اثبات حرمانية الاستفاده من افكار المشاريع لا ان نثبت نحن العكس, فالأصل في الاشياء الحل ما لم يرد نص بتحريمها وللافاده توجد بعض افكار المشاريع في معهد التقنية الاسرائيلي تستحق البحث وربما اعجبت شخص ما واختار احد هذه المشاريع ليقوم بتنفيذه http://visl.technion.ac.il/projects_newoffered.htm http://www.ee.technion.ac.il/vlsi/ وكل عام وانتم بخير
  6. محتويات هذا الموضوع قابله للتحديث , حسب الظروف كما وعدت أعضاء المنتدى , تم رفع لقطة فيديو لبعض المشاهد من مباريات مسابقة روبوكون مصر 2005 ,على هذا الرابط . الملف مساحته 35.8 ميجا , لهذا سأقوم بعرض بعض الصور لمن لا يستطيع تحميل الملف هنا هذه الصور لتجميع روبوت لمسابقة عام 2002 يتبع .....
  7. LEFT TO RIGHT X^2 = Y^2 (1) X =/= Y (2) X = -Y sum(X) = sum(Y) (3) sum(-Y) = sum(Y) sum(X) = sum(Y) = 0 X = {-1 -2 -3 -4 -5 -6 -7 -8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 -25 -26 -27 -28 -29 -30 -31 -32} Y = {1 2 3 4 5 6 7 8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 25 26 27 28 29 30 31 32}
  8. استخدم المكتبات القياسية للسي++ مثلا يمكنك استخدام الكلاس vector بهذا الشكل #include <iostream> #include <vector> using namespace std; int main() { vector<int> V; cout << "size = " << V.size() << endl; // size of vector for (int i = 0; i < 15; i++) V.push_back(i*i); for(int i= 0; i < V.size(); ++i) cout << V[i] << " "; cout << endl; cout << "size = " << V.size() << endl; // size of vector return 0; } http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html
  9. SHR and SHL

    ربما تقصد الرقم 2 لأن عملية الازاحة تتم على مستوى البت , يعني بالنظام الثنائي وليس العشري مثال الرقم 00101100 = 44 ازاحته لليمين تعادل القسمة على 2 00010110 = 22 ازاحته لليسار تعادل الضرب في 2 01011000 = 88
  10. السلام عليكم ورحمة الله وبركاته من مجمل كلامك واضح انك تعطي للعلم قدرا واهمية فلا يمكنني استنباط انك تتجاهل العلم او ادعي انك تقول ان الصناعة يمكن ان تقوم بدون علم مع وجود جمل شاذة في كلامك توحي هذا ,ولكن - ما علينا - لن أدعي هذا كذلك يمكن ان تقرأ مشاركتي مره اخرى ليتضح لك بمنتهى السهولة انني اعطي للعلم أولوية مطلقة على الصناعة وأقول بالحرف الواحد العلم أولا ثم تأتي الصناعة ولكن لا يمكنك الادعاء أنني من دعاة اختراع العجلة واكتشاف الجاذبية الارضية واختراع المصباح مثلا (هل كلامي مفهوم) مره اخرى لا اعرف مقصدك من تعليقك على اهتمامي بالعلم بـ "حمية الجاهلية" عجبا !!! نعود لأهمية العلم , وشكرا لك على المثال الحي الذي اتيت به كدولة صناعية غزت العالم كله بصناعتها و و و ... عظيم, عظيم جدا ..... لكنك لم تشر الى المستوى العلمي في الصين !!! ولم تشر الى المستوى العلمي في اليابان , ولا امريكا ولا اي دولة من الدول الصناعية ولا حتى اسرائيل, بل لم تشر الى الهند الفقيرة!! ليس مصادفة ابدا ان تكون الدول الرائدة في الصناعة هي هي الرائدة في العلم والانفاق على البحث العلمي, وليس من الغريب مطلقا ان نلاحظ ان سبب تقدم الامم هو تقدمها العلمي وسبب تخلف الامم هو التخلف العلمي وليس غريب ابدا ولا يوجد اي داعي للضجر من عدم وجود صناعة (اقصد على مستوى الدول) في الدول العربية فهذا مرتبط ارتباط وثيق للغاية بما تنفقه الدول العربية في مجال البحث العلمي, كعلامه واضحه على عدم الاهتمام بالعلم في هذه الدول ,والنتيجه واضحه ,ولا اريد ان أدلل عليها ,فواقعنا التعس يعبر عنها اقرأ في تقرير اليونيسكو لسنة 2004 , عن معدلات الانفاق على البحث العلمي في دول العالم وفي نفس التقرير اقرأ تقسيم الدول من حيث السيادة ولاحظ الارتباط بين كليهما الدول العربية (مجتمعة) يا اخي تنفق على البحث العلمي 0.2% من اجمالي الدخل القومي على البحث العلمي حوالي 1.7 مليار دولار المعدل العالمي للدول القوية (المحترمه) 3% من الدخل القومي في المقابل, اسرائيل بتنفق 4.7% من الدخل القومي على العلم يعني اسرائيل بتهتم بالعلم 23.5 المقادر اللي العالم العربي بيهتم بيه ملحوظة : دي اعلى نسبة في العالم في الانفاق على العلم طيب وده بيساوي كام بالارقام ؟؟ اسرائيل بتنفق 6.1 مليار دولار , العالم العربي كله بيصرف 1.7 مليار دولار على العلم سنويا امريكا بتصرف 2.7% من الدخل القومي على العلم لكن دي امريكا , اقتصادها حكايه لوحده بالارقام يا سيدي , امريكا بتصرف 295 مليار دولار سنويا على العلم بيمثل 35% من الانفاق في العلم على مستوى العالم وبكده نعرف بقى ليه امريكا وصلت للي هي فيه, ليه امريكا في العراق, ليه امريكا الدولة رقم واحد في العالم!! عشان الناس بتهتم بالعلم واحنا نايمين في العسل وبنقول بلاش نخترع العجلة, مهو يا نخترع من بكره الصبح يا بلاها علم واقلبوا حرفيين , العلم له اهله والصناعه ليها اهلها , وبرضه الجهل له اهله , ومفيش واحد بيسيب اهله ويمشي عدد الباحثين: العالم العربي : لكل مليون عربي يوجد 136 باحث اسرائيل :لكل مليون يهودي يوجد 1395 باحث امريكا : 4374 باحث لكل مليون مواطن اليابان : 5000 باحث لكل مليون مواطن اعتقد اتضحت الصورة واتضحت علاقة العلم ببناء الامم واتضح ايضا ان "الامم كلها بتهتم بالعلم اولا ثم يأتي التطبيق" كلام صحيح!! طبعا تعرف اول ايات نزلت على رسول الله صلى الله عليه وسلم من القرءان الكريم "إقرأ بسم ربك الذي خلق, خلق الانسان من علق, إقرأ وربك الاكرم, الذي علم بالقلم, علم الإنسان ما لم يعلم" ليس مصادفة ابدا - تعالى الله - ان تكون اول خمس آيات في كتاب الله تهتم بالعلم و طريقه هذا الاهتمام ولا عجب ايضا في هذا التوجيه النبوي الشريف "فضل العالم على العابد كفضلي على ادناكم" لاحظ فضل العالم ليس على الجاهل او الفاسق, بل الافضليه تفوق افضلية العابد وليس الفرق بيسير , بل كفضل رسول الله صلى الله عليه وسلم ليس على اتقاقم اول اشرفكم بل انظر الى الفرق البعيد للغاية والبلاغة في الحديث الشريف اظن اتضح من اين اتيت بهذا الكلام , واتضحت صحته ايضا بالمناسبة الصين اللي واضح من كلامك انها دولة تطبيقية ليست مهتمة بالعلم بالقدر الذي يدعوا الى اهتمامنا بالعلم اقرأ هذا الرابط ولو اردت المزيد يوجد و السلام عليكم
  11. السلام عليكم ورحمة الله وبركاته هذا ,ما أعجبني في كلامك العلم وبناء الامم بعدما تستفيد من السلسلة ربما تغير رايك, لتعرف قيمة العلم وتعرف أولويته على غيره بعدها يمكنني التعليق على مشاركتك
  12. السلام عليكم ورحمة الله وبركاته كل عام وانتم بخير بالعلم والمال يبني الناس ملكهم ... لم يبن ملك على جهل وإقلال مش كفاية, تمويل و ودراسة جدوى و و و العلم أولا شركات الصناعات الاكترونية موجودة على الاقل اعرف انها موجوده في مصر منها شركات مصرية ومنها فروع لشركات اجنبية ومنها متعددة الجنسيات , لكن مفيش اهتمام بالعلم في بلادنا , حتى اللي عنده حمية وعايز يبني ويعمر بيفكر في اتجاه معوج الامم كلها بتهتم بالعلم اولا ثم يأتي التطبيق , احنا مستعجلين قوي , عايزين تطبيق في اسرع وقت ممكن , ناسيين اننا لو فتحنا المصانع ومش عندنا العلم حنحتاج نجيب العلماء من بره عشان نشغل المصانع , وهنا تبقى المصيبة التقيلة الامه كلها تبقى صنايعية والغرب يبقوا العلماء اخي لو متحمس جدا لانشاء مصنع في بلدك ابدأ صح, ابدأ بانشاء مركز أبحاث يوفر العلم المطلوب لتشغيل المصنع , بعدها لو معاك المال الكافي لفتح المصنع يبقى تفتحه وانت مطمئن , ولو مش معاك يبقى غيرك لما يجي يفتح المصنع بعدك حيلاقي العلم اللي محتاجه , وبكده حيخرج انتاج أخي عماد الخليل كيف حالك :)
  13. عندي مشكلة في Windows.h

    #include <windows.h> نسيت <>
  14. وعليكم السلام ورحمة الله وبركاته تحتاج لمعرفة مسبقة بالـ logic circuits combinational circuits sequential circuits بعدهم ممكن تفهم الميكروكنترولر بسهولة
  15. لو وصلت الوصلة بهذا الشكل فلن يفصل الجهاز الا بانقطاع التيار الكهربي , وعند عودة التيار الكهربي يعمل الجهاز مره ثانية (باختصار زي الراديو مثلا) لأن هذه الوصله هي ما تقوم بها اللوحة الام داخليا لتشغيل مزود الطاقة
  16. 5 - باستخدام قطعة السلك التي احضرتها , وصل السلك الاخضر باي سلك اسود في هذه المجموعة تجربة اخلع فيشة الجهاز وركبها مره تانيه المشاهدة الجهاز يعمل بمجرد عودة الطاقة مره ثانية النتيجة الجهاز يعمل دائما ملحوظة: عندي جهازي القديم له سنوات يعمل بهذه الطريقه لأن مفتاح التشغيل لا يعمل :D
  17. motion detection

    http://en.wikipedia.org/wiki/YIQ From RGB to YIQ: Y = 0.299 R + 0.587 G + 0.114 B I = 0.5957 R − 0.2744 G − 0.3212 B Q = 0.2114 R − 0.5226 G + 0.3111 B From YIQ to RGB: R = Y + 0.9563 I + 0.6210 Q G = Y − 0.2721 I − 0.6473 Q B = Y − 1.1070 I + 1.7046 Q
  18. motion detection

    هو كده بالضبط بتحول من RGB لـ YIQ حيث Y هو الـ luminance و I,Q هما الـ chrominance راقب التغير في الـ chrominance فقط
  19. المؤقت في الميكروكنترولر بيكون هاردوير , يعني عملية الزيادة بتتم تلقائيا مع كل نبضة ( حسب الـ Prescaler) , ولا تحتاج لزيادة المؤقت من خلال الكود , والا فما الفائدة منه اصلا
  20. السلام عليكم ورحمة الله وبركاته.. من مده ليست قصيرة كتبت جزئ من برنامج يقوم بهذه الوظيفة على ميكروكنترولر من نوع Atmel , ولكن للأسف ضاع الكود مع اخوته ولكن الفكرة بسيطة , اوضحها بهذا الكود الوهمي : pseudocode : WAIT UNTIL INPUT = 0 WAIT UNTIL INPUT = 1 NOW YOU HAVE RISE EDGE SO.. SET TIMER = 0 WAIT UNTIL INPUT = 0 YOU HAVE FALL EDGE SO.. WAIT UNTIL INPUT = 1 YOU HAVE RISE EDGE AGAIN SO .. YOU HAVE FULL CLOCK PERIOD OUTPUT THE CURRENT VALUE OF TIMER للتوضيح اكثر للمعنى يمكن كتابة الفكرة في لغى السي بهذا الشكل while(input == 1); while(input == 0); // YOU HAVE RISE EDGE timer = 0; while(input == 1); while(input == 0); // YOU HAVE RISE EDGE output = timer; وبالنسبة للميكرو من نوع PIC يمكن كتابتها بهذا الشكل ....; setup internal timer WAIT0 BTFSC PORTB, 0 GOTO WAIT0; loop until portb(0) = 0 ; portb(0) = 0 WAIT1 BTFSS PORTB, 0 GOTO WAIT1; loop until portb(0) = 1 ; portb(0) = 1 == rising_edge ....; set timer = 0 WAIT2 BTFSC PORTB, 0 GOTO WAIT2; loop until portb(0) = 0 ; portb(0) = 0 == falling_edge WAIT3 BTFSS PORTB, 0 GOTO WAIT2; loop until portb(0) = 1 ; portb(0) = 1 == rising_edge ; you have full clock time in the timer ....; use the value of the timer now ولحساب زمن النبضة تضرب قيمة المؤقت في زمن نبضة الميكرو (1us) يعطيك زمن النبضة كاملة ولكن توجد ملاحظة , أذكر ان مؤقت الـ PIC كان 8 بيت فقط , بينما مؤقت الـ Atmel كان 16 بيت مم يعني أن اكبر قيمة للمؤقت في الـ PIC هي 255 بينما في Atmel هي 65535 عموما يمكن حلها في مقاطعة المؤقت نفسه اي حلها في الكود باستخدام متغير يعد اكتمال المؤقت .... طبعا تحتاج لمعرفتك بكيفية التعامل مع المؤقت في الميكرو
  21. 1 - VHDL Programming by Example2 - The VHDL Cook book يلا شدوا حيلكم لو عايزين تتعلموا بجد
  22. إصطياد دوال الـ Native API والتحكم في إنشاء عملية جديدة مقدمة: مؤخراً رأيت برنامج أمني رائع, إسمه Sanctuary , هذا المنتج يقوم بمنع تنفيذ أي برنامج لا يظهر في قائمته الخاصة بالبرامج القابلة للتنفيذ والنتيجة , مستخدم الكمبيوتر محمي من أي various add-on spyware, worms and trojans , حتى لو وجدت بعض الـ malware طريقها للحاسوب , فلا يوجد عندها فرصة للتنفيذ, و من هنا لا توجد لها فرصة لإلحاق أي تدمير بالحاسوب. بكل تأكيد وجدت أن هذه الميزة ممتعة , وبعد قليل من التفكير , خرجت بطريقتي في إنجاز هذه الوظيفة. لذلك, هذه المقالة توضح كيف يمكن برمجياً مراقبة عملية process creation والتحكم فيها وذلك على مستوى النظام ككل و باستخدام مفهوم اصطياد Hook دوال الـ Native API. هذه المقالة تفترض افتراض مهم وهو أن الـ process المراد مراقبتها والتحكم بها target process تم إنشائها عن طريق الـ user-mode code أي في مستوى المستخدم باحد الطرق (shell functions, CreateProcess(), manual process creation as a sequence of native API calls, etc) على الرغم من أنه, نظرياً , يمكن إنشاء process في مستوى النظام kernel-mode code , ومع وجود هذا الإحتمال و لسبب عملي يمكن تجاهل مثل هذه المشكلة , فلا تقلق من هذه الطريقة , و لكن لماذا ؟؟؟ لنفكر بطريقة منطقية, لتشغيل عملية process في مستوى النظام kernel-mode code , نحتاج أولاً إلى تحميل driver والتي تتضمن في عملها تنفيذ بعض الخطوات في مستوى المستخدم user-mode code . ولهذا لكي نعيق تشغيل البرامج الغير مخولة بالتشغيل يمكننا بكل أمان التحكم في العمليات التي يتم انشائها على مستوى المستخدم فقط. بسم الله نبدأ ... توضيح استراتيجية العمل: مبدئيا , دعونا نحدد ما هو المطلوب فعله تماما لنقوم بمراقبة والتحكم في إنشاء عملية process creation on a system-wide basis إنشاء عملية للتنفيذ أمر معقد بحق , حيث أنها تشمل الكثير من الوظائف (إذا لم تصدقني, يمكنك عمل disassemble للدالة CreateProcess , وسوف ترى ما اتحدث عنه بعينيك), لنقوم ببدأ عملية جديدة لابد من المرور بهذه الخطوات وبهذا الترتيب: 1 - Executable file has to be opened for FILE_EXECUTE access. يتم فتح الملف بغرض التنفيذ FILE_EXECUTE 2 - Executable image has to be loaded into RAM. يتم تحميل نسخة من الملف التنفيذي في الذاكرة 3 - Process Executive Object (EPROCESS, KPROCESS and PEB structures) has to be set up. يتم إعداد متطلبات التنفيذ , مثل جدول مكتبات الربط المطلوبة والدوال الخارجية و ... 4 - Address space for the newly created process has to be allocated. تخصيص مساحة من الذاكرة للـ process الجديدة 5 - Thread Executive Object for the primary thread of the process (ETHREAD, KTHREAD and TEB structures) has to be set up. ألإعداد للـ Thread الرئيسية في الـ process 6 - Stack for the primary thread has to be allocated. تخصيص مساحة من الذاكرة كمكدس للـثريد الرئيسية في الـ process 7 - Execution context for the primary thread of the process has to be set up. إعداد سياق التنفيذ للثريد الرئيسية 8 - Win32 subsystem has to be informed about the new process إخبار النظام ببيانات الـ process الجديدة لنجاح أي خطوة من هذه الخطوات يشترط نجاح الخطوات السابقة لها (لا يمكنك مثلا تنفيذ الخطوة رقم 3 دون نجاح الخطوة رقم 2 , ولا يمكنك تنفيذ الخطوة رقم 2 دون نجاح الخطوة رقم 1, وهكذا..) لذلك, لو قررنا التخلي عن خطوة من هذه الخطوات, فكل الخطوات التابعة لها سوف تفشل, ومنه عملية تنفيذ الملف التنفيذي لن تنجح. مفهوم طبعا أن كل خطوة من هذه الخطوات يتم تنفيذها عن طريق استدعاء دالة من دوال الـ Native API , لذلك , لكي نستطيع التحكم في انشاء process جديدة, فكل ما نحتاج فعله هو عمل hook على هذه الدوال التي لا يمكن تجنب تنفيذها في كود يقوم بإنشاء prcess جديدة ولكن أي الدوال يجب عمل hook لها ؟ على الرغم من ان الدالة NtCreateProcess تبدوا وكأنها الاجابة الأكثر مناسبة لهذا السؤال, إلا أن هذه الإجابة تعتبر خاطئة - يمكن إنشاء process جديدة دون استدعاء هذه الدالة. على سبيل المثال CreateProcess تقوم بإعداد process-related kernel-mode structures دون استدعاء NtCreateProcess.لهذا عمل Hook للدالة NtCreateProcess وحدها لا يجدي. لمراقبة إنشاء process جديدة, يجب عمل hook للدالة NtCreateFile و الدالة NtOpenFile أو عمل hook للدالة NtCreateSection. بكل تأكيد لا توجد طريقة لتشغيل أي برنامج بدون استدعاء هذه الدوال. لو قررنا عمل hook على دوال فتح الملفات NtCreateFile و NtOpenFile يجب إضافة خطوات للتمييز بين فتح ملف تنفيذي و فتح ملف عادي بغرض عمليات الإدخال والإخراج, وهذه العملية ليست بهذه السهولة دائما, على سبيل المثال ماذا نفعل لو تم فتح ملف تنفيذي بغرض FILE_ALL_ACCESS ؟؟؟ هل هي مجرد عملية قرائة وكتابة من ملف أم إنها مرحلة من مراحل انشاء process جديدة ؟؟ من الصعب الحكم على مثل هذه الحالة, حيث أننا يجب أن نتابع ما هي الخطوة التالية لفتح الملف. ولهذا عمل hook على دوال فتح الملف NtCreateFile و NtOpenFile لا يعتبر الخيار الأمثل. عمل Hook على الدالة NtCreateSection يعتبر الأكثر مناسبة في هذه العملية, فلو قمنا باعتراض استدعاء الدالة NtCreateSection عند الطلب بتحميل الملف التنفيذي كنسخة بهذه الخاصية SEC_IMAGE مع طلب حماية المنطقة المخصصة في الذاكرة للسماح بالتنفيذ , يمكننا التأكد بأن هناك process سوف يتم تنفيذها, في هذه اللحظة لدينا الخيار لنقوم باتخاذ أي قرار مناسب , وفي حالة لو أردنا منع إنشاء هذه الـ process نجعل الدالة NtCreateSection تعيد القيمة STATUS_ACCESS_DENIE. و لهذا للحصول على تحكم تام في إنشاء process جديد كل ما علينا هو عمل hook على الدالة NtCreateSection. تصريح الدالة : NTSYSAPI NTSTATUS NTAPI NtCreateSection(    PHANDLE             SectionHandle, /*[OUT]*/    ULONG                DesiredAccess, /*[IN] SECTION_MAP_EXECUTE or SECTION_ALL_ACCESS*/    POBJECT_ATTRIBUTES   ObjectAttributes, /*[IN] OPTIONAL*/    PLARGE_INTEGER       MaximumSize, /*[IN] OPTIONAL*/    ULONG                PageAttributess, /*[IN] PAGE_EXECUTE or PAGE_EXECUTE_READ or PAGE_EXECUTE_READWRITE or PAGE_EXECUTE_WRITECOPY*/    ULONG                SectionAttributes, /*[IN] SEC_IMAGE*/    HANDLE               FileHandle); /*[IN] OPTIONAL*/ مثل أي دالة من دوال ntdll.dll تقوم الـدالة NtCreateSection بتحميل السجل EAX برقم الخدمة , وجعل EDX يشير الى باراميترات الدالة , ونقل التحكم الى KiDispatchService و الأخيرة من kernel-mode routine ( يتم هذا عن طريق المقاطعة INT 0x2E في كل من ويندوز NTأو 2000 أو عن طريق التعليمة SYSENTER في ويندوز XP). بعد التحقق من باراميترات الدالة , تقوم الدالة KiDispatchService بنقل التحكم الى التمثيل الحقيقي للوظيفة داخل نواة النظام , عنوان هذه المنطقة يكون متاح في Service Descriptor Table مؤشر هذا الجدول يتم استيراده عن طريق ntoskrnl.exe كـ KeServiceDescriptorTable , لهذا فهي متاحة لسواقات الـ kernel-mode (لذلك نحتاج لبناء درايفر) تتمثل الـ Service Descriptor Table بهذا الشكل struct SYS_SERVICE_TABLE {    void **ServiceTable;    unsigned long CounterTable;    unsigned long ServiceLimit;    void **ArgumentsTable; }; المؤشر ServiceTable في هذا الهيكل يشير الى مصفوفة تحمل عناوين الدوال التي تمثل خدمات النظام system services. لذلك كل ما علينا فعله لعمل hook على أحد دوال الـ Native API هو كتابة عنوان دالتنا الخاصة في مكان عنوان الدالة التي نريد عمل hook عليها وليكن ترتيبها i , نقوم بوضع العنوان في ServiceTable في الخانة رقم i في الـ KeServiceDescriptorTable. الى الان يبدوا لنا معرفة كل ما نحتاجه لتنفيذ هذه العملية, دعونا نبدا في العمل الفعلي.... التحكم في إنشاء process جديدة: الحل يتلخص في بناء درايفر a kernel-mode driver و برنامج user-mode application. طريقة العمل: للبدأ في عملية المراقبة يقوم البرنامج بتمرير (رقم الوظيفة the service index والذي يمثل الدالة NtCreateSection , إضافة إلى عنوان الـ exchange buffer مكان تبادل البيانات بين البرنامج والدرايفر) الى الـ driver , ويتم هذا عن طريق هذا الكود: //open device device=CreateFile("\\\\.\\PROTECTOR",GENERIC_READ|GENERIC_WRITE,       0,0,OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM,0); // get index of NtCreateSection, and pass it to the driver, along with the //address of output buffer DWORD * addr=(DWORD *)   (1+(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),                                     "NtCreateSection")); ZeroMemory(outputbuff,256); controlbuff[0]=addr[0]; controlbuff[1]=(DWORD)&outputbuff[0]; DeviceIoControl(device,1000,controlbuff,256,controlbuff,256,&dw,0); الكود تقريبا يشرح نفسه, الشيء الوحيد الذي يستحق الاهتمام هي الطريقة التي نحصل بها عن رقم الخدمة المناظرة للدالة NtCreateSection جميع الوظائف داخل ntdll.dll تبدأ بالتعليمة MOV EAX, ServiceIndex وهي تعليمة تتمثل في 5 بايت , حيث mov eax - opcode - يتمثل في 1 بايت (الأول), والـ service index يتمثل في 4 بايت (الباقي) , ولذلك كل ما علينا هو قرائة 4 بايت من ثاني بايت في الدالة NtCreateSection لنحصل على قيمة ServiceIndex والآن لنرى ماذا يفعل الـدرايفر الخاص بنا عند استلامه IOCTL من برنامجنا : NTSTATUS DrvDispatch(IN PDEVICE_OBJECT device,IN PIRP Irp) {    UCHAR*buff=0; ULONG a,base;    PIO_STACK_LOCATION loc=IoGetCurrentIrpStackLocation(Irp);    if(loc->Parameters.DeviceIoControl.IoControlCode==1000)    {        buff=(UCHAR*)Irp->AssociatedIrp.SystemBuffer;                // hook service dispatch table        memmove(&Index,buff,4);        a=4*Index+(ULONG)KeServiceDescriptorTable->ServiceTable;        base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a),4,0);        a=(ULONG)&Proxy;                _asm        {            mov eax,base            mov ebx,dword ptr[eax]            mov RealCallee,ebx            mov ebx,a            mov dword ptr[eax],ebx        }                MmUnmapIoSpace(base,4);                memmove(&a,&buff[4],4);        output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);    }    Irp->IoStatus.Status=0;    IoCompleteRequest(Irp,IO_NO_INCREMENT);    return 0; } كما يتضح هنا , لا يوجد شيء خاص بالاهتمام , قمنا فقط بتخطيط الـ exchange buffer في مساحة عناوين النواة عن طريق الدالة MmMapIoSpace , إضافة إلى كتابة عنوان الدالة البديلة our proxy function إلى الـ Service Table (ملحوظة : نقوم أولاً بحفظ عنوان الدالة الأصلية لكي يتم استخدامها لاحقاً في المتغير العام RealCallee ). لكي نتمكن من إعادة الكتابة على الـ Service Table نقوم بتخطيط المكان المستهدف بالدالة MmMapIoSpace. لماذا ؟ لدينا بالفعل الصلاحية للتعامل مع الـ Service Table , أليس كذلك ؟ المشكلة تكمن في أنه يمكن للـ Service Table أن تتواجد في منطقة من الذاكرة مخصصة للقرائة فقط, ولهذا يجب التأكد أن لدينا الصلاحية للكتابة في الذاكرة الخاصة بالـ Service Table , وإذا لم تكن لدينا هذه الصلاحية فإنه يتحتم علينا تغيير الحماية على هذه المنطقة من الذاكرة ليتم السماح لنا بالكتابة عليها, مجهود كبير أليس كذلك ؟ ولهذا فإننا سنقوم فقط بتخطيط الذاكرة عن طريق MmMapIoSpace , ولهذا لا توجد مشاكل لدينا من ناحية الحماية يمكننا الكتابة في أي وقت نريد في هذه المنطقة من الآن فصاعدا والآن دعونا نلقي نظرة عن الـدالة البديلة أو ما تعرف بــ our proxy function : //this function decides whether we should //allow NtCreateSection() call to be successfull ULONG __stdcall check(PULONG arg) {    HANDLE hand=0;PFILE_OBJECT file=0;    POBJECT_HANDLE_INFORMATION info;ULONG a;char*buff;    ANSI_STRING str; LARGE_INTEGER li;li.QuadPart=-10000;    //check the flags. If PAGE_EXECUTE access to the section is not requested,    //it does not make sense to be bothered about it    if((arg[4]&0xf0)==0)return 1;    if((arg[5]&0x01000000)==0)return 1;            //get the file name via the file handle    hand=(HANDLE)arg[6];    ObReferenceObjectByHandle(hand,0,0,KernelMode,&file,&info);    if(!file)return 1;    RtlUnicodeStringToAnsiString(&str,&file->FileName,1);        a=str.Length;buff=str.Buffer;    while(1)    {        if(buff[a]=='.'){a++;break;}        a--;    }    ObDereferenceObject(file);        //if it is not executable, it does not make sense to be bothered about it    //return 1    if(_stricmp(&buff[a],"exe")){RtlFreeAnsiString(&str);return 1;}        //now we are going to ask user's opinion.    //Write file name to the buffer, and wait until    //the user indicates the response    //(1 as a first DWORD means we can proceed)        //synchronize access to the buffer    KeWaitForSingleObject(&event,Executive,KernelMode,0,0);            // set first 2 DWORD of a buffer to zero,    // copy the string into the buffer, and loop    // until the user sets first DWORD to 1.    // The value of the second DWORD indicates user's    //response    strcpy(&output[8],buff);    RtlFreeAnsiString(&str);    a=1;    memmove(&output[0],&a,4);    while(1)    {        KeDelayExecutionThread(KernelMode,0,&li);        memmove(&a,&output[0],4);        if(!a)break;    }    memmove(&a,&output[4],4);    KeSetEvent(&event,0,0);        return a; } //just saves execution contect and calls check() _declspec(naked) Proxy() {    _asm{        //save execution contect and calls check()        //-the rest depends upon the value check() returns        // if it is 1, proceed to the actual callee.        //Otherwise,return STATUS_ACCESS_DENIED        pushfd        pushad        mov ebx,esp        add ebx,40        push ebx        call check        cmp eax,1        jne block                //proceed to the actual callee        popad        popfd        jmp RealCallee                //return STATUS_ACCESS_DENIED        block:popad        mov ebx, dword ptr[esp+8]        mov dword ptr[ebx],0        mov eax,0xC0000022L        popfd        ret 32    } } تقوم الدالة Proxy بـحفظ السجلات والأعلام, تقوم بتمرير مؤشر لـ service parameters للدالة check والخطوات التالية تعتمد على القيمة التي تعيدها الدالة check لو أعادت TRUE (أي اننا نريد تنفيذ البرنامج) , تقوم الدالة Proxy بإعادة قيم السجلات والأعلام واستدعاء الخدمة الأصلية NtCreateSection لو أعادت FALSE (أي اننا نعترض على تنفيذ البرنامج) , تقوم الدالة Proxy بتمرير القيمة STATUS_ACCESS_DENIED إلى EAX , استرجاع القيمة ESP والعودة من الخدمة - من وجهة نظر مستدعي الوظيفة NtCreateSection يبدوا وكأن الوظيفة فشلت و أعادت القيمة STATUS_ACCESS_DENIED . كيف تبني الدالة check قراراها ؟ بمجرد ما تتسلم الدالة check المؤشر للـ service parameters كبراميتر لها , يمكنها اختبار هذه الباراميترات أولا: تختبر الأعلام والخصائص - لو الـ Section المطلوبة لم يطلب تخطيطها كنسخة قابلة للتنفيذ , أو انها طلبت حماية تمنع التنفيذ في هذا الـ Section من الذاكرة , ومنه يمكننا التأكد أن الخدمة NtCreateSection لن تفعل شيء مع هذا الطلب , وفي هذه الحالة نقوم بتمرير القيمة TRUE مباشرة. ما عدا هذا , تقوم الدالة check باختبار امتداد الملف لأن الخاصية SEC_IMAGE و حماية الذاكرة بغرض التنفيذ يمكن طلبه لملفات الـ dll أيضا , لهذا لو كان امتداد الملف غير .exe تقوم الدالة check بإعادة القيمة TRUE في حالة ما يكون الملف التنفيذي بامتداد .exe فانها تعطي الفرصة للبرنامج في مستوى الـ user-mode باتخاذ القرار, ولهذا تقوم فقط بكتابة إسم الملف و مكانه على القرص في الـ exchange buffer , وتنتظر القرار من المستخدم لتمرره مره أخرى الى الـ Proxy Function قبل تشغيل الدرايفر الخاص بنا يقوم البرنامج الخاص بنا بانشاء ثريد يقوم بتشغيل هذه الدالة أولاً: void thread() {    DWORD a,x; char msgbuff[512];        while(1)    {        memmove(&a,&outputbuff[0],4);                //if nothing is there, Sleep() 10 ms and check again        if(!a){Sleep(10);continue;}                    // looks like our permission is asked. If the file        // in question is already in the white list,        // give a positive response        char*name=(char*)&outputbuff[8];        for(x=0;x<stringcount;x++)        {            if(!stricmp(name,strings[x])){a=1;goto skip;}        }            // ask user's permission to run the program        strcpy(msgbuff, "Do you want to run ");        strcat(msgbuff,&outputbuff[8]);                // if user's reply is positive, add the program to the white list        if(IDYES==MessageBox(0, msgbuff,"WARNING",           MB_YESNO|MB_ICONQUESTION|0x00200000L))        {a=1; strings[stringcount]=_strdup(name);stringcount++;}        else a=0;            // write response to the buffer, and driver will get it        skip:memmove(&outputbuff[4],&a,4);        //tell the driver to go ahead        a=0;        memmove(&outputbuff[0],&a,4);    } } الكود واضح , يقوم الثريد بقرائة الـ exchange buffer كل 10 ms , لو اكتشف أن الدرايفر صدر طلب للـ buffer , فإنه يقوم باختبار إسم الملف الممرر له ويختبر لو إسم الملف في القائمة المصرح لها بالتشغيل , لو كان ضمن القائمة فإنه يعطي OK للدرايفر ليسمح بتنفيذ العملية , وإلا فإنه يعطي رسالة تسأل المستخدم هل يسمح بتشغل هذا البرنامج أم لا , مع عرض إسم الملف ومكانه في الرسالة , لو الرد إيجابي نقوم بإضافة إسم البرنامج إلى القائمة المسموح بتشغيلها, أخيرا نمرر قرار المستخدم الى الدرايفر في جميع الأحوال بعد تشغيل برنامجنا , بكل تأكيد لا توجد طريقة لتشغيل أي عملية دون سؤال المستخدم بالسماح لها بذلك الخلاصة : في النهاية يجب أن اقول أن عملية الـ hook لدوال الـ native API واحدة من أهم تقنيات البرمجة الموجودة, هذه المقالة أعطتك فقط مثال لما يمكن إنجازه بهذه التقنية , كما ترى تمكنا من مراقبة و التحكم في تنفيذ البرامج التي لم نعطيعا صلاحية التشغيل , وهذا فقط بعمل hook على دالة واحدة فقط (!!!) من دوال الـ native API, يمكنك التوسع في هذا المجال الى حد بعيد والتحكم في العتاد بصورة كاملة , التحكم في عمليات القرائة والكتابة , التحكم في الشبكات ...الخ المقالة الأصلية كود المقالة , المالفات التنفيذية للتجربة
  23. تابع سلسلة شغل مخك ..... باستخدام لغتك المفضله - حل هذه المسأله : الأعداد الأوليه هي الأعداد التي تقبل القسمه على نفسها وعلى الواحد الصحيح فقط وهي المتتاليه 2,3,5,7,11,13,17,19,23,.... حيث الحد الأول من هذه المتتاليه قيمته (2) والحد الخامس قيمته (11) والحد التاسع قيمته (23) .. المطلوب : برنامج ندخل اليه ... أولا : رقم الحد ليعطي قيمته ثانيا : قيمة الحد ليعطي ترتيبه اذا كان عدد أولي مثال 1: ادخل رقم الحد : رقم الحد : 5 >>> قيمة الحد : 11 رقم الحد : 8 >>> قيمة الحد : 19 مثال 2: ادخل قيمة الحد : قيمة الحد : 11 >>> رقم الحد : 5 قيمة الحد : 19 >>> رقم الحد : 8 قيمة الحد : 25 >>> العدد غير اولي
  24. [ تمت الإجابة ]API - Hook

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