مكالمات النظام في Windows و API الأصلي؟
-
21-09-2019 - |
سؤال
لقد استخدمت مؤخرًا الكثير من لغة التجميع في أنظمة التشغيل *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
ملاحظاتي:
- تبدأ جميع مكالمات النظام بالرسائل
Nt
حيث تتكون API الأصلي من الكثير من الوظائف التي لا تبدأ بالحروفNt
. 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