针对Macho文件如何通过_dyld_get_image_header及其偏移量定位到对应的方法

需求:
本人在学习逆向的过程中阅读到如下代码,由于知识储备不够,因此想请教一二。
代码:

void *targetMethod = NULL;
void init()
{
	const char *path = "XXXUI";
	uint32_t i;
    for (i = 0; i < _dyld_image_count(); i++)
    {
        if (strstr(_dyld_get_image_name(i), path) != 0)
            break;
    }
const struct mach_header *targetHeader = _dyld_get_image_header(i);
targetMethod = (char *)targetHeader + 0x1234c5;

}

static void attribute((noinline)) attribute((naked)) exec_target_method(void *f, char *ret)
{
asm volatile(“stp x29, x30, [sp, -0x10]!”);
asm volatile(“mov x2, x0”);
asm volatile(“mov x0, x1”);
asm volatile(“blr x2”);
asm volatile(“ldp x29, x30, [sp], 0x10”);
asm volatile(“ret”);
}

void doExec()
{
char value[128];
memset(szr, 0, sizeof(value));
exec_target_method(targetMethod, (char *)value);
int *pv = (int *)value;
NSLog(@“return value is %0x----%0x----%0x”, pv[0], pv[1], pv[2]);
}

操作步骤:
本人对该代码的认识如下:
(1)init方法先遍历内存中加载的模块,并通过对比模块的名称来获取到目标模块。然后通过_dyld_get_image_header方法来获取内存中目标模块的头部指针targetHeader。最后通过在头部指针targetHeader上加一个偏移量0x1234c5来获取到目标方法的地址。
** 任何其他描述: (描述问题的现象,等等)
(2)exec_target_method方法通过裸函数( attribute((naked)) )的方式直接通过汇编语言来调用init方法中获取到的方法地址(blr x2)。并将结果ret返回。
(3)doExec是最终的执行方法,向exec_target_method中传递目标方法地址和目标入参,并在方法执行完毕后打印返回结果。
问题归纳:
(1)请问上述对代码的认识是否正确?因为本人现在的逆向知识仅限于书中,现在阅读这样的代码还是有点吃力,有些理解是通过网上搜索获得。
(2)关于init方法中通过_dyld_get_image_header获取的目标模块头部指针和通过偏移量获取到的目标方法指针,如何通过这两个指针在IDA或者Hopper中定位到目标方法?
(3)偏移值0x1234c5当初是如何计算出来的?
(4)可以熟练阅读并编写上述代码需要的深入了解学习的知识点有哪些?本人在逆向学习的过程中深感学得越多,自己尚未了解和需要掌握的知识点越多,因此,对于需要深入学习哪些知识有些迷茫,还望不吝赐教,谢谢!

  1. 先说内存映射规则, 是按照 segment 进行内存映射并进行页对齐, macho-header 属于 __TEXT segment, 所以一个函数的地址在 runtime 时的地址为 __TEXT 的加载地址 + 函数的在文件中的偏移地址. 由于正好 macho header 属于 __TEXT segment, 所以直接使用 _dyld_get_image_header 就是 __TEXT 的加载地址.

  2. 那一段内联汇编实现函数调用, 其实也可以改为强制类型转换为函数类型后直接调用(如果知道函数的 signature)

函数的在文件中的偏移地址,32位和64位上的地址是不一样的吗?不同机型、不同系统库里的地址应该也不一样吧,这样就要针对这么多种情况分别处理了

感谢解惑。
请问我现在如何通过“函数在文件中的偏移地址”在IDA或者Hopper中确定函数的具体位置呢?因为我想定位到这个函数的位置后深入了解一下函数的具体实现。谢谢了~。
ps:Hopper打开目标模块后显示的Header如下,函数的具体位置是000000018e7bc000+偏移量吗?我试着定位了一下感觉定位到的不是一个函数体:joy:

000000018e7bc000 struct __macho_header64 {
0xfeedfacf, // mach magic number identifier
0x100000c, // cpu specifier
0x0, // machine specifier
0x6, // type of file
42, // number of load commands
5632, // the size of all the load commands
0x82000085, // flags
0x0 // reserved
}