سؤال

لقد استخدمت مؤخرًا الكثير من لغة التجميع في أنظمة التشغيل *nix. كنت أتساءل عن مجال Windows.


اتفاقية الاتصال في Linux:

mov $SYS_Call_NUM, %eax
mov $param1 , %ebx
mov $param2 , %ecx
int $0x80

هذا هو. هذه هي الطريقة التي يجب أن نجري بها مكالمة نظام في Linux.

إشارة إلى جميع مكالمات النظام في Linux:

بخصوص أي $ sys_call_num وأي المعلمات يمكننا استخدام هذا المرجع: http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

المرجع الرسمي: http://kernel.org/doc/man-pages/online/dir_section_2.html


استدعاء الاتفاقية في Windows:

???

إشارة إلى جميع مكالمات النظام في Windows:

???

غير رسمي : http://www.metasploit.com/users/opcode/syscalls.html ، ولكن كيف يمكنني استخدامها في التجميع إلا إذا كنت أعرف اتفاقية الاتصال.

الرسمية : ؟؟؟

  • إذا قلت ، لم يثبت ذلك. ثم كيف سيقوم المرء بكتابة libc لنظام التشغيل Windows دون معرفة مكالمات النظام؟ كيف يمكن للمرء أن يفعل برمجة مجموعة Windows؟ على الأقل في برمجة السائق يحتاج المرء إلى معرفة ذلك. حق؟

الآن ، ما الأمر مع ما يسمى API الأصلي؟ هو Native API & System calls for windows كلاهما مصطلحات مختلفة تشير إلى نفس الشيء؟ من أجل تأكيد قارنت هذه من مصدرين غير رسميين

مكالمات النظام: http://www.metasploit.com/users/opcode/syscalls.html

API الأصلي: http://undocumented.ntinternals.net/aindex.html

ملاحظاتي:

  1. تبدأ جميع مكالمات النظام بالرسائل Nt حيث تتكون API الأصلي من الكثير من الوظائف التي لا تبدأ بالحروف Nt.
  2. System Call of windows هي مجموعة فرعية من Native API. مكالمات النظام هي مجرد جزء من API الأصلي.

هل يمكن لأي شخص أن يؤكد هذا وشرح.

تعديل:

كان هناك إجابة أخرى. كانت إجابة ثانية. لقد أحببت ذلك حقًا ولكني لا أعرف لماذا حذفه المجيب. أطلب منه إعادة نشر إجابته.

هل كانت مفيدة؟

المحلول

إذا كنت تقوم ببرمجة التجميع تحت Windows ، فلن تقوم بتقديم syscalls اليدوية. يمكنك استخدام NTDLL و API الأصلي للقيام بذلك نيابة عنك.

واجهة برمجة التطبيقات الأصلية هي ببساطة غلاف حول جانب kernelmode من الأشياء. كل ما يفعله هو أداء syscall لواجهة برمجة التطبيقات الصحيحة.

يجب ألا تحتاج أبدًا إلى syscall يدويًا ، لذا فإن سؤالك بالكامل زائد.

لا تتغير رموز Linux Syscall ، وينافذ ، ولهذا السبب تحتاج إلى العمل من خلال طبقة تجريد إضافية (AKA NTDLL).

تعديل:

أيضًا ، حتى لو كنت تعمل على مستوى التجميع ، فلا يزال بإمكانك الوصول الكامل إلى واجهة برمجة تطبيقات Win32 ، فلا يوجد سبب لاستخدام واجهة برمجة تطبيقات NT لتبدأ! الواردات ، الصادرات ، وما إلى ذلك جميعها تعمل بشكل جيد في برامج التجميع.

EDIT2:

إذا كنت ترغب حقًا في القيام بأشكال يدوي ، فستحتاج إلى عكس NTDLL لكل إصدار من Windows ذي صلة ، وإضافة اكتشاف الإصدار (عبر PEB) ، وإجراء بحث SYSCALL لكل مكالمة.

ومع ذلك ، سيكون ذلك سخيفا. NTDLL هناك لسبب ما.

لقد فعل الناس بالفعل الجزء العكسي: انظر https://j00ru.vexillium.org/syscalls/nt/64/ للحصول على جدول من أرقام مكالمة النظام لكل نواة Windows. (لاحظ أن الصفوف اللاحقة تتغير حتى بين إصدارات Windows 10.) مرة أخرى ، هذه فكرة سيئة خارج التجارب الشخصية فقط على الجهاز الخاص بك لمعرفة المزيد حول ASM و/أو Windows Internals. لا تقم بتضمين المكالمات في الكود الذي توزعه على أي شخص آخر.

نصائح أخرى

الشيء الآخر الذي تحتاج إلى معرفته حول اتفاقية Windows Syscall هو أنه كما أفهمها ، يتم إنشاء جداول Syscall كجزء من عملية الإنشاء. هذا يعني أنه يمكنهم ببساطة التغيير - لا أحد يتتبعهم. إذا أضاف شخص ما واحدة جديدة في الجزء العلوي من القائمة ، فلا يهم. لا يزال NTDLL يعمل ، لذلك لا يزال كل من يدعو NTDLL يعمل.

حتى الآلية المستخدمة لأداء syscalls (التي int ، أو sysenter) ليست ثابتة في الحجر وتغيرت في الماضي ، وأعتقد أنه مرة واحدة في وقت واحد يستخدم الإصدار ونوافذ dll مختلف التي استخدمت آليات دخول مختلفة اعتمادا على وحدة المعالجة المركزية في الجهاز.

يتم إجراء مكالمات نظام Windows عن طريق الاتصال بـ DLLs System مثل kernel32.dll أو gdi32.dll, ، والتي تتم مع المكالمات الفرعية العادية. آليات الاصطياد إلى الطبقة المميزة لنظام التشغيل غير موثقة ، لكن هذا جيد لأن DLLs مثل kernel32.dll افعل هذا من أجلك.

وبمكالمات النظام ، أشير إلى نقاط إدخال Windows API الموثقة مثل CreateProcess() أو GetWindowText(). ستستخدم برامج تشغيل الأجهزة عمومًا واجهة برمجة تطبيقات مختلفة من Windows DDK.

كنت مهتمًا بإجراء مكالمة API Windows في التجميع بدون واردات (كتمرين تعليمي) ، لذلك كتبت مجموعة Fasm التالية للقيام بما يفعله NTDLL! ntcreatefile. إنها مظاهرة تقريبية على نسختي التي تبلغ 64 بت من Windows (الإصدار 10.0.17134) ، وينتوقف بعد المكالمة ، لكن قيمة إرجاع Syscall هي صفر ، لذا فهي ناجحة. يتم إعداد كل شيء لكل اتفاقية استدعاء Windows X64 ، ثم يتم تحميل رقم استدعاء النظام في Rax ، ثم هو تعليمات مجموعة Syscall لتشغيل المكالمة. مثالي ينشئ الملف C: HelloWorldFile_Fasm ، لذلك يجب تشغيله "كمسؤول".

format PE64 GUI 4.0


entry start


section '.text' code readable executable


 start: 
 ;puting the first four parameters into the right registers

                            mov rcx, _Handle
                            mov rdx, [_access_mask]
                            mov r8, objectAttributes
                            mov r9, ioStatusBlock

 ;I think we need 1 stack word of padding:

                            push 0x0DF0AD8B


 ;pushing the other params in reverse order:

                            push [_eaLength]
                            push [_eaBuffer]
                            push [_createOptions]
                            push [_createDisposition]
                            push [_shareAcceses]
                            push [_fileAttributes]
                            push [_pLargeInterger]

 ;adding the shadow space (4x8)

 ;                               push 0x0
 ;                               push 0x0
 ;                               push 0x0
 ;                               push 0x0

 ;pushing the 4 register params into the shadow space for ease of debugging

                            push r9
                            push r8
                            push rdx
                            push rcx

 ;now pushing the return address to the stack:

                            push endOfProgram

                            mov r10, rcx ;copied from ntdll!NtCreateFile, not sure of the reason for this
                            mov eax, 0x55
                            syscall

 endOfProgram:
                            retn




 section '.data' data readable writeable

 ;parameters------------------------------------------------------------------------------------------------

 _Handle                         dq      0x0
 _access_mask                    dq      0x00000000c0100080
 _pObjectAttributes              dq      objectAttributes        ; at 00402058
 _pIoStatusBlock                 dq           ioStatusBlock
 _pLargeInterger                 dq      0x0
 _fileAttributes                 dq      0x0000000000000080
 _shareAcceses                   dq      0x0000000000000002
 _createDisposition              dq      0x0000000000000005
 _createOptions                  dq      0x0000000000000060
 _eaBuffer                       dq      0x0000000000000000       ; "optional" param
 _eaLength                       dq      0x0000000000000000

 ;----------------------------------------------------------------------------------------------------------


                            align   16
 objectAttributes:
 _oalength                       dq      0x30
 _rootDirectory                  dq      0x0
 _objectName                     dq           unicodeString
 _attributes                     dq      0x40
 _pSecurityDescriptor            dq      0x0
 _pSecurityQualityOfService      dq      securityQualityOfService


 unicodeString:
 _unicodeStringLength            dw      0x34
 _unicodeStringMaxumiumLength    dw      0x34, 0x0, 0x0
 _pUnicodeStringBuffer           dq      _unicodeStringBuffer


 _unicodeStringBuffer            du      '\??\c:\HelloWorldFile_FASM'       ; may need to "run as adinistrator" for the file create to work.



 ioStatusBlock:
 _status_pointer                 dq      0x0
 _information                    dq      0x0


 securityQualityOfService:
 _sqlength                       dd      0xC
 _impersonationLevel             dd      0x2
 _contextTrackingMode            db      0x1
 _effectiveOnly                  db      0x1, 0x0, 0x0

لقد استخدمت الوثائق لـ NTDLL! ntcreatefile ، وقد استخدمت أيضًا مصحح kernel للنظر في ونسخ الكثير من المعلمات.

__kernel_entry NTSTATUS NtCreateFile(
  OUT PHANDLE                      FileHandle,
  IN ACCESS_MASK                   DesiredAccess,
  IN POBJECT_ATTRIBUTES            ObjectAttributes,
  OUT PIO_STATUS_BLOCK             IoStatusBlock,
  IN PLARGE_INTEGER AllocationSize OPTIONAL,
  IN ULONG                         FileAttributes,
  IN ULONG                         ShareAccess,
  IN ULONG                         CreateDisposition,
  IN ULONG                         CreateOptions,
  IN PVOID EaBuffer                OPTIONAL,
  IN ULONG                         EaLength
);

اتفاقية الاتصال الرسمية في Windows: http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx

(آمل أن ينجو هذا الرابط في المستقبل ؛ إذا لم يحدث ذلك ، فما عليك سوى البحث عن "اتفاقيات برنامج X64" على MSDN).

تختلف اتفاقية استدعاء الوظيفة في Linux & Windows X86_64. في كل من ABIs ، يفضل تمرير المعلمات عبر السجلات ، ولكن السجلات المستخدمة تختلف. يمكن العثور على المزيد على Linux ABI في http://www.x86-64.org/documentation/abi.pdf

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top