Warm tip: This article is reproduced from serverfault.com, please click

iphone-如何获取正在运行的进程的信息?

(iphone - How to get mach-o uuid of a running process?)

发布于 2012-04-12 08:01:16

要在Mac上获取UUID,我可以使用

dwarfdump -u path/to/compile/executable

我也可以在“二进制图像”部分中通过简单的崩溃获取UUID

是在iOS设备上不崩溃而获得UUID的方法吗?

Questioner
Maxim Kholyavkin
Viewed
0
Nikolai Ruhe 2012-04-12 17:54:07

可执行文件(Mach-o文件)的UUID由链接器创建,ld并存储在名为的加载命令中LC_UUID你可以使用otool以下命令查看mach-o文件的所有加载命令

otool -l path_to_executable

> ...
> Load command 8
>      cmd LC_UUID
>  cmdsize 24
>     uuid 3AB82BF6-8F53-39A0-BE2D-D5AEA84D8BA6
> ...

任何进程都可以使用名为的全局符号访问其mach-o标头_mh_execute_header使用该符号,你可以遍历load命令进行搜索LC_UUID该命令的有效负载是UUID:

#import <mach-o/ldsyms.h>

NSString *executableUUID()
{
    const uint8_t *command = (const uint8_t *)(&_mh_execute_header + 1);
    for (uint32_t idx = 0; idx < _mh_execute_header.ncmds; ++idx) {
        if (((const struct load_command *)command)->cmd == LC_UUID) {
            command += sizeof(struct load_command);
            return [NSString stringWithFormat:@"%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X",
                    command[0], command[1], command[2], command[3],
                    command[4], command[5],
                    command[6], command[7],
                    command[8], command[9],
                    command[10], command[11], command[12], command[13], command[14], command[15]];
        } else {
            command += ((const struct load_command *)command)->cmdsize;
        }
    }
    return nil;
}