我最近研究了main的其他参数,我发现除了macOS上的argc、argv和envp之外,还有一个额外的char **apple选项。
显然,我做的第一件事就是快速遍历它:
int main(int argc, char ** argv, char ** envp, char ** apple)
{
puts("-----------------Apple-----------------");
for(char **a = apple; *a != 0; a++)
{
printf("%s\n", *a);
}
return 0;
}看看里面有什么:
-----------------Apple-----------------
executable_path=bin/apple
ptr_munge=
main_stack=
executable_file=0x1901000004,0x2ea3d0
dyld_file=0x1901000004,0xab575假设它们不是完全误导人的名字,我可以猜出其余的是什么,但我被ptr_munge弄糊涂了-那是什么,能用它做什么?(还有,所有额外的空格是用来做什么的?)
编辑:
好的,我找到了这个文件:kern_exec.c,其中包含以下内容:
/*
* libplatform needs a random pointer-obfuscation value when it is initialized.
*/
#define PTR_MUNGE_VALUES 1
#define PTR_MUNGE_KEY "ptr_munge="
...
/*
* Supply libpthread & libplatform with a random value to use for pointer
* obfuscation.
*/
error = exec_add_entropy_key(imgp, PTR_MUNGE_KEY, PTR_MUNGE_VALUES, FALSE);
if (error) {
goto bad;
}
imgp->ip_applec++;因此,我仍然不确定这在上下文中是什么意思(我的上下文中没有任何东西),但我可以遵循这个主题。
发布于 2019-03-09 07:30:00
它似乎被_setjmp()用来混淆存储在jmp_buf中的寄存器值(然后在_longjmp()中恢复它们)。这可能是一种安全/数据隐私功能。它似乎是在10.14中引入的。它不在10.13.x代码中。
请参阅代码here,例如:
LEAF(__setjmp, 0)
// %rdi is a jmp_buf (struct sigcontext *)
// now build sigcontext
movq %rbx, JB_RBX(%rdi)
movq %rbp, %rax
_OS_PTR_MUNGE(%rax)
movq %rax, JB_RBP(%rdi)
movq %r12, JB_R12(%rdi)
movq %r13, JB_R13(%rdi)
movq %r14, JB_R14(%rdi)
movq %r15, JB_R15(%rdi)
// RIP is set to the frame return address value
movq (%rsp), %rax
_OS_PTR_MUNGE(%rax)
movq %rax, JB_RIP(%rdi)
// RSP is set to the frame return address plus 8
leaq 8(%rsp), %rax
_OS_PTR_MUNGE(%rax)
movq %rax, JB_RSP(%rdi)
// save fp control word
fnstcw JB_FPCONTROL(%rdi)
// save MXCSR
stmxcsr JB_MXCSR(%rdi)
// return 0
xorl %eax, %eax
rethttps://stackoverflow.com/questions/55070933
复制相似问题