Panggilan Sistem di windows & API Asli?

Baru-baru ini saya telah menggunakan banyak bahasa Majelis di sistem operasi *NIX. Saya bertanya-tanya tentang domain windows.


Konvensi pemanggilan di linux:

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

Itu dia. Begitulah cara kita melakukan panggilan sistem di linux.

Referensi semua panggilan sistem di linux:

Mengenai $SYS_Call_NUM & parameter mana yang dapat kita gunakan referensi ini : http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

Referensi RESMI: http://kernel.org/doc/man-pages/online/dir_section_2.html


Konvensi pemanggilan di Windows:

???

Referensi semua panggilan sistem di Windows:

???

Tidak resmi : http://www.metasploit.com/users/opcode/syscalls.html , tetapi bagaimana cara menggunakannya di Majelis kecuali saya mengetahui konvensi pemanggilannya.

RESMI : ???

  • Jika Anda mengatakannya, mereka tidak mendokumentasikannya. Lalu bagaimana cara menulis libc untuk windows tanpa mengetahui panggilan sistem? Bagaimana cara melakukan pemrograman Majelis Windows? Setidaknya dalam pemrograman driver kita perlu mengetahui hal ini. Kanan?

Sekarang, ada apa dengan apa yang disebut Native API? Apakah Native API & System calls for windows keduanya merupakan istilah berbeda yang mengacu pada hal yang sama? Untuk mengonfirmasi, saya membandingkannya dari dua Sumber TIDAK RESMI

Panggilan Sistem: http://www.metasploit.com/users/opcode/syscalls.html

API asli: http://undocumented.ntinternals.net/aindex.html

Pengamatan saya:

  1. Semua panggilan sistem diawali dengan huruf Nt sedangkan Native API terdiri dari banyak fungsi yang tidak diawali dengan huruf Nt.
  2. System Call of windows adalah bagian dari Native API. Panggilan sistem hanyalah bagian dari Native API.

Adakah yang bisa mengkonfirmasi hal ini dan menjelaskannya.

EDIT:

Ada jawaban lain. Itu adalah jawaban ke-2. Saya sangat menyukainya tetapi saya tidak tahu mengapa penjawab menghapusnya. Saya memintanya untuk memposting ulang jawabannya.


person claws    schedule 22.03.2010    source sumber
comment
Baca juga ini: stackoverflow.com/questions/919051/   -  person claws    schedule 22.03.2010
comment
Tautan metasploit Anda rusak...   -  person Calmarius    schedule 23.08.2013


Jawaban (5)


Jika Anda melakukan pemrograman perakitan di Windows, Anda tidak melakukan syscall manual. Anda menggunakan NTDLL dan API Asli untuk melakukannya untuk Anda.

Native API hanyalah pembungkus sisi kernelmode. Yang dilakukannya hanyalah melakukan syscall untuk API yang benar.

Anda TIDAK PERNAH perlu melakukan syscall secara manual sehingga seluruh pertanyaan Anda menjadi mubazir.

Kode syscall Linux tidak berubah, begitu pula Windows, itulah mengapa Anda perlu bekerja melalui lapisan abstraksi tambahan (alias NTDLL).

Sunting:

Selain itu, meskipun Anda bekerja di tingkat perakitan, Anda masih memiliki akses penuh ke API Win32, tidak ada alasan untuk menggunakan API NT sejak awal! Impor, ekspor, dll semuanya berfungsi dengan baik di program perakitan.

EDIT2:

Jika Anda BENAR-BENAR ingin melakukan syscall manual, Anda perlu membalikkan NTDLL untuk setiap versi Windows yang relevan, menambahkan deteksi versi (melalui PEB), dan melakukan pencarian syscall untuk setiap panggilan.

Namun, itu konyol. NTDLL ada karena suatu alasan.

Orang-orang telah melakukan bagian rekayasa balik: lihat https://j00ru.vexillium.org/syscalls/nt/64/ untuk tabel nomor panggilan sistem untuk setiap kernel Windows. (Perhatikan bahwa baris selanjutnya berubah bahkan antar versi Windows 10.) Sekali lagi, ini adalah ide buruk di luar eksperimen yang hanya digunakan untuk keperluan pribadi di mesin Anda sendiri untuk mempelajari lebih lanjut tentang asm dan/atau internal Windows. Jangan memasukkan panggilan sistem ke dalam kode yang Anda distribusikan ke orang lain.

person RaptorFactor    schedule 22.03.2010
comment
+1 & terima kasih. Bisakah Anda menunjukkan beberapa contoh kode yang menunjukkan cara menggunakan WIN32 API & NT API dari bahasa Majelis. - person claws; 22.03.2010
comment
Perakitan apa yang Anda gunakan? Jika Anda menggunakan MASM misalnya, cara termudah adalah dengan menggunakan 'INVOKE'. Hasil Google pertama yang saya temukan yang menguraikannya adalah: movsd.com/masm.htm - person RaptorFactor; 22.03.2010
comment
Artikel singkat & ringkas yang merupakan pelengkap bagus untuk jawaban ini: codeproject.com/KB/ sistem/Win32.aspx - person claws; 22.03.2010
comment
Artikel itu bukan yang Anda cari. Ini menunjukkan cara melakukan syscall manual, yang tidak boleh Anda lakukan karena jumlahnya berubah di seluruh versi Windows dan paket layanan. Seperti yang telah saya nyatakan, Anda harus menggunakan Windows API untuk melakukan pengiriman untuk Anda. NTDLL dipetakan ke semua proses secara otomatis. Jadi meskipun karena alasan tertentu Anda tidak dapat menggunakan impor (saya tidak dapat memikirkan waktu yang wajar di mana hal ini akan terjadi) Anda masih bisa menangani NTDLL dan menghitung EAT secara manual untuk mendapatkan petunjuk fungsi yang diperlukan (walaupun Anda seharusnya tidak perlu melakukannya). - person RaptorFactor; 23.03.2010
comment
Tentu saja tidak. Saya hanya mencoba memperjelas bahwa informasi tertentu yang Anda maksud tidak relevan dengan pertanyaan Anda karena Anda tidak perlu mengetahui cara kerja proses pengiriman sistem untuk melakukan panggilan sistem di Windows. Itu sebabnya API Win32 tingkat tinggi (atau bahkan API NT) ada di sana, untuk mengabstraksi detail yang tidak relevan tersebut. - person RaptorFactor; 26.03.2010
comment
@claws Artikel ini sangat menarik untuk dibaca, terima kasih banyak - person Felix Dombek; 25.09.2012
comment
Ini tidak benar-benar ditujukan kepada penulis jawaban ini secara khusus, tetapi saya tidak mengerti mengapa jawaban ini tidak begitu lazim di SO, bukankah ini seharusnya menjadi situs untuk programmer profesional dan antusias? Mengapa di satu sisi situs ini mendorong upaya penelitian yang ekstrem tetapi ketika Anda sampai pada pertanyaan rasa ingin tahu tingkat rendah ini, saya mengerti aliran konstan Anda tidak perlu tahu itu!!!. Siapa lagi target audiens sebenarnya untuk situs ini? Orang yang membutuhkan pegangan tangan atau orang yang benar-benar ingin menggali lebih dalam? - person jrh; 15.03.2017
comment
@jrh: 100% setuju. Mengetahui cara kerja sesuatu adalah hal yang menarik bahkan jika Anda tidak akan pernah menulis kode yang menggunakannya secara langsung. Saya mengedit jawaban ini untuk menambahkan tautan ke j00ru.vexillium.org/syscalls/nt/64. Saya tidak tahu mengapa orang yang menjawab pertanyaan Windows asm begitu enggan memberikan petunjuk tentang info seperti itu. Yang diperlukan hanyalah peringatan yang tepat bahwa menggunakannya di luar eksperimen pribadi dan latihan pembelajaran adalah ide yang buruk, seperti banyak trik komputer konyol yang dapat Anda lakukan dengan asm! - person Peter Cordes; 22.07.2019
comment
Berikut adalah lokasi baru artikel tersebut yang awalnya dihubungkan oleh cakar pada tanggal 22 Maret pukul 5:09: codeproject.com/Articles/33870/ - person riQQ; 21.08.2020

Hal lain yang perlu Anda ketahui tentang konvensi syscall windows adalah seperti yang saya pahami, tabel syscall dibuat sebagai bagian dari proses pembangunan. Ini berarti bahwa mereka dapat berubah begitu saja - tidak ada yang melacaknya. Jika seseorang menambahkan yang baru di bagian atas daftar, itu tidak masalah. NTDLL masih berfungsi, jadi semua orang yang menelepon NTDLL masih berfungsi.

Bahkan mekanisme yang digunakan untuk melakukan syscall (yaitu int, atau sysenter) tidak tetap dan telah berubah di masa lalu, dan menurut saya pada suatu waktu versi windows yang sama menggunakan DLL berbeda yang menggunakan mekanisme entri berbeda tergantung pada CPU di dalam mesin.

person Stewart    schedule 30.04.2010
comment
+1 karena menurut saya ini sangat menarik. Apakah Anda memiliki sumber daya (internet atau buku) di mana seseorang dapat mempelajari lebih lanjut tentang internal Win32 API/syscall semacam itu? - person stakx - no longer contributing; 30.04.2010
comment
Ini agak ketinggalan jaman, tapi menurut saya Inside Windows 2000 membahas hal ini. nynaeve.net/?p=48 mengadakan diskusi yang bagus dan juga menunjukkan bahwa ada di tiga konvensi syscall terakhir yang digunakan di windows pada x86 dan x64. IA64 mungkin melakukan sesuatu yang sangat berbeda lagi, dan tentu saja ada Alpha, PowerPC, MIPS dan mungkin lainnya. Tentu saja, peringatan umum berlaku - semuanya tidak berdokumen dan kemungkinan besar akan berubah. - person Stewart; 01.05.2010

Saya tertarik melakukan panggilan API Windows di Majelis tanpa impor (sebagai latihan pendidikan), jadi saya menulis Majelis FASM berikut untuk melakukan apa yang dilakukan NtDll!NtCreateFile. Ini adalah demonstrasi kasar pada Windows versi 64-bit saya (Win10 1803 Versi 10.0.17134), dan crash setelah panggilan, tetapi nilai kembalian syscall adalah nol sehingga berhasil. Semuanya diatur sesuai konvensi panggilan Windows x64, kemudian nomor panggilan sistem dimuat ke RAX, dan kemudian instruksi perakitan syscall untuk menjalankan panggilan. Contoh saya membuat file c:\HelloWorldFile_FASM, sehingga harus dijalankan "sebagai administrator".

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

Saya menggunakan dokumentasi untuk Ntdll!NtCreateFile, dan saya juga menggunakan debugger kernel untuk melihat dan menyalin banyak parameter.

__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
);
person Elliot    schedule 23.07.2018
comment
mov r10, rcx mungkin memiliki alasan yang sama dengan Linux: syscall sendiri mengalahkan rcx (dan r11) sebelum kernel dapat melihatnya, sehingga konvensi pemanggilan kernel syscall menggunakan r10 dan bukan rcx. Pada versi Windows apa kode ini berfungsi? syscall ABI tidak stabil di Windows, jadi parameter yang berbeda atau bahkan kode selain eax = 0x55 mungkin merupakan cara yang tepat untuk menjalankannya di versi Windows lainnya. - person Peter Cordes; 23.07.2018
comment
Terima kasih atas infonya tentang mov r10, rcx line; Saya belum menyelidikinya. Versi windows saya adalah 10.0.17134 Build 17134 . - person Elliot; 23.07.2018
comment
Untuk detail tentang syscall dan RCX, lihat Mengapa panggilan sistem Linux x86-64 mengubah RCX, dan apa arti nilainya? dan Perbedaan ABI antara fungsi Linux x86_64 dan syscall. Dan Mengapa parameter syscall Majelis x86_64 tidak dalam urutan abjad seperti i386 untuk contoh fungsi wrapper seperti Linux/glibc mmap yang hanya memiliki ke mov r10,rcx) - person Peter Cordes; 23.07.2018
comment
Terima kasih. Saya telah melihat dokumentasi syscall dan saya melihat bahwa itu menyimpan alamat berikutnya ke RCX. Saya mungkin meningkatkan demonstrasi saya di atas karena saya perhatikan bahwa setelah membuat file, file tersebut crash dengan pengecualian pelanggaran akses. Saya tidak ingin melakukan panggilan lagi untuk mengakhiri proses dengan benar. - person Elliot; 23.07.2018
comment
@PeterCordes Saya tidak mengatakan saya merekomendasikan penggunaan nomor syscall secara langsung (karena jumlahnya berubah), tetapi nomor syscall adalah didokumentasikan secara tidak resmi. Windows Versi 10.0.17134 adalah Windows (1803) dan syscall untuk NtCreateFile adalah 0x55. Semua 5 versi Win 10 yang dirilis menggunakan 0x55 sejauh ini. (Pra Win10 telah menggunakan nomor panggilan sistem selain 0x55) - person Michael Petch; 24.07.2018
comment
mov r10,rcx ini karena antarmuka syscall meneruskan parameter pertama melalui r10, bukan RCX. Panggilan fungsi 64-bit biasa menggunakan RCX, RDX, R8, dan R9. Syscall menggunakan R10, RDX, R8, dan R9. Alasannya adalah bahwa instruksi syscall menimpa RCX (juga menimpa R11). Microsoft memilih untuk menggunakan R10 sebagai parameter pertama dari panggilan sistem, jadi mengapa Anda akan melihat mov r10, rcx - person Michael Petch; 24.07.2018
comment
Alasan penambahan padding (yaitu push 0x0DF0AD8B) adalah untuk menjaga keselarasan tumpukan demi alasan kinerja. Anda harus menambahkan 8 byte (satu quadword) padding JIKA ada jumlah push yang setara dengan jumlah genap yang dilakukan sebelum syscall (jika tidak, Anda tidak memerlukan padding). Hal ini karena tumpukan tidak sejajar dengan 8 pada titik start dieksekusi karena alamat pengirim ada di tumpukan. - person Michael Petch; 24.07.2018
comment
Mengapa kode Anda gagal, itu karena Anda tidak membersihkan tumpukan setelah syscall. Anda mendorong setara dengan 13 quadwords untuk menyiapkan syscall. Anda perlu menyesuaikan tumpukan setelah syscall untuk memulihkan penunjuk tumpukan ke keadaan sebelumnya sebelum Anda melakukan ret. 13*8=104 byte dimasukkan ke tumpukan sebelum syscall. Setelah syscall, Anda cukup melakukan add rsp, 104 untuk membersihkan tumpukan. - person Michael Petch; 24.07.2018
comment
Karena parameter pertama syscall ada di R10, bukan RCX, Anda dapat mengganti mov rcx, _Handle dengan mov r10, _Handle dan kemudian Anda dapat menghapus mov r10, rcx semuanya. Anda juga akan mengubah push rcx menjadi push r10 - person Michael Petch; 24.07.2018
comment
Versi revisi kode Anda yang masih berfungsi dan mempertimbangkan semua ini ada di sini: capp-sysware.com/misc/stackoverflow/2489889/winsyscall.asm - person Michael Petch; 24.07.2018
comment
Karena Anda membentuk syscall secara langsung (tanpa parameter yang diteruskan ke awal), alamat pengirim tidak harus berupa nilai tertentu. syscall tidak akan menggunakannya untuk kembali (syscall akan kembali ke instruksi setelah syscall). Jadi, alih-alih push endOfProgram Anda cukup menekan register apa saja (nilainya tidak masalah) seperti push rbp (atau push rax register tidak masalah) - person Michael Petch; 25.07.2018

Panggilan sistem Windows dilakukan dengan memanggil DLL sistem seperti kernel32.dll atau gdi32.dll, yang dilakukan dengan panggilan subrutin biasa. Mekanisme untuk menjebak ke dalam lapisan istimewa OS tidak terdokumentasi, tapi tidak apa-apa karena DLL seperti kernel32.dll melakukan ini untuk Anda.

Dan dengan panggilan sistem, yang saya maksud adalah titik masuk Windows API yang terdokumentasi seperti CreateProcess() atau GetWindowText(). Driver perangkat umumnya akan menggunakan API yang berbeda dari Windows DDK.

person Will    schedule 22.03.2010
comment
1. Bagaimana saya akan menggunakannya dalam pemrograman bahasa Majelis? 2. Windows API dan panggilan sistem bukanlah hal yang sama. WINDOWS API menggunakan panggilan sistem. Analogi serupa pada domain linux adalah POSIX API (WINDOWS API) menggunakan panggilan sistem yang disediakan oleh kernel linux (kernel windows). Jadi, kekhawatiran saya adalah tentang panggilan sistem yang benar. - person claws; 22.03.2010
comment
Saya memahami bahwa ada perbedaan antara panggilan API dan jebakan ke dalam lapisan istimewa OS (yang Anda sebut panggilan sistem sebenarnya). Panggilan sistem yang sebenarnya ini adalah detail implementasi DLL sistem Windows. Anda mungkin dapat mengetahui cara kerjanya dengan membongkar DLL dan melihat rakitannya. Atau Anda bisa menulis kode Majelis untuk memanggil DLL yang sesuai... itu mungkin. - person Will; 22.03.2010

Konvensi Panggilan RESMI di Windows: http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx

(semoga tautan ini bertahan di masa mendatang; jika tidak, cari saja "Konvensi Perangkat Lunak x64" di MSDN).

Konvensi pemanggilan fungsi berbeda di Linux & Windows x86_64. Di kedua ABI, parameter sebaiknya dilewatkan melalui register, namun register yang digunakan berbeda. Lebih lanjut tentang ABI Linux dapat ditemukan di http://www.x86-64.org/documentation/abi.pdf

person claws    schedule 23.03.2010
comment
Ini tidak menjawab pertanyaan tentang konvensi untuk memanggil mode kernel. Ini untuk konvensi pemanggilan fungsi mode pengguna, yang sangat berbeda. Dan didokumentasikan sepenuhnya. - person Stewart; 11.05.2013