macOS IPC - Inter Process Communication
Portlar Aracılığıyla Mach Mesajlaşması
Temel Bilgiler
Mach, kaynakları paylaşmak için görevleri en küçük birim olarak kullanır ve her görev çoklu iş parçacığı içerebilir. Bu görevler ve iş parçacıkları POSIX işlemlerine ve iş parçacıklarına 1:1 eşlenir.
Görevler arasındaki iletişim, Mach İşlem Arası İletişim (IPC) aracılığıyla gerçekleşir ve tek yönlü iletişim kanallarını kullanır. Mesajlar portlar arasında aktarılır, bu portlar çekirdek tarafından yönetilen bir tür mesaj kuyruğu gibi davranır.
Bir port, Mach IPC'nin temel öğesidir. Bu, mesaj göndermek ve almak için kullanılabilir.
Her işlemde bir IPC tablosu bulunur, burada işlemin mach portları bulunabilir. Bir mach portun adı aslında bir sayıdır (çekirdek nesnesine işaret eden bir işaretçi).
Bir işlem ayrıca bir port adını bazı haklarla farklı bir göreve gönderebilir ve çekirdek bu girişi diğer görevin IPC tablosuna ekler.
Port Hakları
İletişimde önemli olan port hakları, bir görevin yapabileceği işlemleri tanımlar. Mümkün olan port hakları şunlardır (buradan tanımlamalar):
Alma hakkı, porta gönderilen mesajları almayı sağlar. Mach portları MPSC (çoklu üretici, tek tüketici) kuyruklarıdır, bu da demektir ki tüm sistemde bir port için yalnızca bir alma hakkı olabilir (borular gibi, burada birden fazla işlem, aynı borunun okuma ucuna ait dosya tanımlayıcılarına sahip olabilir).
Alma hakkına sahip bir görev, mesajları alabilir ve Gönderme hakları oluşturabilir, böylece mesaj gönderebilir. Başlangıçta yalnızca kendi görevi, portun üzerinde Alma hakkına sahiptir.
Alma hakkının sahibi öldüğünde veya onu sonlandırdığında, gönderme hakkı işlevsiz hale gelir (ölü ad).
Gönderme hakkı, porta mesaj göndermeyi sağlar.
Gönderme hakkı kopyalanabilir, böylece Gönderme hakkına sahip bir görev, hakkı kopyalayabilir ve üçüncü bir göreve verilebilir.
Port hakları ayrıca Mac mesajları aracılığıyla da geçirilebilir.
Bir kez gönderme hakkı, porta bir mesaj göndermeyi ve ardından kaybolmayı sağlar.
Bu hak kopyalanamaz, ancak taşınabilir.
Port kümesi hakkı, yalnızca tek bir port değil bir port kümesini belirtir. Bir port kümesinden bir mesaj çıkarmak, içerdiği portlardan birinden bir mesaj çıkarır. Port kümeleri, Unix'teki
select
/poll
/epoll
/kqueue
gibi aynı anda birkaç porta dinlemek için kullanılabilir.Ölü ad, gerçek bir port hakkı değil, yalnızca bir yer tutucudur. Bir port yok edildiğinde, portun tüm mevcut port hakları ölü adlara dönüşür.
Görevler, SEND haklarını başkalarına aktarabilir, böylece onlara geri mesaj gönderme yetkisi verilebilir. SEND hakları da klonlanabilir, böylece bir görev hakkı çoğaltabilir ve üçüncü bir göreve verebilir. Bu, aracı bir süreç olan başlangıç sunucusu ile birlikte, görevler arasında etkili iletişim sağlar.
Dosya Portları
Dosya portları, dosya tanımlayıcılarını Mac portlarına (Mach port hakları kullanarak) kapsüllüyebilir. Belirli bir FD'den fileport_makeport
kullanarak bir fileport
oluşturmak ve bir FD oluşturmak mümkündür.
İletişim Kurma
Daha önce belirtildiği gibi, Mach mesajları aracılığıyla hakları göndermek mümkündür, ancak zaten bir Mach mesajı gönderme hakkına sahip olmadan bir hakkı gönderemezsiniz. Peki, ilk iletişim nasıl kurulur?
Bu durumda, başlangıç sunucusu (mac'de launchd) devreye girer, çünkü herkes başlangıç sunucusuna bir SEND hakkı alabilir, böylece başka bir işleme mesaj göndermek için bir hakkı istemek mümkündür:
Görev A, ALMA hakkı alarak yeni bir port oluşturur.
ALMA hakkının sahibi olan Görev A, port için bir GÖNDERME hakkı oluşturur.
Görev A, başlangıç sunucusu ile bir bağlantı kurar ve başlangıçta oluşturduğu porta ait GÖNDERME hakkını sunucuya gönderir.
Unutmayın ki herkes başlangıç sunucusuna bir GÖNDERME hakkı alabilir.
Görev A, başlangıç sunucusuna bir
bootstrap_register
mesajı göndererek verilen portucom.apple.taska
gibi bir isimle ilişkilendirir.Görev B, hizmet adı için bir başlangıç araması yapmak üzere başlangıç sunucusu ile etkileşime girer (
bootstrap_lookup
). Sunucu yanıt verebilsin diye, görev B, arama mesajı içinde önceden oluşturduğu bir port için bir GÖNDERME hakkı gönderir. Arama başarılıysa, sunucu Task A'dan aldığı GÖNDERME hakkını kopyalar ve Task B'ye iletir.
Unutmayın ki herkes başlangıç sunucusuna bir GÖNDERME hakkı alabilir.
Bu GÖNDERME hakkı ile Görev B, Görev A'ya bir mesaj gönderebilir.
İki yönlü iletişim için genellikle görev B, bir ALMA hakkı ve bir GÖNDERME hakkı olan yeni bir port oluşturur ve Görev A'ya GÖNDERME hakkını verir, böylece Görev A, GÖREV B'ye mesaj gönderebilir (iki yönlü iletişim).
Başlangıç sunucusu hizmet adını doğrulayamaz. Bu, bir görevin potansiyel olarak herhangi bir sistem görevini taklit edebileceği anlamına gelir, örneğin yanlışlıkla bir yetkilendirme hizmet adı iddia edebilir ve ardından her isteği onaylayabilir.
Daha sonra, Apple, sistem tarafından sağlanan hizmetlerin adlarını güvenli yapılandırma dosyalarında saklar, bu dosyalar SIP korumalı dizinlerde bulunur: /System/Library/LaunchDaemons
ve /System/Library/LaunchAgents
. Her hizmet adının yanında, ilişkili ikili dosya da saklanır. Başlangıç sunucusu, bu hizmet adları için her biri için bir ALMA hakkı oluşturur ve saklar.
Bu önceden tanımlanmış hizmetler için, arama süreci biraz farklıdır. Bir hizmet adı aranırken, launchd hizmeti dinamik olarak başlatır. Yeni iş akışı şöyle işler:
Görev B, bir hizmet adı için bir başlangıç araması başlatır.
launchd, görevin çalışıp çalışmadığını kontrol eder ve çalışmıyorsa, başlatır.
Görev A (hizmet), bir başlangıç kontrolü yapar (
bootstrap_check_in()
). Burada, başlangıç sunucusu bir GÖNDERME hakkı oluşturur, saklar ve ALMA hakkını Görev A'ya aktarır.launchd, GÖNDERME hakkını kopyalar ve Görev B'ye iletir.
Görev B, bir ALMA hakkı ve bir GÖNDERME hakkı olan yeni bir port oluşturur ve Görev A'ya GÖNDERME hakkını verir (hizmet), böylece Görev A, GÖREV B'ye mesaj gönderebilir (iki yönlü iletişim).
Ancak, bu süreç yalnızca önceden tanımlanmış sistem görevleri için geçerlidir. Sistem dışı görevler hala önceki şekilde çalışır, bu da potansiyel olarak taklit edilmesine izin verebilir.
Bu nedenle, launchd asla çökmemeli veya tüm sistem çökecektir.
Bir Mach İletisi
Daha fazla bilgiyi burada bulabilirsiniz
mach_msg
işlevi, temelde bir sistem çağrısı olup Mach iletilerini göndermek ve almak için kullanılır. İşlev, iletilmesi gereken iletiyi başlangıç argümanı olarak gerektirir. Bu ileti, bir mach_msg_header_t
yapısı ile başlamalı ve ardından gerçek ileti içeriği gelmelidir. Yapı aşağıdaki gibi tanımlanmıştır:
İşlemciler, bir Mach bağlantı noktasında ileti almak için bir alma hakkına sahip olabilirler. Tersine, gönderenler bir gönderme veya bir kez gönderme hakkına sahiptir. Bir kez gönderme hakkı yalnızca bir ileti göndermek için kullanılır, ardından geçersiz hale gelir.
Başlangıç alanı msgh_bits
bir bit eşlemidir:
İlk bit (en anlamlı) bir ileti'nin karmaşık olduğunu belirtmek için kullanılır (aşağıda daha fazla bilgi)
ve 4. bitler çekirdek tarafından kullanılır
baytın en az 5 anlamlı bitsi makbuz için kullanılabilir: anahtar/değer kombinasyonları göndermek için başka bir bağlantı nokta türü.
baytın en az 5 anlamlı bitsi yerel bağlantı noktası için kullanılabilir
baytın en az 5 anlamlı bitsi uzak bağlantı noktası için kullanılabilir
Makbuzda, yerel ve uzak bağlantı noktalarında belirtilebilecek türler mach/message.h adresinden alınabilir:
Örneğin, MACH_MSG_TYPE_MAKE_SEND_ONCE
, bu bağlantı noktası için türetilmiş ve aktarılmış bir tek seferlik gönderme hakkının belirtildiğini belirtmek için kullanılabilir. Alıcı yanıt veremez şeklinde alıcının yanıt vermesini engellemek için de MACH_PORT_NULL
belirtilebilir.
Kolay iki yönlü iletişim sağlamak için bir işlem, yanıt bağlantı noktası (msgh_local_port
olarak adlandırılan) olarak adlandırılan bir mach mesaj başlığı içinde bir mach bağlantı noktası belirtebilir, mesajın alıcısı bu mesaja yanıt gönderebilir.
Bu tür iki yönlü iletişimin XPC mesajlarında kullanıldığını unutmayın (xpc_connection_send_message_with_reply
ve xpc_connection_send_message_with_reply_sync
). Ancak genellikle farklı bağlantı noktaları oluşturulur, önceki açıklamalarda açıklandığı gibi iki yönlü iletişimi oluşturmak için.
Mesaj başlığının diğer alanları şunlardır:
msgh_size
: tüm paketin boyutu.msgh_remote_port
: bu mesajın gönderildiği bağlantı noktası.msgh_voucher_port
: mach fişleri.msgh_id
: bu mesajın kimliği, alıcı tarafından yorumlanır.
Mach mesajları, mach çekirdeğine yerleştirilmiş tek alıcı, çoklu gönderen iletişim kanalı olan bir mach bağlantı noktası üzerinden gönderilir. Birden fazla işlem, bir mach bağlantı noktasına mesaj gönderebilir, ancak herhangi bir anda yalnızca bir işlem ondan okuyabilir.
Mesajlar daha sonra mach_msg_header_t
başlık ile başlar, ardından gövde ve trailer (varsa) gelir ve yanıt verme izni verebilir. Bu durumlarda, çekirdek sadece mesajı bir görevden diğerine iletmelidir.
Bir trailer, kullanıcı tarafından ayarlanamayan mesaja çekirdek tarafından eklenen bilgidir ve alıcıdan bu bilgiyi talep etmek için MACH_RCV_TRAILER_<trailer_opt>
bayrakları kullanılır (talep edilebilecek farklı bilgiler vardır).
Karmaşık Mesajlar
Ancak, ek port hakları geçiren veya belleği paylaşan daha karmaşık mesajlar gibi diğer mesajlar da vardır, bu durumlarda çekirdek bu nesneleri alıcıya göndermek zorundadır. Bu durumlarda, başlık msgh_bits
'in en anlamlı biti ayarlanır.
Geçirilebilecek olası tanımlayıcılar mach/message.h
içinde tanımlanmıştır.
Mac Port API'leri
Portlar görev ad alanına bağlı olduğundan, bir port oluşturmak veya aramak için görev ad alanı da sorgulanır (daha fazlası için mach/mach_port.h
):
mach_port_allocate
|mach_port_construct
: Bir port oluşturur.mach_port_allocate
ayrıca bir port seti oluşturabilir: bir grup port üzerinde alınan hak. Bir mesaj alındığında, mesajın nereden geldiği belirtilir.mach_port_allocate_name
: Portun adını değiştirir (varsayılan olarak 32 bitlik tamsayı)mach_port_names
: Bir hedeften port adlarını alırmach_port_type
: Bir görevin bir ada sahip olma haklarını alırmach_port_rename
: Bir portun adını değiştirir (FD'ler için dup2 gibi)mach_port_allocate
: YENİ ALMA, PORT_SET veya DEAD_NAME oluştururmach_port_insert_right
: ALMA hakkına sahip olduğunuz bir portta yeni bir hak oluştururmach_port_...
mach_msg
|mach_msg_overwrite
: Mach mesajları göndermek ve almak için kullanılan işlevler. Üzerine yazma sürümü, mesaj alımı için farklı bir tampon belirtmeyi sağlar (diğer sürüm sadece onu yeniden kullanır).
Debug mach_msg
mach_msg
ve mach_msg_overwrite
işlevlerinin gönderme ve alma işlemlerinde kullanıldığı için bunlara bir kesme noktası ayarlamak gönderilen ve alınan mesajları incelemeyi sağlar.
Örneğin, bu işlevi kullanan libSystem.B
'yi yükleyecek herhangi bir uygulamayı hata ayıklamaya başlayın.
mach_msg
'nin argümanlarını almak için kayıtları kontrol edin. Bu argümanlar şunlardır (mach/message.h adresinden):
Kayıtlardan değerleri alın:
İlk argümanı kontrol ederek mesaj başlığını inceleyin:
O tür mach_msg_bits_t
, bir yanıtı izin vermek için çok yaygındır.
Bağlantı noktalarını sırala
İsim, bağlantı noktasına verilen varsayılan addır (ilk 3 baytın nasıl arttığını kontrol edin). ipc-object
ise bağlantı noktasının şifrelenmiş benzersiz tanımlayıcısıdır.
Ayrıca, yalnızca send
hakkına sahip bağlantı noktalarının sahibini belirlediğine dikkat edin (bağlantı noktası adı + pid).
Ayrıca, diğer görevleri belirtmek için +
işaretinin kullanımına dikkat edin.
Ayrıca, procesxp kullanarak kayıtlı hizmet adlarını (SIP devre dışı bırakıldığında com.apple.system-task-port
gerektiğinden) görmek mümkündür:
iOS'ta bu aracı indirerek yükleyebilirsiniz http://newosxbook.com/tools/binpack64-256.tar.gz
Kod örneği
Göndericinin nasıl bir bağlantı noktası ayırdığını, org.darlinghq.example
adı için bir gönderme hakkı oluşturduğunu ve bunu önyükleme sunucusuna gönderdiğini, göndericinin o ad için gönderme hakkını istediğini ve bunu kullanarak bir mesaj gönderdiğini görebilirsiniz.
Dosya gönderme işlemi için kullanılan C programı. Bu program, alıcıya bir dosya göndermek için IPC soketlerini kullanır. Bu, iki işlem arasında iletişim kurmak için kullanılan bir yöntemdir. Bu program, dosya adını ve boyutunu alıcıya gönderir ve ardından dosyanın içeriğini gönderir. Bu işlem, dosya gönderme işlemini gerçekleştirmek için alıcı programla birlikte çalışır.
Ayrıcalıklı Bağlantı Noktaları
Belirli hassas eylemleri gerçekleştirmeye veya belirli hassas verilere erişmeye izin veren bazı özel bağlantı noktaları vardır, bir görevin üzerlerinde GÖNDERME izinlerine sahip olması durumunda. Bu, bu bağlantı noktalarını saldırganlar açısından çok ilginç kılar, sadece yeteneklerinden değil, aynı zamanda GÖNDERME izinlerinin görevler arasında paylaşılabilir olmasından dolayı.
Ana Bilgisayar Özel Bağlantı Noktaları
Bu bağlantı noktaları bir numara ile temsil edilir.
GÖNDERME hakları, host_get_special_port
çağrısı ile elde edilebilir ve ALMA hakları host_set_special_port
çağrısı ile elde edilebilir. Ancak, her iki çağrı da yalnızca kökün erişebileceği host_priv
bağlantı noktasını gerektirir. Ayrıca, geçmişte kök, örneğin HOST_KEXTD_PORT
'u ele geçirerek kod imzalarını atlayarak izin veren keyfi bağlantı noktalarını ele geçirebiliyordu (SIP şimdi buna engel oluyor).
Bunlar 2 gruba ayrılır: İlk 7 bağlantı noktası çekirdek tarafından sahiplenilir; 1 HOST_PORT
, 2 HOST_PRIV_PORT
, 3 HOST_IO_MASTER_PORT
ve 7 HOST_MAX_SPECIAL_KERNEL_PORT
'dur.
8'den başlayanlar ise sistem hizmetlileri tarafından sahiplenilir ve host_special_ports.h
dosyasında tanımlanmıştır.
Ana bilgisayar bağlantı noktası: Bir işlem bu bağlantı noktası üzerinde GÖNDERME ayrıcalığına sahipse, sistem hakkında bilgi alabilir ve aşağıdaki rutinlerini çağırarak işlemlerini gerçekleştirebilir:
host_processor_info
: İşlemci bilgilerini alhost_info
: Ana bilgisayar bilgilerini alhost_virtual_physical_table_info
: Sanal/Fiziksel sayfa tablosu (MACH_VMDEBUG gerektirir)host_statistics
: Ana bilgisayar istatistiklerini almach_memory_info
: Çekirdek bellek düzenini alAna bilgisayar Ayrıcalıklı bağlantı noktası: Bu bağlantı noktası üzerinde GÖNDERME hakkı olan bir işlem, örneğin önyükleme verilerini gösterme veya bir çekirdek uzantısını yükleme gibi ayrıcalıklı eylemler gerçekleştirebilir. Bu izne sahip olmak için işlemin kök olması gerekir.
Ayrıca,
kext_request
API'sını çağırmak için yalnızca Apple ikililerine verilencom.apple.private.kext*
diğer ayrıcalıklara ihtiyaç vardır.Çağrılabilen diğer rutinler şunlardır:
host_get_boot_info
:machine_boot_info()
'yu alhost_priv_statistics
: Ayrıcalıklı istatistikleri alvm_allocate_cpm
: Ardışık Fiziksel Bellek Ayırhost_processors
: İşlemcilere gönderme hakkımach_vm_wire
: Belleği yerleşik yapKök bu izne erişebildiği için,
host_set_[special/exception]_port[s]
'ı çağırarak ana bilgisayar özel veya istisna bağlantı noktalarını ele geçirebilir.
Tüm ana bilgisayar özel bağlantı noktalarını görmek mümkündür:
Görev Özel Portları
Bunlar, tanınmış hizmetler için ayrılmış portlardır. Onları task_[get/set]_special_port
çağırarak almak/ayarlamak mümkündür. Onlar task_special_ports.h
dosyasında bulunabilir:
TASK_KERNEL_PORT[görev-kendisi gönderme hakkı]: Bu görevi kontrol etmek için kullanılan bağlantı noktası. Görevi etkileyen mesajları göndermek için kullanılır. Bu, mach_task_self (aşağıdaki Görev Bağlantı Noktaları'na bakınız) tarafından döndürülen bağlantı noktasıdır.
TASK_BOOTSTRAP_PORT[başlatma gönderme hakkı]: Görevin başlatma bağlantı noktası. Diğer sistem hizmeti bağlantı noktalarının geri dönüşünü istemek için mesaj göndermek için kullanılır.
TASK_HOST_NAME_PORT[ana-gönderme hakkı]: İçeren ana bilgisayarın bilgilerini istemek için kullanılan bağlantı noktası. Bu, mach_host_self tarafından döndürülen bağlantı noktasıdır.
TASK_WIRED_LEDGER_PORT[defter gönderme hakkı]: Bu görevin kablolu çekirdek belleğini çektiği kaynağı adlandıran bağlantı noktası.
TASK_PAGED_LEDGER_PORT[defter gönderme hakkı]: Bu görevin varsayılan bellek yönetilen belleğini çektiği kaynağı adlandıran bağlantı noktası.
Görev Bağlantı Noktaları
Başlangıçta Mach'ta "işlemler" değil, "görevler" vardı ve bu daha çok bir iş parçacığı konteynırı olarak kabul ediliyordu. Mach, BSD ile birleştirildiğinde her görev bir BSD işlemiyle ilişkilendirildi. Bu nedenle her BSD işleminin bir işlem olması için gereken ayrıntılara sahip olması ve her Mach görevinin de iç işleyişi olması (kernel_task olan mevcut pid 0 hariç).
Bununla ilgili iki çok ilginç işlev bulunmaktadır:
task_for_pid(hedef_görev_bağlantı_noktası, pid, &pid_li_görev_bağlantı_noktası)
: Belirtilenpid
ile ilişkilendirilen görevin görev bağlantı noktası için BİRİM hakkı alın ve genelliklemach_task_self()
kullanan çağrılan görev olanhedef_görev_bağlantı_noktası
'na verilir (ancak farklı bir görev üzerinde bir BİRİM bağlantı noktası olabilir).pid_for_task(görev, &pid)
: Bir göreve BİRİM hakkı verildiğinde, bu görevin hangi PID ile ilişkili olduğunu bulun.
Görev içinde işlem yapabilmek için görevin kendine SEND
hakkına ihtiyacı vardı ve mach_task_self()
'i çağırarak bu izni alıyordu (task_self_trap
(28) kullanır). Bu izinle bir görev, aşağıdaki gibi çeşitli işlemleri gerçekleştirebilir:
task_threads
: Görevin iş parçacıklarının tüm görev bağlantı noktaları üzerinde BİRİM hakkı alıntask_info
: Bir görev hakkında bilgi altask_suspend/resume
: Bir görevi askıya al veya devam ettirtask_[get/set]_special_port
thread_create
: Bir iş parçacığı oluşturtask_[get/set]_state
: Görev durumunu kontrol etve daha fazlası mach/task.h içinde bulunabilir
Farklı bir görevin bir görev bağlantı noktası üzerinde BİRİM hakkı ile, farklı bir görev üzerinde bu tür işlemleri gerçekleştirmek mümkündür.
Ayrıca, görev_bağlantı_noktası aynı zamanda vm_map
bağlantı noktasıdır ve vm_read()
ve vm_write()
gibi işlevlerle bir görev içinde belleği okuma ve değiştirme izni verir. Bu temelde, farklı bir görevin görev_bağlantı_noktası üzerinde BİRİM haklarına sahip bir görevin, o göreve kod enjekte etme yeteneğine sahip olacağı anlamına gelir.
Unutmayın ki kernel de bir görev olduğundan, biri kernel_task
üzerinde BİRİM izinleri almayı başarırsa, kernelin herhangi bir şeyi yürütmesini sağlayabilir (jailbreak).
Çağrı yapmak için
mach_task_self()
ve çalışan görev için bu bağlantı noktasının adını alın. Bu bağlantı noktası yalnızcaexec()
sırasında miras alınır;fork()
ile oluşturulan yeni bir görev yeni bir görev bağlantı noktası alır (exec()
'den sonra bir suid ikili dosyada da bir görev yeni bir görev bağlantı noktası alır). Bir görevi başlatmak ve bağlantı noktasını almanın tek yolu, birfork()
yaparken "port takası dansı" gerçekleştirmektir.Bu, bağlantı noktasına erişim kısıtlamalarıdır (
AppleMobileFileIntegrity
ikilisindenmacos_task_policy
'den):Uygulamanın
com.apple.security.get-task-allow
yetkisi varsa, aynı kullanıcıdan işlemler görev bağlantı noktasına erişebilir (genellikle hata ayıklama için Xcode tarafından eklenir). Notarizasyon süreci bunu üretim sürümlerine izin vermez.com.apple.system-task-ports
yetkisine sahip uygulamalar, çekirdek hariç olmak üzere herhangi bir işlem için görev bağlantı noktasını alabilir. Daha eski sürümlerdetask_for_pid-allow
olarak adlandırılıyordu. Bu yalnızca Apple uygulamalarına verilir.Root, sertifikalı olmayan bir çalıştırma zamanıyla derlenmiş uygulamaların görev bağlantı noktalarına erişebilir (ve Apple'dan değil).
Görev adı bağlantı noktası: Görev bağlantı noktasının ayrıcalıklı olmayan bir sürümüdür. Görevi referans alır, ancak kontrol etmeye izin vermez. Yalnızca task_info()
aracılığıyla erişilebileceği görülen tek şey budur.
İş Parçacığı Bağlantı Noktaları
İş parçacıklarının da ilişkili bağlantı noktaları vardır ve bu bağlantı noktaları, task_threads
'i çağıran görev ve processor_set_threads
ile işlemci tarafından görülebilir. Bir iş parçacığı bağlantı noktasına BİRİM hakkı, thread_act
alt sistemindeki işlevleri kullanmaya izin verir, örneğin:
thread_terminate
thread_[get/set]_state
act_[get/set]_state
thread_[suspend/resume]
thread_info
...
Herhangi bir iş parçacığı, mach_thread_sef
'i çağırarak bu bağlantı noktasını alabilir.
Görev Bağlantı Noktası Aracılığıyla İş Parçacığına Kabuk Kodu Enjeksiyonu
Kabuk kodunu şuradan alabilirsiniz:
Introduction to ARM64v8İzinler.plist
Bu dosya, uygulamanın sistem kaynaklarına erişim düzeyini belirleyen yetkilendirme bilgilerini içerir. Bu yetkilendirmeler, uygulamanın hangi işlemleri gerçekleştirebileceğini ve hangi sistem kaynaklarına erişebileceğini belirler. Bu dosya, uygulamanın güvenliğini artırmak ve ayrıcalık yükseltme saldırılarını önlemek için önemlidir.
Önceki programı derleyin ve aynı kullanıcıyla kod enjekte etmek için yetkileri ekleyin (aksi halde sudo kullanmanız gerekecektir).
Last updated