Quantcast
Channel: 睿论坛 - 最新话题
Viewing all articles
Browse latest Browse all 5702

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

$
0
0

@SpringMorning wrote:

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

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)可以熟练阅读并编写上述代码需要的深入了解学习的知识点有哪些?本人在逆向学习的过程中深感学得越多,自己尚未了解和需要掌握的知识点越多,因此,对于需要深入学习哪些知识有些迷茫,还望不吝赐教,谢谢!

Posts: 1

Participants: 1

Read full topic


Viewing all articles
Browse latest Browse all 5702

Trending Articles