需求:
网上、书上都说AppStore下载的ipa包主程序都是加密的,PJ方法都是内存dump出来。
想问下大神们,这是一种什么加密方式,需要用到大绝招dump内存。能不能写个程序脚本什么的直接解出来,并解出多种arch来呢?如果是非对称加密,那可以把公钥提取出来解啊。
操作步骤: 没什么操作步骤。
需求:
网上、书上都说AppStore下载的ipa包主程序都是加密的,PJ方法都是内存dump出来。
想问下大神们,这是一种什么加密方式,需要用到大绝招dump内存。能不能写个程序脚本什么的直接解出来,并解出多种arch来呢?如果是非对称加密,那可以把公钥提取出来解啊。
操作步骤: 没什么操作步骤。
你可以试试还原
算法在内核里是有的,还原出来的话这可能是个价值几个亿的灰产。 看好你哦
那我大概知道了,可能现在的方法是相对快、简单的,只是想找下有没有现成研究的文章看看。
不至于吧 而且现在无需运行直接解密的算法在github开源着呢
用的是posix_spawn
这也是 posix_spawn 再dump内存的。
这个走的是也是内核啊宝贝
内核级加密,不用想了,每台设备的密钥不一样。
简单来说,当从 AppStore下载应用程序时,苹果会将一个特殊的4196字节长的头部加到已签名的二进制文件中,该二进制文件使用与你的iTunes帐户关联的公钥加密。该密钥对在你创建iTunes帐户时生成,并在使用iTunes帐户或Apple ID登录时转移到iOS设备,这是Apple FairPlay DRM的一部分。在安装应用时,iOS设备尝试使用这个密钥解密,如果应用不是使用对应账号从App Store下载的则无法解密。
内核中对 macho 文件的解析可以参考:
相关代码如下:
#if CONFIG_CODE_DECRYPTION
case LC_ENCRYPTION_INFO:
case LC_ENCRYPTION_INFO_64:
if (pass != 3)
break;
ret = set_code_unprotect(
(struct encryption_info_command *) lcp,
addr, map, slide, vp, file_offset,
header->cputype, header->cpusubtype);
if (ret != LOAD_SUCCESS) {
os_reason_t load_failure_reason = OS_REASON_NULL;
printf("proc %d: set_code_unprotect() error %d "
"for file \"%s\"\n",
p->p_pid, ret, vp->v_name);
/*
* Don't let the app run if it's
* encrypted but we failed to set up the
* decrypter. If the keys are missing it will
* return LOAD_DECRYPTFAIL.
*/
if (ret == LOAD_DECRYPTFAIL) {
/* failed to load due to missing FP keys */
proc_lock(p);
p->p_lflag |= P_LTERM_DECRYPTFAIL;
proc_unlock(p);
KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_PROC, BSD_PROC_EXITREASON_CREATE) | DBG_FUNC_NONE,
p->p_pid, OS_REASON_EXEC, EXEC_EXIT_REASON_FAIRPLAY_DECRYPT, 0, 0);
load_failure_reason = os_reason_create(OS_REASON_EXEC, EXEC_EXIT_REASON_FAIRPLAY_DECRYPT);
} else {
KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_PROC, BSD_PROC_EXITREASON_CREATE) | DBG_FUNC_NONE,
p->p_pid, OS_REASON_EXEC, EXEC_EXIT_REASON_DECRYPT, 0, 0);
load_failure_reason = os_reason_create(OS_REASON_EXEC, EXEC_EXIT_REASON_DECRYPT);
}
assert(load_failure_reason != OS_REASON_NULL);
psignal_with_reason(p, SIGKILL, load_failure_reason);
}
break;
#endif
太强了,学习了
你这不太对,“苹果会将一个特殊的4196字节长的头部加到已签名的二进制文件中”,这个不同账号AppStore下载同一应用的ipa包是一样的,不同的是sinf文件,里面可能记录了跟账号有关的信息。
“在安装应用时,iOS设备尝试使用这个密钥解密”,这也不对,只有在运行时才解密到内存,安装不解密。
你可以拿越狱手机试试。
其实这个只是验证软件签名,并不是解密ipa。
sinf购买返回加上纯净appstore包组合成。登陆账号好像在scinfo下生成对应密钥之类。
助手利用itune授权信息写入,把a账户授权信息同步到其他手机,在安装a账户购买收费应用。实现免费玩收费app。跟接账号一样。主要把a账号授权信息拿过来
我想知道主程序是怎么加密的