黄山区| 庐江| 齐齐哈尔| 大同县| 姜堰| 裕民| 武山| 洪江| 墨江| 易门| 宜兴| 翁牛特旗| 拜泉| 郫县| 绥滨| 正定| 博兴| 浑源| 广宁| 瑞安| 抚州| 彰武| 稻城| 青田| 泸定| 越西| 高阳| 林州| 普陀| 分宜| 济南| 饶阳| 河池| 博山| 拉孜| 邓州| 大名| 连平| 东至| 北宁| 武乡| 永丰| 昌宁| 惠阳| 勃利| 无棣| 勉县| 林口| 浠水| 沅陵| 若尔盖| 湛江| 刚察| 英山| 西安| 库伦旗| 项城| 新野| 湘东| 孝义| 顺义| 望城| 襄城| 阜新市| 南岔| 定远| 阿拉尔| 新郑| 阳曲| 扎囊| 贵溪| 靖州| 珲春| 栖霞| 莎车| 陆河| 郑州| 昭平| 黄岩| 丽水| 布尔津| 潮阳| 若羌| 和龙| 贵定| 潮南| 清涧| 王益| 富宁| 通道| 栾城| 肥乡| 房山| 彭水| 抚远| 子洲| 拜泉| 嘉黎| 华阴| 乌伊岭| 鄂州| 万荣| 南华| 太谷| 湖州| 费县| 佳木斯| 邕宁| 松江| 始兴| 金山屯| 珲春| 尖扎| 漳州| 江都| 阳信| 化隆| 新乡| 大港| 阿荣旗| 民权| 顺义| 湾里| 西畴| 资兴| 康定| 洛扎| 西宁| 通江| 开化| 会昌| 会泽| 富源| 三门峡| 隆化| 资阳| 林口| 睢县| 连云港| 临海| 贡山| 宽城| 八一镇| 丰城| 临夏市| 巴林右旗| 邵阳县| 旺苍| 翁牛特旗| 眉县| 黄骅| 陇南| 松阳| 都江堰| 四方台| 桦川| 五常| 合浦| 头屯河| 台州| 新郑| 麻栗坡| 福贡| 石渠| 老河口| 固镇| 乐陵| 祁阳| 大城| 阜平| 滦南| 敖汉旗| 富蕴| 弓长岭| 梅州| 吴川| 中山| 建阳| 剑河| 平南| 碌曲| 易县| 抚顺县| 信丰| 新平| 梨树| 新巴尔虎左旗| 德格| 乌伊岭| 九寨沟| 威县| 象州| 恩平| 冠县| 宜都| 格尔木| 开江| 花溪| 武都| 成安| 沾益| 龙陵| 临邑| 河源| 浮山| 永川| 龙川| 蒙山| 覃塘| 元谋| 中阳| 翁牛特旗| 延寿| 光山| 江津| 淇县| 应县| 宁国| 鹰潭| 房县| 凭祥| 巴南| 红河| 涿州| 讷河| 黔江| 宁化| 宿迁| 舒城| 滦平| 兰考| 肥乡| 宁武| 聂荣| 稷山| 旬阳| 临潼| 宜都| 泾县| 乌达| 塔城| 宽城| 扶余| 普兰店| 陵县| 攸县| 本溪市| 泗洪| 山西| 三门| 甘德| 咸阳| 西乡| 班戈| 灌南| 凤冈| 安龙| 逊克| 凤阳| 南丰| 潞西| 绥阳| 薛城| 城步| 澳门威尼斯人注册网址

“航空城砥柱?阎良好人”推荐评选活动--诚实守信

2018-04-21 04:30 来源:北国网

  “航空城砥柱?阎良好人”推荐评选活动--诚实守信

  多宝平台登录001”冯仕政说。王志刚说,作为科技部部长,现在想的是怎么把科技工作在国家发展大局中做好。

我们将借鉴学习发达城市经验,研究制定吸引和留住急需高端人才的特殊政策。“标准不是空中楼阁,我们现在习以为常的一切,都建立在标准之上。

  围绕促进国际人才“融得进”,本次新政也提出了多项配套服务政策。早在十几年前,袁承业就提出了要重视锂这种国家战略资源。

  ”“公司注册、场地选择、供水通电以及市场推广等,都得到各级政府部门的大力支持。要破除论资排辈、头衔崇拜,把品德、能力和业绩等作为发现评价人才的主要标准,为德才兼备、勇于创新的人才脱颖而出创造条件。

只有让更多技能人才有职业荣誉感、爱岗敬业,才能培养造就出更多的高技能人才,我国才能真正建成制造业强国。

  据悉,第四届大赛将采用校级初赛、省级复赛、全国总决赛三级赛制。

  2月28日,记者从沈阳市人社局获悉,为了引导各类人才来沈创新创业,沈阳市人社局、人才工作办公室、财政局联合印发了《紧缺急需人才需求目录编制和奖励补贴实施办法(试行)》。集聚之地打造人才发展新高地“年轻人的选择,代表了趋势。

  (通讯员钱雯徐丽君)

  中国如果不走创新驱动道路,新旧动能不能顺利转换,是不可能真正强大起来的,只能是大而不强。“只有会创新的国家,才能引领世界;只有会创新的企业,才能赢得未来;只有会创新的员工,才能站在更高的平台。

  王中深受感动,表示要将企业进一步做大做强,做精做细,为家乡的发展贡献力量。

  澳门在线娱乐网站“非常不容易,但这确实是作为后来者的我们必须经历并学习的。

  本次活动是长理工主动适应新时代高校“人才强校”战略的创新举措,对于学校提升师资队伍整体水平、推进内涵建设都具有重要而深远的意义。截至目前,该区累计办理专业技术资格证书1722人次,推荐企业154人申报职称。

  澳门葡京赌场在线 365bet最新网址 朋友圈都在这里买的

  “航空城砥柱?阎良好人”推荐评选活动--诚实守信

 
责编:

吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3110|回复: 37
上一主题 下一主题

“航空城砥柱?阎良好人”推荐评选活动--诚实守信

[复制链接]
跳转到指定楼层
楼主
发表于 2018-3-13 16:44 | 只看该作者 回帖奖励 |倒序浏览
联合娱乐 ”刘伟进一步指出。

在 iOS 平台上,从 App Store 下载的 App 会被 Apple 使用 FairPlay 技术加密,使得程序无法在其他未登录相同 AppleID 的设备上运行,起到 DRM 的作用。这样的文件同样也无法使用 IDA Pro 等工具进行分析。不管是出于安全研究还是再次分发的目的,都需要获取未加密的二进制文件,这一过程俗称砸壳。

</br>砸壳工具林林总总,核心原理其实一致:

</br>iOS/macOS 系统中,可执行文件、动态库等,都使用 DYLD 加载执行。在 iOS 系统中使用 DYLD 载入 App 时,会先进行 DRM 检查,检查通过则从 App 的可执行文件中,选择适合当前设备架构的 Mach-O 镜像进行解密,然后载入内存执行。dumpdecrypted 等脱壳工具,就是利用这一原理,从内存中将已解密的镜像 “dump” 出来,再生成新的镜像文件,从而达到解密的效果。其实 FairPlay 算法依托硬件设备足够强大,迄今为止还没有能够脱离 iDevice 解密的工具。

</br>dumpdecrypted.dylib 是由德国安全专家“树人”开发的一款砸壳工具,通过 DYLD_INSERT_LIBRARIES 的方式简单地完成砸壳工作。不过我这里分析的是 AloneMonkey 的修改版本,他在原有代码的基础上,把部分 print 改成了 NSLog,生成的 .decrypted 文件放到了 Documents 目录,最主要的是,替换了 _exit(1)return,这样,就不止会处理可执行程序的镜像文件,随后加载的 fremework、Dylib 也会被一同 Decrypt

</br>dumpdecrypted源码十分简单,带注释一共只有230行,三个 C 函数。下边就来分析一下它的实现原理。

入口

眼尖的同志可能一眼就发现了,源码里没有 main 函数(废话,毕竟编译出来就是个 dylib)。代码的入口是:

__attribute__((constructor))
static void dumpexecutable() {
    printf("mach-o decryption dumper\n\n");
    printf("DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.");
    _dyld_register_func_for_add_image(&image_added);
}

__attribute__ 这个关键字由 GCC 引入的,用于为函数设置特殊属性,具体可见这里。这里的 __attribute__((constructor))修饰的 dumpexecutable 函数,会在(目标App的)+load 方法之后, main 函数执行之前被自动调用。在函数里,除了输出两行提示消息以外,就是调用了一个 _dyld_register_func_for_add_image() 方法。

_dyld_register_func_for_add_image

_dyld_register_func_for_add_image 这个函数声明在 mach-o/dyld.h 文件里,如下:

/*
 * The following functions allow you to install callbacks which will be called   
 * by dyld whenever an image is loaded or unloaded.  During a call to _dyld_register_func_for_add_image()
 * the callback func is called for every existing image.  Later, it is called as each new image
 * is loaded and bound (but initializers not yet run).  The callback registered with
 * _dyld_register_func_for_remove_image() is called after any terminators in an image are run
 * and before the image is un-memory-mapped.
 */

extern void _dyld_register_func_for_add_image(void (*func)(const struct mach_header* mh, intptr_t vmaddr_slide))    __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);
extern void _dyld_register_func_for_remove_image(void (*func)(const struct mach_header* mh, intptr_t vmaddr_slide)) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);

从注释中可以知道,通过_dyld_register_func_for_add_image 注册的回调函数会在每次 dyld 加载镜像之后被调用。传递给回调函数的参数有两个:载入镜像的文件头:mach_header 和内存数量:vmaddr_slide。在本例中,dumpexecutable 函数中通过 _dyld_register_func_for_add_image 函数向 dyld 注册一个回调函数 image_added,每当 dyld 载入一个镜像(可以是可执行程序、动态库、Plugin等),dyld 会调用 image_added 函数,并将相应的 Mach-O header 和 vmaddr_slide 传递给 image_added。那么,image_added 里又干了啥呢?

image_added

image_added 方法依旧很短,只有三行,如下:

static void image_added(const struct mach_header *mh, intptr_t slide) {
    Dl_info image_info;
    int result = dladdr(mh, &image_info);
    dumptofile(image_info.dli_fname, mh);
}

Dl_info 结构体用于存储一些镜像的信息,比如路径,基址等等,它定义在 dlfcn.h 文件中,如下:

typedef struct dl_info {
    const char  *dli_fname;     /* Pathname of shared object */
    void        *dli_fbase;     /* Base address of shared object */
    const char  *dli_sname;     /* Name of nearest symbol */
    void        *dli_saddr;     /* Address of nearest symbol */
} Dl_info;

之后通过调用 dladdr 函数,从 Mach-O Header 中填充 Dl_info 结构体。接着把镜像路径和 Mach-O header传给了 dumptofile 方法,然后就没有了。

dumptofile

这是整个程序中最后也是最长的一个函数,在看这个函数的内容之前,我们先看看在它之前定义的一个宏:

#define swap32(value) (((value & 0xFF000000) >> 24) | ((value & 0x00FF0000) >> 8) | ((value & 0x0000FF00) << 8) | ((value & 0x000000FF) << 24) )

value=0x12345678 为例,简单说明下这个宏的作用:
0x12345678 写成二进制位的形式如下:

|31           24|23           16|15            8|7         bit 0|
+---------------+---------------+---------------+---------------+
|0 0 0 1 0 0 1 0|0 0 1 1 0 1 0 0|0 1 0 1 0 1 1 0|0 1 1 1 1 0 0 0|
+---------------+---------------+---------------+---------------+

0xFF000000 如下:

+---------------+---------------+---------------+---------------+
|1 1 1 1 1 1 1 1|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|
+---------------+---------------+---------------+---------------+

0x12345678 & 0xFF000000 按位与的结果:

+---------------+---------------+---------------+---------------+
|0 0 0 1 0 0 1 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|
+---------------+---------------+---------------+---------------+

然后右移24位:

+---------------+---------------+---------------+---------------+
|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 1 0 0 1 0|
+---------------+---------------+---------------+---------------+

结果就是,0x12345678 的高8位被移动到了低8位。之后的类似:

  0x12345678
& 0xFF000000
------------
  0x12000000 >> 24 = 0x00000012

  0x12345678
& 0x00FF0000
------------
  0x00340000 >> 8  = 0x00003400

  0x12345678
& 0x0000FF00
------------
  0x00005600 << 8  = 0x00560000

  0x12345678
& 0x000000FF
------------
  0x00340000 >> 24 = 0x78000000

                   | -----------
                   = 0x78563412

所以这个宏的功能就是:把数字从小端序转成大端序

回到正题:

首先是定义了一波要使用的变量:

struct load_command *lc;
struct encryption_info_command *eic;
struct fat_header *fh;
struct fat_arch *arch;
char buffer[1024];
char rpath[4096],npath[4096]; /* should be big enough for PATH_MAX */
unsigned int fileoffs = 0, off_cryptid = 0, restsize;
int i,fd,outfd,r,n,toread;
char *tmp;

然后是从传入的镜像路径中,获取镜像文件名,并输出。

if (realpath(path, rpath) == NULL) {
    strlcpy(rpath, path, sizeof(rpath));
}

/* extract basename */
tmp = strrchr(rpath, '/');
printf("\n\n");
if (tmp == NULL) {
    printf("[-] Unexpected error with filename.\n");
    _exit(1);
} else {
    printf("[+] Dumping %s\n", tmp+1);
}

做完了前边的定义和判断,下边就要开始真正地工作了,首先是通过文件头判断二进制文件架构:

/* detect if this is a arm64 binary */
if (mh->magic == MH_MAGIC_64) {
    lc = (struct load_command *)((unsigned char *)mh + sizeof(struct mach_header_64));
    NSLog(@"[+] detected 64bit ARM binary in memory.\n");
} else { /* we might want to check for other errors here, too */
    lc = (struct load_command *)((unsigned char *)mh + sizeof(struct mach_header));
    NSLog(@"[+] detected 32bit ARM binary in memory.\n");
}

mh 是一个 struct mach_header 结构体的指针,其定义如下:

/*
 * The 32-bit mach header appears at the very beginning of the object file for
 * 32-bit architectures.
 */
struct mach_header {
    uint32_t    magic;      /* mach magic number identifier */
    cpu_type_t  cputype;    /* cpu specifier */
    cpu_subtype_t   cpusubtype; /* machine specifier */
    uint32_t    filetype;   /* type of file */
    uint32_t    ncmds;      /* number of load commands */
    uint32_t    sizeofcmds; /* the size of all the load commands */
    uint32_t    flags;      /* flags */
};

/* Constant for the magic field of the mach_header (32-bit architectures) */
#define MH_MAGIC    0xfeedface  /* the mach magic number */
#define MH_CIGAM    0xcefaedfe  /* NXSwapInt(MH_MAGIC) */

/*
 * The 64-bit mach header appears at the very beginning of object files for
 * 64-bit architectures.
 */
struct mach_header_64 {
    uint32_t    magic;      /* mach magic number identifier */
    cpu_type_t  cputype;    /* cpu specifier */
    cpu_subtype_t   cpusubtype; /* machine specifier */
    uint32_t    filetype;   /* type of file */
    uint32_t    ncmds;      /* number of load commands */
    uint32_t    sizeofcmds; /* the size of all the load commands */
    uint32_t    flags;      /* flags */
    uint32_t    reserved;   /* reserved */
};

/* Constant for the magic field of the mach_header_64 (64-bit architectures) */
#define MH_MAGIC_64 0xfeedfacf /* the 64-bit mach magic number */

这里通过检查 magic 字段来检查当前镜像架构,之后是

lc = (struct load_command *)((unsigned char *)mh + sizeof(struct mach_header));

lc 是一个指向 struct load_command 结构体的指针,如下图所示,在Mach-O 文件中,LoadCommands位于 Header 之后,所以这里以 Header 的大小作为偏移算出来 LoadCommand 的起始地址并赋值给 lc

之后的这段有点儿长,我们从外向里看:循环遍历每一个 LoadComand,如果存在 LC_ENCRYPTION_INFO 这个 Command,说明当前镜像是进行过加密的,执行解密操作。否则代表当前镜像未加密,无需解密,程序结束运行。

/* searching all load commands for an LC_ENCRYPTION_INFO load command */
for (i=0; i<mh->ncmds; i++) {
    /*printf("Load Command (%d): %08x\n", i, lc->cmd);*/

    if (lc->cmd == LC_ENCRYPTION_INFO || lc->cmd == LC_ENCRYPTION_INFO_64) {
       ...
       return;
    }
    lc = (struct load_command *)((unsigned char *)lc + lc->cmdsize);
}
NSLog(@"[-] This mach-o file is not encrypted. Nothing was decrypted.\n");
return;

循环体中,在找到 LC_ENCRYPTION_INFO 之后,将 lc 强转为 struct encryption_info_command * 并赋值给 eic, 之后判断 cryptid 是否 0, 0 则表示未加密,跳出循环,程序结束。

eic = (struct encryption_info_command *)lc;

/* If this load command is present, but data is not crypted then exit */
if (eic->cryptid == 0) {
    break;
}

如果 cryptid 为 1,说明镜像是加密的,接着执行:
首先计算 cryptid 距镜像开始的偏移:

off_cryptid = (off_t)((void*)&eic->cryptid - (void*)mh;

NSLog(@"[+] offset to cryptid found: @%p(from %p) = %x\n", &eic->cryptid, mh, off_cryptid);

NSLog(@"[+] Found encrypted data at address %08x of length %u bytes - type %u.\n", eic->cryptoff, eic->cryptsize, eic->cryptid);

NSLog(@"[+] Opening %s for reading.\n", rpath);

然后以只读模式打开镜像文件,读入镜像文件头信息:

fd = open(rpath, O_RDONLY);
if (fd == -1) {
    NSLog(@"[-] Failed opening.\n");
    return;
}

NSLog(@"[+] Reading header\n");
n = read(fd, (void *)buffer, sizeof(buffer));
if (n != sizeof(buffer)) {
    NSLog(@"[W] Warning read only %d bytes\n", n);
}

NSLog(@"[+] Detecting header type\n");
fh = (struct fat_header *)buffer;

这里又出现了一个新的结构体: struct fat_header。FAT Bianry 是 iOS/macOS 系统上特有的一种文件格式,可以同时包含多种架构的二进制镜像,其文件结构如下:

可以看到,FAT Binary 就是将多个 Mach-O 镜像拼到一起之后,在最前边加了个 Fat Header。
可能你要问了,之前不是传进来一个 (struct mach_header *)mh 了嘛,这里为嘛还要自己读入一个呢?这里要注意了,传入的那个是 FAT Binary 中真正要读入到内存中执行的镜像的 Mach-O Header,而我们读入的,是整个 FAT Binary 的 FAT Header。FAT Header 定义如下:

#define FAT_MAGIC   0xcafebabe
#define FAT_CIGAM   0xbebafeca  /* NXSwapLong(FAT_MAGIC) */

struct fat_header {
    uint32_t    magic;      /* FAT_MAGIC or FAT_MAGIC_64 */
    uint32_t    nfat_arch;  /* number of structs that follow */
};

struct fat_arch {
    cpu_type_t  cputype;    /* cpu specifier (int) */
    cpu_subtype_t   cpusubtype; /* machine specifier (int) */
    uint32_t    offset;     /* file offset to this object file */
    uint32_t    size;       /* size of this object file */
    uint32_t    align;      /* alignment as a power of 2 */
};

其中 nfat_arch 字段,表示在 fat_header 之后,包含多少个 fat_arch 结构体,也就是包含多少个 Mach-O 镜像。

接着判断读出来的 FAT Header 中的 magic 字段,如果是 FAT_CIGAM,则表明当前镜像是一个 FAT Binary。否则判断是否是一个纯 Mach-O 镜像。如果都不是,则文件格式错误,程序结束。

如果镜像是 FAT Binary,循环遍历每一个 fat_arch,如果找到一个 fat_arch 中 cputype 和 subcputype 与传入的 mach_header(mh) 一致,则表明找到了当前加载镜像在 FAT Binary 中的位置。此时设置 fileoffs = (arch->offset)。注意,此处的 cputype、subcputype 和 offset 需要使用之前定义的 swap32 宏转为大端序再进行判断。

/* Is this a FAT file - we assume the right endianess */
if (fh->magic == FAT_CIGAM) {
    NSLog(@"[+] Executable is a FAT image - searching for right architecture\n");
    arch = (struct fat_arch *)&fh[1];
     for (i=0; i < swap32(fh->nfat_arch); i++) {
        if ((mh->cputype == swap32(arch->cputype)) && (mh->cpusubtype == swap32(arch->cpusubtype))) {
            fileoffs = swap32(arch->offset);
            NSLog(@"[+] Correct arch is at offset %u in the file\n", fileoffs);
            break;
        }
        arch++;
    }
    if (fileoffs == 0) {
        NSLog(@"[-] Could not find correct arch in FAT image\n");
        _exit(1);
    }
} else if (fh->magic == MH_MAGIC || fh->magic == MH_MAGIC_64) {
    NSLog(@"[+] Executable is a plain MACH-O image\n");
} else {
    NSLog(@"[-] Executable is of unknown type\n");
    return;
}

之后就是要生成解密之后的镜像了:
首先是要生成目标文件路径,如果在 Documents 目录下生成失败,则换个文件名重新生成,如果还失败,报错退出。

NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

strlcpy(npath, docPath.UTF8String, sizeof(npath));
strlcat(npath, tmp, sizeof(npath));
strlcat(npath, ".decrypted", sizeof(npath));
strlcpy(buffer, npath, sizeof(buffer));

NSLog(@"[+] Opening %s for writing.\n", npath);
outfd = open(npath, O_RDWR|O_CREAT|O_TRUNC, 0644);

if (outfd == -1) {
     if (strncmp("/private/var/mobile/Applications/", rpath, 33) == 0) {
         NSLog(@"[-] Failed opening. Most probably a sandbox issue. Trying something different.\n");

        /* create new name */
        strlcpy(npath, "/private/var/mobile/Applications/", sizeof(npath));
        tmp = strchr(rpath+33, '/');
        if (tmp == NULL) {
            NSLog(@"[-] Unexpected error with filename.\n");
            return;
        }
        tmp++;
        *tmp++ = 0;
        strlcat(npath, rpath+33, sizeof(npath));
        strlcat(npath, "tmp/", sizeof(npath));
        strlcat(npath, buffer, sizeof(npath));
        NSLog(@"[+] Opening %s for writing.\n", npath);
        outfd = open(npath, O_RDWR|O_CREAT|O_TRUNC, 0644);
     }
     if (outfd == -1) {
         NSLog(@"[-] Failed opening\n");
        return;
     }
}

开始写入文件,首先计算加密数据在新文件中的偏移:

/* calculate address of beginning of crypted data */
n = fileoffs + eic->cryptoff;

restsize = lseek(fd, 0, SEEK_END) - n - eic->cryptsize;

然后把文件指针设置到文件开头,写入 FAT Binary 的前 n 字节

lseek(fd, 0, SEEK_SET);
NSLog(@"[+] Copying the not encrypted start of the file\n");
/* first copy all the data before the encrypted data */
while (n > 0) {
    toread = (n > sizeof(buffer)) ? sizeof(buffer) : n;
    r = read(fd, buffer, toread);
    if (r != toread) {
        NSLog(@"[-] Error reading file\n");
        return;
    }
    n -= r;

    r = write(outfd, buffer, toread);
    if (r != toread) {
        NSLog(@"[-] Error writing file\n");
        return;
    }
}

接着把已解密的部分写入到文件中:

/* now write the previously encrypted data */
NSLog(@"[+] Dumping the decrypted data into the file\n");
r = write(outfd, (unsigned char *)mh + eic->cryptoff, eic->cryptsize);
if (r != eic->cryptsize) {
    NSLog(@"[-] Error writing file\n");
    return;
}

把剩下的部分(其他架构的镜像)写入到文件中:

/* and finish with the remainder of the file */
n = restsize;
lseek(fd, eic->cryptsize, SEEK_CUR);
NSLog(@"[+] Copying the not encrypted remainder of the file\n");
while (n > 0) {
    toread = (n > sizeof(buffer)) ? sizeof(buffer) : n;
    r = read(fd, buffer, toread);
    if (r != toread) {
        NSLog(@"[-] Error reading file\n");
        return;
    }
    n -= r;

    r = write(outfd, buffer, toread);
    if (r != toread) {
        NSLog(@"[-] Error writing file\n");
        return;
    }
}

最后,把已解密架构的 Mach-O header 中的 cryptid 字段置为 0, 表示未加密:

if (off_cryptid) {
    uint32_t zero=0;
    off_cryptid+=fileoffs;
    NSLog(@"[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset %x\n", off_cryptid);
    if (lseek(outfd, off_cryptid, SEEK_SET) != off_cryptid || write(outfd, &zero, 4) != 4) {
        NSLog(@"[-] Error writing cryptid value\n");
    }
}

关闭文件,程序退出:

NSLog(@"[+] Closing original file\n");
close(fd);
NSLog(@"[+] Closing dump file\n");
close(outfd);

return;

Enjoy.

我的博客: https://www.tylinux.com

免费评分

参与人数 9吾爱币 +10 热心值 +9 收起 理由
挖地球达人 + 1 + 1 谢谢@Thanks!膜拜大佬
wushaominkk + 1 我很赞同!
很快再相见123 + 1 + 1 我很赞同!
wmsuper + 2 + 1 谢谢@Thanks!
Ravey + 1 + 1 谢谢@Thanks!
samwang919 + 1 + 1 我很赞同!
pk8900 + 1 + 1 写的很详细,一看就懂。
Tim-52Pojie + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
VII’s + 2 + 1 欢迎大佬来到吾爱

查看全部评分

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

推荐
发表于 2018-3-15 08:18 | 只看该作者
虽然是个菜鸟,看得还不太懂,还是非常感谢楼主的分享和指导!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

推荐
发表于 2018-3-14 23:56 | 只看该作者
- -还是想找找有没有静态砸壳,动态好得找手机好麻烦

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

板凳
发表于 2018-3-13 18:23 | 只看该作者

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

报纸
发表于 2018-3-14 11:17 | 只看该作者
期待您更多作品!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

地板
发表于 2018-3-14 14:31 | 只看该作者
膜拜大佬先 一点一点学

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

7#
发表于 2018-3-14 14:56 | 只看该作者
mark一下,感谢分享~

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

8#
发表于 2018-3-14 16:01 | 只看该作者
多学一点,感谢分享~

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

9#
发表于 2018-3-14 16:43 | 只看该作者
不知所云

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

10#
发表于 2018-3-14 16:52 | 只看该作者
虽然不太懂但还是要帮顶

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

11#
发表于 2018-3-14 17:14 | 只看该作者
mark一下感谢分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

12#
发表于 2018-3-14 18:09 | 只看该作者
感谢大佬分享教程

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则


免责声明:
吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Service@52PoJie.Cn

快速回复 收藏帖子 返回列表 搜索

吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2018-4-19 13:37

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表
早点加盟品牌 特色早点小吃加盟店 美味早餐加盟 早点加盟店10大品牌 早点加盟小吃
早点快餐加盟店 全福早餐加盟 早点店加盟 加盟早点店 众望早餐加盟
早点 加盟 早饭加盟 早餐餐饮加盟 正宗早点加盟 舒心早餐加盟
全福早餐加盟 书店加盟 江西早点加盟 早餐 早餐包子店加盟
百度