apple的main参数中的ptr_munge是什么?

Ask*_*ons 6 c macos

我最近在研究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;
}
Run Code Online (Sandbox Code Playgroud)

看看里面是什么:

-----------------Apple-----------------
executable_path=bin/apple



ptr_munge=
main_stack=
executable_file=0x1901000004,0x2ea3d0
dyld_file=0x1901000004,0xab575
Run Code Online (Sandbox Code Playgroud)

假设它们不是完全误导的名称,我可以猜出它们的其余部分是什么,但我有些困惑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++;
Run Code Online (Sandbox Code Playgroud)

因此,我仍然不确定上下文中的含义(我的内容中没有任何内容),但是我可以遵循此线程。

Ken*_*ses 3

它似乎用于混淆存储在jmp_bufby中的寄存器值_setjmp()(然后在 中恢复它们_longjmp())。这可能是一个安全/数据隐私功能。好像是10.14引入的。它不在 10.13.x 代码中。

请参阅此处的代码,例如:

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
    ret
Run Code Online (Sandbox Code Playgroud)