เชนเซเชฒเซ, เชนเซเชฌเซเชฐ! เชเชเซ เชนเซเช เชคเซ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซเช เชเซ เชคเชฎเซ เชเซเชตเซ เชฐเซเชคเซ macOS เชฎเชพเช เชนเซเชฎเชฒเชพเชเซเชฐเซ เชฆเซเชตเชพเชฐเชพ เชนเซเชฎเชฒเชพเชเชฅเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชจเซ เชธเซเชฐเชเซเชทเชฟเชค เชเชฐเซ เชถเชเซ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เช เชเชจเซเชเซเชตเชพเชฏเชฐเชธ เช เชฅเชตเชพ เชฌเซเชเช เชช เชธเชฟเชธเซเชเชฎ เชฎเชพเชเซ เชเชชเชฏเซเชเซ เชเซ, เชเชพเชธ เชเชฐเซเชจเซ เชเชพเชฐเชฃ เชเซ macOS เชนเซเช เชณ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ "เชฎเชพเชฐเชตเชพ" เชฎเชพเชเซ เชเชฃเซ เชฐเซเชคเซ เชเซ. เช เช เชจเซ เชเช เชนเซเช เชณ เชฐเชเซเชทเชฃ เชชเชฆเซเชงเชคเชฟเช เชตเชฟเชถเซ เชตเชพเชเชเซ.
เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ "เชฎเชพเชฐเชตเชพ" เชฎเชพเชเซเชจเซ เชเชคเซเชคเชฎ เชฐเซเชค
เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ "เชฎเชพเชฐเชตเชพ" เชฎเชพเชเซเชจเซ เชเชพเชฃเซเชคเซ เชฐเซเชค เช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช เชธเชฟเชเชเชฟเชฒ เชธเชฟเชเซเชจเชฒ เชฎเซเชเชฒเชตเชพเชจเซ เชเซ. bash เชฆเซเชตเชพเชฐเชพ เชคเชฎเซ เชฎเชพเชฐเชตเชพ เชฎเชพเชเซ เชฎเชพเชจเช "kill -SIGKILL PID" เช เชฅเชตเชพ "pkill -9 NAME" เชเซเชฒ เชเชฐเซ เชถเชเซ เชเซ. "เชเชฟเชฒ" เชเชฆเซเชถ UNIX เชจเชพ เชฆเชฟเชตเชธเซเชฅเซ เชเชพเชฃเซเชคเซ เชเซ เช เชจเซ เชคเซ เชฎเชพเชคเซเชฐ macOS เชชเชฐ เช เชจเชนเซเช, เชชเชฐเชเชคเซ เช เชจเซเชฏ UNIX เชเซเชตเซ เชธเชฟเชธเซเชเชฎเซเชธ เชชเชฐ เชชเชฃ เชเชชเชฒเชฌเซเชง เชเซ.
UNIX เชเซเชตเซ เชธเชฟเชธเซเชเชฎเชจเซ เชเซเชฎ, macOS เชคเชฎเชจเซ เชฌเซ เชธเชฟเชตเชพเชฏเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช เชเซเชเชชเชฃ เชธเชฟเชเซเชจเชฒเชจเซ เช เชเชเชพเชตเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ - SIGKILL เช เชจเซ SIGSTOP. เช เชฒเซเช เชฎเซเชเซเชฏเชคเซเชตเซ เชธเชฟเชเซเชจเชฒ เชคเชฐเซเชเซ SIGKILL เชธเชฟเชเซเชจเชฒ เชชเชฐ เชงเซเชฏเชพเชจ เชเซเชจเซเชฆเซเชฐเชฟเชค เชเชฐเชถเซ เชเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชฎเชพเชฐเซ เชจเชพเชเชตเชพเชจเซเช เชเชพเชฐเชฃ เชฌเชจเซ เชเซ.
macOS เชตเชฟเชถเชฟเชทเซเชเชคเชพเช
macOS เชชเชฐ, XNU เชเชฐเซเชจเชฒเชฎเชพเช เชเชฟเชฒ เชธเชฟเชธเซเชเชฎ เชเซเชฒ psignal(SIGKILL,...) เชซเชเชเซเชถเชจเชจเซ เชเซเชฒ เชเชฐเซ เชเซ. เชเชพเชฒเซ เช เชเซเชตเชพเชจเซ เชชเซเชฐเชฏเชคเซเชจ เชเชฐเซเช เชเซ เชฏเซเชเชฐเชธเซเชชเซเชธเชฎเชพเช เช เชจเซเชฏ เชเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเซเชฐเชฟเชฏเชพเชเชจเซ psignal เชซเชเชเซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชเชนเซ เชถเชเชพเชฏ. เชเชพเชฒเซ เชเชฐเซเชจเชฒเชจเซ เชเชเชคเชฐเชฟเช เชฎเชฟเชเซเชจเชฟเชเชฎเซเชธเชฎเชพเช เชธเชฟเชเซเชจเชฒ เชซเชเชเซเชถเชจ เชฎเชพเชเซเชจเชพ เชเซเชฒเซเชธเชจเซ เชจเซเชเชฆเชฃ เชเชฐเซเช (เชเซ เชเซ เชคเซ เชฌเชฟเชจ-เชคเซเชเซเช เชนเซเช เชถเชเซ เชเซ, เช เชฎเซ เชคเซเชจเซ เชฌเซเชเชพ เชฒเซเช เชฎเชพเชเซ เชเซเชกเซเชถเซเช ๐ - เชนเชธเซเชคเชพเชเซเชทเชฐ เชเชเชพเชธเชฃเซ, เชฎเซเชฎเชฐเซ เชญเซเชฒเซ, เชเชเซเชเชฟเช/เชเชฐเซเชฎเชฟเชจเซเช เชนเซเชจเซเชกเชฒเชฟเชเช, เชซเชพเชเชฒ เชธเชเชฐเชเซเชทเชฃ เชเชฒเซเชฒเชเชเชจ, เชตเชเซเชฐเซ. .
เชเชพเชฒเซ เชซเชเชเซเชถเชจ เช
เชจเซ เช
เชจเซเชฐเซเชช เชธเชฟเชธเซเชเชฎ เชเซเชฒ เชธเชพเชฅเซ เชธเชฎเซเชเซเชทเชพ เชถเชฐเซ เชเชฐเซเช
static int
terminate_with_payload_internal(struct proc *cur_proc, int target_pid, uint32_t reason_namespace,
uint64_t reason_code, user_addr_t payload, uint32_t payload_size,
user_addr_t reason_string, uint64_t reason_flags)
{
...
target_proc = proc_find(target_pid);
...
if (!cansignal(cur_proc, cur_cred, target_proc, SIGKILL)) {
proc_rele(target_proc);
return EPERM;
}
...
if (target_pid == cur_proc->p_pid) {
/*
* psignal_thread_with_reason() will pend a SIGKILL on the specified thread or
* return if the thread and/or task are already terminating. Either way, the
* current thread won't return to userspace.
*/
psignal_thread_with_reason(target_proc, current_thread(), SIGKILL, signal_reason);
} else {
psignal_with_reason(target_proc, SIGKILL, signal_reason);
}
...
}
เชฒเซเชจเซเช เชเชฐเซเชฏเซเช
เชธเชฟเชธเซเชเชฎ เชธเซเชเชพเชฐเซเชเช เชช เชชเชฐ เชกเชฟเชฎเชจ เชฌเชจเชพเชตเชตเชพเชจเซ เช เชจเซ เชคเซเชฎเชจเชพ เชเซเชตเชจเชเชพเชณเชจเซ เชจเชฟเชฏเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฎเชพเชฃเชญเซเชค เชฐเซเชค เชถเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชฎเชนเซเชฐเชฌเชพเชจเซ เชเชฐเซเชจเซ เชจเซเชเชง เชเชฐเซ เชเซ เชธเซเชคเซเชฐเซเชคเซ macOS 10.10 เชธเซเชงเซเชจเชพ เชฒเซเชจเซเชเชเซเชเชฒเชจเชพ เชเซเชจเชพ เชตเชฐเซเชเชจ เชฎเชพเชเซ เชเซ, เชเซเชก เชเชฆเชพเชนเชฐเชฃเซ เชเชฆเชพเชนเชฐเชฃเชฐเซเชช เชนเซเชคเซเช เชฎเชพเชเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชเซ. เชเชงเซเชจเชฟเช เชฒเซเชจเซเชเชธเซเชเซเชเชฒ เชเชเซเชธเชชเซเชธเซ เชฆเซเชตเชพเชฐเชพ เชฒเซเชจเซเช เชธเชฟเชเซเชจเชฒเซ เชฎเซเชเชฒเซ เชเซ, เชฒเซเชจเซเชเชธเซเชเซเชเชฒ เชฒเซเชเซเช เชคเซเชฎเชพเช เชเชธเซเชกเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ.
เชเชพเชฒเซ เชเซเชเช เชเซ เชเชชเซเชฒเชฟเชเซเชถเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชฌเชเชง เชฅเชพเชฏ เชเซ. SIGTERM เชธเชฟเชเซเชจเชฒ เชฎเซเชเชฒเชคเชพ เชชเชนเซเชฒเชพ, "proc_terminate" เชธเชฟเชธเซเชเชฎ เชเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชฐเซเชเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
<launchctl src/core.c>
...
error = proc_terminate(j->p, &sig);
if (error) {
job_log(j, LOG_ERR | LOG_CONSOLE, "Could not terminate job: %d: %s", error, strerror(error));
job_log(j, LOG_NOTICE | LOG_CONSOLE, "Using fallback option to terminate job...");
error = kill2(j->p, SIGTERM);
if (error) {
job_log(j, LOG_ERR, "Could not signal job: %d: %s", error, strerror(error));
}
...
<>
เชนเซเชก เชนเซเช เชณ, proc_terminate, เชคเซเชจเซเช เชจเชพเชฎ เชนเซเชตเชพ เชเชคเชพเช, SIGTERM เชธเชพเชฅเซ เชฎเชพเชคเซเชฐ psignal เช เชจเชนเซเช, SIGKILL เชชเชฃ เชฎเซเชเชฒเซ เชถเชเซ เชเซ.
เชชเชฐเซเชเซเชท เชเชฟเชฒ - เชธเชเชธเชพเชงเชจ เชฎเชฐเซเชฏเชพเชฆเชพ
เช
เชจเซเชฏ เชธเชฟเชธเซเชเชฎ เชเซเชฒเชฎเชพเช เชตเชงเซ เชฐเชธเชชเซเชฐเชฆ เชเซเชธ เชเซเช เชถเชเชพเชฏ เชเซ
เชเซ เชเซ เช เชธเชฟเชธเซเชเชฎ เชเซเชฒ เชธเชเชญเชตเชฟเชค เชฐเซเชชเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชจเชทเซเช เชเชฐเซ เชถเชเซ เชเซ, เชธเชฟเชธเซเชเชฎเซ เชธเชฟเชธเซเชเชฎ เชเซเชฒเชจเซ เชเซเชฒ เชเชฐเชคเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเชพ เช
เชงเชฟเชเชพเชฐเซเชจเซ เชชเซเชฐเชคเซ เชคเชชเชพเชธ เชเชฐเซ เชจเชฅเซ. เชเชฐเซเชเชฐ เชคเชชเชพเชธ เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
เชคเซเชฅเซ, เชเซ เชคเชฎเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเชพ CPU เชตเชชเชฐเชพเชถ เชเซเชตเซเชเชพเชจเซ "เชฎเชฐเซเชฏเชพเชฆเชฟเชค" เชเชฐเซ เชเซ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชซเชเซเชค 1 ns เชเชฒเชพเชตเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ), เชคเซ เชคเชฎเซ เชธเชฟเชธเซเชเชฎเชฎเชพเช เชเซเชเชชเชฃ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชจเชทเซเช เชเชฐเซ เชถเชเซ เชเซ. เชเชฎ, เชฎเซเชฒเชตเซเชฐ เชเชจเซเชเชฟเชตเชพเชฏเชฐเชธ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชธเชนเชฟเชค เชธเชฟเชธเซเชเชฎ เชชเชฐเชจเซ เชเซเชเชชเชฃ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชฎเชพเชฐเซ เชถเชเซ เชเซ. เชชเซเชก 1 (เชฒเซเชจเซเชเชธเซเชเซเชเชฒ) - เชธเชฟเชเชเชฟเชฒ เชธเชฟเชเซเชจเชฒ เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเชคเซ เชตเชเชคเซ เชเชฐเซเชจเชฒ เชเชญเชฐเชพเช เชธเชพเชฅเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชฎเชพเชฐเซ เชจเชพเชเชคเซ เชตเชเชคเซ เชฅเชคเซ เช เชธเชฐ เชชเชฃ เชฐเชธเชชเซเชฐเชฆ เชเซ :)
เชธเชฎเชธเซเชฏเชพ เชเซเชตเซ เชฐเซเชคเซ เชนเชฒ เชเชฐเชตเซ?
เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชฎเชพเชฐเชตเชพเชฅเซ เช เชเชเชพเชตเชตเชพเชจเซ เชธเซเชฅเซ เชธเชฐเชณ เชฐเชธเซเชคเซ เช เชเซ เชเซ เชธเชฟเชธเซเชเชฎ เชเซเชฒ เชเซเชฌเชฒเชฎเชพเช เชซเชเชเซเชถเชจ เชชเซเชเชจเซเชเชฐเชจเซ เชฌเชฆเชฒเชตเซเช. เชเชฎเชจเชธเซเชฌเซ, เช เชชเชฆเซเชงเชคเชฟ เชเชฃเชพ เชเชพเชฐเชฃเซเชธเชฐ เชฌเชฟเชจ-เชคเซเชเซเช เชเซ.
เชชเซเชฐเชฅเชฎ, เชชเซเชฐเชคเซเช เชเซ เชเซ sysent เชจเชพ เชฎเซเชฎเชฐเซ เชธเซเชฅเชพเชจเชจเซ เชจเชฟเชฏเชเชคเซเชฐเชฟเชค เชเชฐเซ เชเซ เชคเซ เชฎเชพเชคเซเชฐ XNU เชเชฐเซเชจเชฒ เชชเซเชฐเชคเซเช เชฎเชพเชเซ เชเชพเชจเชเซ เชจเชฅเซ, เชชเชฐเชเชคเซ เชเชฐเซเชจเชฒ เชชเซเชฐเชคเซเชเซเชฎเชพเช เชถเซเชงเซ เชถเชเชพเชคเซเช เชจเชฅเซ. เชคเชฎเชพเชฐเซ เชนเซเชฏเซเชฐเชฟเชธเซเชเชฟเช เชธเชฐเซเช เชชเชฆเซเชงเชคเชฟเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชชเชกเชถเซ, เชเซเชฎ เชเซ เชซเชเชเซเชถเชจเชจเซ เชเชคเชฟเชถเซเชฒ เชฐเซเชคเซ เชกเชฟเชธเชเชธเซเชฎเซเชฌเชฒ เชเชฐเชตเซเช เช เชจเซ เชคเซเชฎเชพเช เชชเซเชเชจเซเชเชฐ เชถเซเชงเชตเซเช.
เชฌเซเชเซเช, เชเซเชทเซเชเชเชฎเชพเช เชเชจเซเชเซเชฐเซเชเชจเซ เชฐเชเชจเชพ เช เชซเซเชฒเซเชเซเชธ เชชเชฐ เชเชงเชพเชฐ เชฐเชพเชเซ เชเซ เชเซเชจเซ เชธเชพเชฅเซ เชเชฐเซเชจเชฒเชจเซเช เชธเชเชเชฒเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช. เชเซ CONFIG_REQUIRES_U32_MUNGING เชงเซเชตเช เชเชพเชนเซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ, เชคเซ เชฌเชเชงเชพเชฐเชฃเชจเซเช เชเชฆ เชฌเชฆเชฒเชพเชถเซ - เชเช เชตเชงเชพเชฐเชพเชจเซเช เชซเซเชฒเซเชก เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ
struct sysent { /* system call table */
sy_call_t *sy_call; /* implementing function */
#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ && (__BIGGEST_ALIGNMENT__ > 4))
sy_munge_t *sy_arg_munge32; /* system call arguments munger for 32-bit process */
#endif
int32_t sy_return_type; /* system call return types */
int16_t sy_narg; /* number of args */
uint16_t sy_arg_bytes; /* Total size of arguments in bytes for
* 32-bit system calls
*/
};
เชธเชฆเชจเชธเซเชฌเซ, macOS เชจเชพ เชเชงเซเชจเชฟเช เชธเชเชธเซเชเชฐเชฃเซเชฎเชพเช, Apple เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชเช เชจเชตเซเช API เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ. เชเชจเซเชกเชชเซเชเชจเซเช เชธเชฟเชเซเชฏเซเชฐเชฟเชเซ API เชเซเชฒเชพเชฏเชเชเชจเซ เช เชจเซเชฏ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชฎเชพเชเซ เชเชฃเซ เชตเชฟเชจเชเชคเซเชเชจเซ เช เชงเชฟเชเซเชค เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. เชเชฎ, เชคเชฎเซ เชเชชเชฐเซเชเซเชค API เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ SIGKILL เชธเชฟเชเซเชจเชฒ เชธเชนเชฟเชคเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชฎเชพเชเซ เชเซเชเชชเชฃ เชธเชเชเซเชคเซเชจเซ เช เชตเชฐเซเชงเชฟเชค เชเชฐเซ เชถเชเซ เชเซ.
#include <bsm/libbsm.h>
#include <EndpointSecurity/EndpointSecurity.h>
#include <unistd.h>
int main(int argc, const char * argv[]) {
es_client_t* cli = nullptr;
{
auto res = es_new_client(&cli, ^(es_client_t * client, const es_message_t * message) {
switch (message->event_type) {
case ES_EVENT_TYPE_AUTH_SIGNAL:
{
auto& msg = message->event.signal;
auto target = msg.target;
auto& token = target->audit_token;
auto pid = audit_token_to_pid(token);
printf("signal '%d' sent to pid '%d'n", msg.sig, pid);
es_respond_auth_result(client, message, pid == getpid() ? ES_AUTH_RESULT_DENY : ES_AUTH_RESULT_ALLOW, false);
}
break;
default:
break;
}
});
}
{
es_event_type_t evs[] = { ES_EVENT_TYPE_AUTH_SIGNAL };
es_subscribe(cli, evs, sizeof(evs) / sizeof(*evs));
}
printf("%dn", getpid());
sleep(60); // could be replaced with other waiting primitive
es_unsubscribe_all(cli);
es_delete_client(cli);
return 0;
}
เชคเซเชตเซ เช เชฐเซเชคเซ, เชเชฐเซเชจเชฒเชฎเชพเช MAC เชชเซเชฒเชฟเชธเซ เชฐเชเซเชธเซเชเชฐ เชเชฐเซ เชถเชเชพเชฏ เชเซ, เชเซ เชธเชฟเชเซเชจเชฒ เชชเซเชฐเซเชเซเชเซเชถเชจ เชฎเซเชฅเชก (เชชเซเชฒเซเชธเซ proc_check_signal) เชชเซเชฐเซ เชชเชพเชกเซ เชเซ, เชชเชฐเชเชคเซ API เชธเชคเซเชคเชพเชตเชพเชฐ เชฐเซเชคเซ เชธเชชเซเชฐเซเชเซเชก เชจเชฅเซ.
เชเชฐเซเชจเชฒ เชเชเซเชธเซเชเซเชเชถเชจ เชฐเชเซเชทเชฃ
เชธเชฟเชธเซเชเชฎเชฎเชพเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชจเซเช เชฐเชเซเชทเชฃ เชเชฐเชตเชพ เชเชชเชฐเชพเชเชค, เชเชฐเซเชจเชฒ เชเชเซเชธเซเชเซเชเชถเชจ (kext)เชจเซเช เชฐเชเซเชทเชฃ เชเชฐเชตเซเช เชชเชฃ เชเชฐเซเชฐเซ เชเซ. macOS เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชจเซ IOKit เชเชชเชเชฐเชฃ เชกเซเชฐเชพเชเชตเชฐเซเชจเซ เชธเชฐเชณเชคเชพเชฅเซ เชตเชฟเชเชธเชพเชตเชตเชพ เชฎเชพเชเซเชจเซเช เชฎเชพเชณเชเซเช เชชเซเชฐเซเช เชชเชพเชกเซ เชเซ. เชเชชเชเชฐเชฃเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชธเชพเชงเชจเซ เชชเซเชฐเชพ เชชเชพเชกเชตเชพ เชเชชเชฐเชพเชเชค, IOKit C++ เชตเชฐเซเชเซเชจเชพ เชเชฆเชพเชนเชฐเชฃเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชกเซเชฐเชพเชเชตเชฐ เชธเซเชเซเชเซเชเช เชฎเชพเชเซเชจเซ เชชเชฆเซเชงเชคเชฟเช เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ. เชฏเซเชเชฐเชธเซเชชเซเชธเชฎเชพเช เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชฐเซเชจเชฒ-เชฏเซเชเชฐเชธเซเชชเซเชธ เชธเชเชฌเชเชง เชธเซเชฅเชพเชชเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชตเชฐเซเชเชจเชพ เชฐเชเชฟเชธเซเชเชฐเซเชก เชฆเชพเชเชฒเชพเชจเซ "เชถเซเชงเซ" เชถเชเชถเซ.
เชธเชฟเชธเซเชเชฎเชฎเชพเช เชตเชฐเซเชเชจเชพ เชฆเชพเชเชฒเชพเชเชจเซ เชธเชเชเซเชฏเชพ เชถเซเชงเชตเชพ เชฎเชพเชเซ, เชคเซเชฏเชพเช ioclasscount เชเชชเชฏเซเชเชฟเชคเชพ เชเซ.
my_kext_ioservice = 1
my_kext_iouserclient = 1
เชเซเชเชชเชฃ เชเชฐเซเชจเชฒ เชเชเซเชธเซเชเซเชเชถเชจ เชเซ เชเซ เชกเซเชฐเชพเชเชตเชฐ เชธเซเชเซเช เชธเชพเชฅเซ เชจเซเชเชงเชฃเซ เชเชฐเชพเชตเชตเชพ เชเชเซเชเซ เชเซ เชคเซเชฃเซ IOService เชฎเชพเชเชฅเซ เชตเชพเชฐเชธเชพเชฎเชพเช เชฎเซเชณเชตเซเชฒเชพ เชตเชฐเซเชเชจเซ เชเซเชทเชฃเชพ เชเชฐเชตเซ เชเซเชเช, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ my_kext_ioservice เช เชเชฟเชธเซเชธเชพเชฎเชพเช. เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเชชเซเชฒเชฟเชเซเชถเชจเซเชจเซ เชเชจเซเชเซเช เชเชฐเชตเชพเชฅเซ เชตเชฐเซเชเชจเชพ เชจเชตเชพ เชฆเชพเชเชฒเชพเชจเซ เชฐเชเชจเชพ เชฅเชพเชฏ เชเซ เชเซ IOUserClient เชชเชพเชธเซเชฅเซ เชตเชพเชฐเชธเชพเชฎเชพเช เชฎเชณเซ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ my_kext_iouserclient.
เชธเชฟเชธเซเชเชฎเชฎเชพเชเชฅเซ เชกเซเชฐเชพเชเชตเชฐเชจเซ เช เชจเชฒเซเชก เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเชคเซ เชตเชเชคเซ (kextunload เชเชฆเซเชถ), เชตเชฐเซเชเซเชฏเซเช เชฒ เชซเชเชเซเชถเชจ "เชฌเซเชฒ เชเชฐเซเชฎเชฟเชจเซเช(IOOptionBits เชตเชฟเชเชฒเซเชชเซ)" เชเชนเซเชตเชพเชฏ เชเซ. เชเซเชเซเชธเซเชเชจเชฒเซเชกเชจเซ เช เชเซเชทเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เช เชจเชฒเซเชก เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเชคเซ เชตเชเชคเซ เชธเชฎเชพเชชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซเชจเชพ เชเซเชฒ เชชเชฐ เชเซเชเชพ เชชเชฐเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชคเซ เชชเซเชฐเชคเซเช เชเซ.
bool Kext::terminate(IOOptionBits options)
{
if (!IsUnloadAllowed)
{
// Unload is not allowed, returning false
return false;
}
return super::terminate(options);
}
เชฒเซเชก เชเชฐเชคเซ เชตเชเชคเซ IsUnloadAllowed เชซเซเชฒเซเช IOUserClient เชฆเซเชตเชพเชฐเชพ เชธเซเช เชเชฐเซ เชถเชเชพเชฏ เชเซ. เชเซเชฏเชพเชฐเซ เชกเชพเชเชจเชฒเซเชก เชฎเชฐเซเชฏเชพเชฆเชพ เชนเซเชฏ, เชคเซเชฏเชพเชฐเซ kextunload เชเชฆเซเชถ เชจเซเชเซเชจเซเช เชเชเชเชชเซเช เชเชชเชถเซ:
admin@admins-Mac drivermanager % sudo kextunload ./test.kext
Password:
(kernel) Can't remove kext my.kext.test; services failed to terminate - 0xe00002c7.
Failed to unload my.kext.test - (iokit/common) unsupported function.
IOUserClient เชฎเชพเชเซ เชธเชฎเชพเชจ เชฐเชเซเชทเชฃ เชเชฐเชตเซเช เชเชตเชถเซเชฏเช เชเซ. IOKitLib เชฏเซเชเชฐเชธเซเชชเซเชธ เชซเชเชเซเชถเชจ "IOCatalogueTerminate(mach_port_t, uint32_t เชซเซเชฒเซเช, io_name_t เชตเชฐเซเชฃเชจ);" เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชตเชฐเซเชเซเชจเชพ เชเชฆเชพเชนเชฐเชฃเซเชจเซ เช เชจเชฒเซเชก เชเชฐเซ เชถเชเชพเชฏ เชเซ. เชเซเชฏเชพเช เชธเซเชงเซ เชฏเซเชเชฐเชธเซเชชเซเชธ เชเชชเซเชฒเซเชเซเชถเชจ โเชกเชพเชเชโ เชจ เชฅเชพเชฏ, เชเชเชฒเซ เชเซ โเชเซเชฒเชพเชเชจเซเชเชกเชพเชเชกโ เชซเชเชเซเชถเชจเชจเซ เชฌเซเชฒเชพเชตเชตเชพเชฎเชพเช เชจ เชเชตเซ เชคเซเชฏเชพเช เชธเซเชงเซ โเชเชฐเซเชฎเชฟเชจเซเชโ เชเชฆเซเชถเชจเซ เชเซเชฒ เชเชฐเชคเซ เชตเชเชคเซ เชคเชฎเซ เชเซเชเชพ เชชเชพเชเชพ เชเชตเซ เชถเชเซ เชเซ.
เชซเชพเชเชฒ เชฐเชเซเชทเชฃ
เชซเชพเชเชฒเซเชจเซ เชธเซเชฐเชเซเชทเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ, Kauth API เชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชคเซ เชชเซเชฐเชคเซเช เชเซ, เชเซ เชคเชฎเชจเซ เชซเชพเชเชฒเซเชจเซ เชเชเซเชธเซเชธเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. Apple เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชจเซ เชเชพเชฐเซเชฏเชเซเชทเซเชคเซเชฐเชฎเชพเช เชตเชฟเชตเชฟเชง เชเชตเซเชจเซเชเซเชธ เชตเชฟเชถเซ เชธเซเชเชจเชพเช เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ; เช เชฎเชพเชฐเชพ เชฎเชพเชเซ, KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA เช เชจเซ KAUTH_VNODE_DELETE_CHILD เชเชชเชฐเซเชถเชจเซเชธ เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ. เชซเชพเชเชฒเซเชจเซ เชเชเซเชธเซเชธเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเชฐเชตเชพเชจเซ เชธเซเชฅเซ เชธเชฐเชณ เชฐเซเชค เชชเชพเชฅ เชฆเซเชตเชพเชฐเชพ เชเซ - เช เชฎเซ เชซเชพเชเชฒเชจเซ เชชเชพเชฅ เชฎเซเชณเชตเชตเชพ เช เชจเซ เชชเชพเชฅ เชเชชเชธเชฐเซเชเชจเซ เชคเซเชฒเชจเชพ เชเชฐเชตเชพ เชฎเชพเชเซ "vn_getpath" API เชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช. เชจเซเชเชง เชเชฐเซ เชเซ เชซเชพเชเชฒ เชซเซเชฒเซเชกเชฐ เชชเชพเชฅเชจเชพ เชจเชพเชฎ เชฌเชฆเชฒเชตเชพเชจเซ เชเชชเซเชเชฟเชฎเชพเชเช เชเชฐเชตเชพ เชฎเชพเชเซ, เชธเชฟเชธเซเชเชฎ เชฆเชฐเซเช เชซเชพเชเชฒเชจเซ เชเชเซเชธเซเชธเชจเซ เช เชงเชฟเชเซเชค เชเชฐเชคเซ เชจเชฅเซ, เชชเชฐเชเชคเซ เชซเชเซเชค เชคเซ เชซเซเชฒเซเชกเชฐเชจเซ เช เชเซเชจเซเช เชจเชพเชฎ เชฌเชฆเชฒเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ. เชชเซเชฐเซเชจเซเช เชชเชพเชฅเชจเซ เชธเชฐเชเชพเชฎเชฃเซ เชเชฐเชตเซ เช เชจเซ เชคเซเชจเชพ เชฎเชพเชเซ KAUTH_VNODE_DELETE เชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเชฐเชตเซเช เชเชฐเซเชฐเซ เชเซ.
เช เช
เชญเชฟเชเชฎเชจเซ เชเซเชฐเชฒเชพเชญ เช เชจเซเชเซเช เชชเซเชฐเชฆเชฐเซเชถเชจ เชนเซเช เชถเชเซ เชเซ เชเชพเชฐเชฃ เชเซ เชเชชเชธเชฐเซเชเซเชจเซ เชธเชเชเซเชฏเชพ เชตเชงเซ เชเซ. เชคเซเชจเซ เชเชพเชคเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชเซ เชธเชฐเชเชพเชฎเชฃเซ O(เชเชชเชธเชฐเซเช*เชฒเชเชฌเชพเช) เชจเซ เชฌเชฐเชพเชฌเชฐ เชจเชฅเซ, เชเซเชฏเชพเช เชเชชเชธเชฐเซเช เช เชเชชเชธเชฐเซเชเชจเซ เชธเชเชเซเชฏเชพ เชเซ, เชฒเชเชฌเชพเช เช เชธเซเชเซเชฐเชฟเชเชเชจเซ เชฒเชเชฌเชพเช เชเซ, เชคเชฎเซ เชเชชเชธเชฐเซเช เชฆเซเชตเชพเชฐเชพ เชฌเชพเชเชงเชตเชพเชฎเชพเช เชเชตเซเชฒ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเชเซเชฎเซเชเชจ (DFA) เชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ.
เชเชพเชฒเซ เชเชชเซเชฒ เชเชชเชธเชฐเซเชเซเชจเชพ เชธเชฎเซเชน เชฎเชพเชเซ DFA เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซเชจเซ เชชเชฆเซเชงเชคเชฟเชจเซ เชตเชฟเชเชพเชฐ เชเชฐเซเช. เช เชฎเซ เชฆเชฐเซเช เชเชชเชธเชฐเซเชเชจเซ เชถเชฐเซเชเชคเชฎเชพเช เชเชฐเซเชธเชฐ เชถเชฐเซ เชเชฐเซเช เชเซเช. เชเซ เชฌเชงเชพ เชเชฐเซเชธเชฐ เชเช เช เช เชเซเชทเชฐ เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซเชถ เชเชฐเซ เชเซ, เชคเซ เชชเชเซ เชฆเชฐเซเช เชเชฐเซเชธเชฐเชจเซ เชเช เช เชเซเชทเชฐเชฅเซ เชตเชงเชพเชฐเซ เช เชจเซ เชฏเชพเชฆ เชฐเชพเชเซ เชเซ เชธเชฎเชพเชจ เชฐเซเชเชพเชจเซ เชฒเชเชฌเชพเช เชเชเชฅเซ เชตเชงเซ เชเซ. เชเซ เช เชฒเช-เช เชฒเช เชเชฟเชนเซเชจเซเชตเชพเชณเชพ เชฌเซ เชเชฐเซเชธเชฐ เชนเซเชฏ, เชคเซ เชคเซเช เชเซ เชชเซเชฐเชคเซเช เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซเชถ เชเชฐเซ เชเซ เชคเซ เชชเซเชฐเชฎเชพเชฃเซ เชเชฐเซเชธเชฐเชจเซ เชเซเชฅเซเชฎเชพเช เชตเชฟเชญเชพเชเซเชค เชเชฐเซ เช เชจเซ เชฆเชฐเซเช เชเซเชฅ เชฎเชพเชเซ เช เชฒเซเชเซเชฐเชฟเชงเชฎเชจเซเช เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เชเชฐเซ.
เชชเซเชฐเชฅเชฎ เชเชฟเชธเซเชธเชพเชฎเชพเช (เชเชฐเซเชธเชฐ เชนเซเช เชณเชจเชพ เชคเชฎเชพเชฎ เช เชเซเชทเชฐเซ เชธเชฎเชพเชจ เชเซ), เช เชฎเชจเซ DFA เชธเซเชฅเชฟเชคเชฟ เชฎเชณเซ เชเซ เชเซเชฎเชพเช เชธเชฎเชพเชจ เชฐเซเชเชพ เชธเชพเชฅเซ เชฎเชพเชคเซเชฐ เชเช เชธเชเชเซเชฐเชฎเชฃ เชนเซเชฏ เชเซ. เชฌเซเชเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เช เชฎเชจเซ เชซเชเชเซเชถเชจเชจเซ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชเซเชฒ เชเชฐเซเชจเซ เช เชจเซเชเชพเชฎเซ เชฐเชพเชเซเชฏเซเชฎเชพเช เชเชฆ 256 (เช เชเซเชทเชฐเซเชจเซ เชธเชเชเซเชฏเชพ เช เชจเซ เชเซเชฅเซเชจเซ เชฎเชนเชคเซเชคเชฎ เชธเชเชเซเชฏเชพ) เชจเชพ เชธเชเชเซเชฐเชฎเชฃเซเชจเซเช เชเซเชทเซเชเช เชฎเชณเซ เชเซ.
เชเชพเชฒเซ เชเช เชเชฆเชพเชนเชฐเชฃ เชเซเชเช. เชเชชเชธเชฐเซเชเซเชจเชพ เชธเชฎเซเชน เชฎเชพเชเซ (โ/foo/bar/tmp/โ, โ/var/db/foo/โ, โ/foo/bar/aba/โ, โfoo/bar/aac/โ) เชคเชฎเซ เชจเซเชเซเชจเชพ เชฎเซเชณเชตเซ เชถเชเซ เชเซ เชกเซเชเชซเช. เชเชเซเชคเชฟ เชซเชเซเชค เช เชจเซเชฏ เชฐเชพเชเซเชฏเซ เชคเชฐเชซ เชฆเซเชฐเซ เชเชคเชพ เชธเชเชเซเชฐเชฎเชฃเซ เชฆเชฐเซเชถเชพเชตเซ เชเซ; เช เชจเซเชฏ เชธเชเชเซเชฐเชฎเชฃเซ เช เชเชคเชฟเชฎ เชฐเชนเซเชถเซ เชจเชนเซเช.
เชเซเชฏเชพเชฐเซ DKA เชฐเชพเชเซเชฏเซเชฎเชพเชเชฅเซ เชชเชธเชพเชฐ เชฅเชพเชฏ เชเซ, เชคเซเชฏเชพเช 3 เชเซเชธ เชนเซเช เชถเชเซ เชเซ.
- เช เชเชคเชฟเชฎ เชธเซเชฅเชฟเชคเชฟ เชชเชนเซเชเชเซ เชเช เชเซ - เชชเชพเชฅ เชธเซเชฐเชเซเชทเชฟเชค เชเซ, เช เชฎเซ KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA เช เชจเซ KAUTH_VNODE_DELETE_CHILD เชเชชเชฐเซเชถเชจเซเชธเชจเซ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเชฐเซเช เชเซเช
- เช เชเชคเชฟเชฎ เชธเซเชฅเชฟเชคเชฟ เชธเซเชงเซ เชชเชนเซเชเชเซ เชจ เชนเชคเซ, เชชเชฐเชเชคเซ เชชเชพเชฅ โเชธเชฎเชพเชชเซเชคโ (เชจเชฒ เชเชฐเซเชฎเชฟเชจเซเชเชฐ เชชเชนเซเชเชเซ เชเชฏเซ เชนเชคเซ) - เชชเชพเชฅ เช เชชเซเชฐเซเชจเซเช เชเซ, เชคเซ KAUTH_VNODE_DELETE เชจเซ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเชฐเชตเซเช เชเชฐเซเชฐเซ เชเซ. เชจเซเชเชง เชเชฐเซ เชเซ เชเซ vnode เช เชซเซเชฒเซเชกเชฐ เชเซ, เชคเซ เชคเชฎเชพเชฐเซ เช เชเชคเซ '/' เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, เช เชจเซเชฏเชฅเชพ เชคเซ เชคเซเชจเซ โ/foor/bar/tโ เชซเชพเชเชฒ เชธเซเชงเซ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเชฐเซ เชถเชเซ เชเซ, เชเซ เชเซเชเซเช เชเซ.
- เช เชเชคเชฟเชฎ เช เชตเชธเซเชฅเชพ เชชเชฐ เชชเชนเซเชเชเซ เชจ เชนเชคเซ, เชฎเชพเชฐเซเช เชธเชฎเชพเชชเซเชค เชฅเชฏเซ เชจ เชนเชคเซ. เชเซเชเชชเชฃ เชเชชเชธเชฐเซเช เช เชธเชพเชฅเซ เชฎเซเชณ เชเชพเชคเซ เชจเชฅเซ, เช เชฎเซ เชชเซเชฐเชคเชฟเชฌเชเชงเซ เชฐเชเซ เชเชฐเชคเชพ เชจเชฅเซ.
เชจเชฟเชทเซเชเชฐเซเชท
เชตเชฟเชเชธเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชฐเชนเซเชฒเชพ เชธเซเชฐเชเซเชทเชพ เชเชเซเชฒเซเชจเซ เชงเซเชฏเซเชฏ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เช เชจเซ เชคเซเชจเชพ เชกเซเชเชพเชจเซ เชธเซเชฐเชเซเชทเชพเชจเชพ เชธเซเชคเชฐเชจเซ เชตเชงเชพเชฐเชตเชพเชจเซ เชเซ. เชเช เชคเชฐเชซ, เช เชงเซเชฏเซเชฏ เชเชเซเชฐเซเชจเชฟเชธ เชธเซเชซเซเชเชตเซเชฐ เชชเซเชฐเซเชกเชเซเชเชจเชพ เชตเชฟเชเชพเชธ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เชเซ, เชเซ เชคเซ เชจเชฌเชณเชพเชเชเชจเซ เชฌเชเชง เชเชฐเซ เชเซ เชเซเชฏเชพเช เชเชชเชฐเซเชเชฟเชเช เชธเชฟเชธเซเชเชฎ เชชเซเชคเซ "เชจเชฌเชณเซ" เชเซ. เชฌเซเชเซ เชฌเชพเชเซ, เชเชชเชฃเซ เชคเซ เชธเซเชฐเชเซเชทเชพ เชชเชพเชธเชพเชเชจเซ เชฎเชเชฌเซเชค เชฌเชจเชพเชตเชตเชพเชจเซ เช เชตเชเชฃเชจเชพ เชจ เชเชฐเชตเซ เชเซเชเช เชเซ OS เชฌเชพเชเซเช เชธเซเชงเชพเชฐเซ เชถเชเชพเชฏ เชเซ, เชเชพเชธ เชเชฐเซเชจเซ เชเชพเชฐเชฃ เชเซ เชเชตเซ เชจเชฌเชณเชพเชเชเชจเซ เชฌเชเชง เชเชฐเชตเชพเชฅเซ เชเชคเซเชชเชพเชฆเชจ เชคเชฐเซเชเซ เชเชชเชฃเซ เชชเซเชคเชพเชจเซ เชธเซเชฅเชฟเชฐเชคเชพ เชตเชงเซ เชเซ. เชจเชฌเชณเชพเชเชจเซ เชเชพเชฃ Apple เชเชคเซเชชเชพเชฆเชจ เชธเซเชฐเชเซเชทเชพ เชเซเชฎเชจเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ เช เชจเซ เชคเซเชจเซ macOS 10.14.5 (https://support.apple.com/en-gb/HT210119) เชฎเชพเช เช เซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เช เชฌเชงเซเช เชซเชเซเชค เชคเซเชฏเชพเชฐเซ เช เชฅเช เชถเชเซ เชเซ เชเซ เชคเชฎเชพเชฐเซ เชเชชเชฏเซเชเชฟเชคเชพ เชเชฐเซเชจเชฒเชฎเชพเช เชธเชคเซเชคเชพเชตเชพเชฐ เชฐเซเชคเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเซเชฏ. เชเชเชฒเซ เชเซ, เชฌเชพเชนเซเชฏ เช
เชจเซ เช
เชจเชฟเชเซเชเชจเซเชฏ เชธเซเชซเซเชเชตเซเชฐ เชฎเชพเชเซ เชเชตเซ เชเซเช เชเชเชเชฌเชพเชฐเซเช เชจเชฅเซ. เชเซ เชเซ, เชคเชฎเซ เชเซเช เชถเชเซ เชเซ, เชเชจเซเชเซเชตเชพเชฏเชฐเชธ เช
เชจเซ เชฌเซเชเช
เชช เชธเชฟเชธเซเชเชฎเซเชธ เชเซเชตเชพ เชเชพเชฏเชฆเซเชธเชฐ เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธเชจเซ เชธเซเชฐเชเซเชทเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชชเชฃ เชเชพเชฐเซเชฏเชจเซ เชเชฐเซเชฐ เชเซ. เชชเชฐเชเชคเซ เชนเชตเซ macOS เชฎเชพเชเซ เชจเชตเชพ Acronis เชเชคเซเชชเชพเชฆเชจเซเชฎเชพเช เชธเชฟเชธเซเชเชฎเชฎเชพเชเชฅเซ เช
เชจเชฒเซเชกเชฟเชเช เชธเชพเชฎเซ เชตเชงเชพเชฐเชพเชจเซ เชธเซเชฐเชเซเชทเชพ เชนเชถเซ.
เชธเซเชฐเซเชธ: www.habr.com