如何在iOS中查找文本段范围

如何在iOS中查找文本段范围,ios,iphone,ipad,memory,low-level,Ios,Iphone,Ipad,Memory,Low Level,如何在iOS中找到文本段(又称代码段)范围?意思是,文本段的起始地址和结束地址是什么 我发现,但它在Android上对我有效,但在iOS上不起作用。经过一些挖掘和专家帮助(感谢Moshe Kravchik),我找到了理想的解决方案-通过解析mach标头并检索加载命令、段和段来获得文本段范围 #include <mach-o/dyld.h> #include <stdio.h> #include <stdlib.h> #include <string.h&

如何在iOS中找到文本段(又称代码段)范围?意思是,文本段的起始地址和结束地址是什么


我发现,但它在Android上对我有效,但在iOS上不起作用。

经过一些挖掘和专家帮助(感谢Moshe Kravchik),我找到了理想的解决方案-通过解析mach标头并检索加载命令、段和段来获得文本段范围

#include <mach-o/dyld.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#import <Foundation/Foundation.h>

#define PRINT_STR "Found __text Section of %s, addr 0x%x, size %u, offset 0x%x, calc address 0x%x"
#define LC_SEGMENT_NATIVE LC_SEGMENT
#define segment_command_native segment_command
#define section_native section

struct libRange
{
    uint32_t start;
    uint32_t end;
};

void getTextSegmentAddr(struct libRange *txtSegRange)
{
    if (txtSegRange==NULL)
        return;

    txtSegRange->start=0;

    const struct mach_header *mach_hdr;
    mach_hdr = _dyld_get_image_header(0);                           

    const struct load_command *cmds = (const struct load_command *)(mach_hdr + 1);
    uint32_t cmdsleft;
    const struct load_command *lc;

    for(lc = cmds, cmdsleft = mach_hdr->ncmds; cmdsleft-- && (0 == txtSegRange->start);) {
            if(lc->cmd == LC_SEGMENT_NATIVE) {
                    const struct segment_command_native *sc = (void *) lc;
                    const struct section_native *sect = (void *) (sc + 1);
                    for(uint32_t sect_idx = 0; sect_idx < sc->nsects; sect_idx++) {
                            if(!strcmp("__TEXT", sect->segname) && !strcmp("__text", sect->sectname)) {
                                    uint32_t memAddr = (sc->vmaddr + _dyld_get_image_vmaddr_slide(0) + sect->offset - sc->fileoff);                                                                                                   
                                    NSLog(@PRINT_STR,_dyld_get_image_name(0), sect->addr, sect->size, sect->offset, memAddr);                                                                                           
                                    txtSegRange->start = memAddr;                                                                                            
                                    txtSegRange->end = memAddr + sect->size;
                                    break;
                             }
                             sect++;    
                    }
            }
            lc = (void *) ((char *) lc + lc->cmdsize);
    }
}

int main()
{
    struct libRange txtSegRange;
    getTextSegmentAddr(&txtSegRange);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#进口
#定义打印\u STR“找到%s的\u文本部分,地址0x%x,大小%u,偏移量0x%x,计算地址0x%x”
#定义LC_段\本地LC_段
#定义段\命令\本机段\命令
#定义节\u本机节
结构图书馆
{
uint32\u t启动;
uint32_t end;
};
void getTextSegmentAddr(结构库*txtSegRange)
{
if(txtSegRange==NULL)
返回;
txtSegRange->start=0;
const struct mach_header*mach_hdr;
mach\u hdr=\u dyld\u get\u image\u头(0);
常量结构加载命令*cmds=(常量结构加载命令*)(马赫数hdr+1);
uint32_t cmdsleft;
const struct load_命令*lc;
对于(lc=cmds,cmdsleft=mach_hdr->ncmds;cmdsleft--&&(0==txtSegRange->start);){
如果(lc->cmd==lc\U段\U本机){
const struct segment_command_native*sc=(void*)lc;
const struct section_native*sect=(void*)(sc+1);
对于(uint32\u t sect\u idx=0;sect\u idxnsects;sect\u idx++){
如果(!strcmp(“\uuu TEXT”,sect->segname)和&!strcmp(\uu TEXT,sect->sectname)){
uint32_t memAddr=(sc->vmaddr+_dyld\u get\u image\u vmaddr\u幻灯片(0)+sect->offset-sc->fileoff);
NSLog(@PRINT\u STR,\u dyld\u get\u image\u name(0),sect->addr,sect->size,sect->offset,memAddr);
txtSegRange->start=memAddr;
txtSegRange->end=memAddr+sect->size;
打破
}
sect++;
}
}
lc=(void*)((char*)lc+lc->cmdsize);
}
}
int main()
{
结构库txtSegRange;
getTextSegmentAddr(&txtSegRange);
返回0;
}
适用于linux和windows,但不适用于iOS。