想问下ipa包的加密方式

需求:
网上、书上都说AppStore下载的ipa包主程序都是加密的,PJ方法都是内存dump出来。
想问下大神们,这是一种什么加密方式,需要用到大绝招dump内存。能不能写个程序脚本什么的直接解出来,并解出多种arch来呢?如果是非对称加密,那可以把公钥提取出来解啊。

操作步骤: 没什么操作步骤。

1 个赞

你可以试试还原

算法在内核里是有的,还原出来的话这可能是个价值几个亿的灰产。 看好你哦

:grimacing: 那我大概知道了,可能现在的方法是相对快、简单的,只是想找下有没有现成研究的文章看看。

不至于吧 而且现在无需运行直接解密的算法在github开源着呢

用的是posix_spawn

1 个赞

这也是 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
4 个赞

太强了,学习了

你这不太对,“苹果会将一个特殊的4196字节长的头部加到已签名的二进制文件中”,这个不同账号AppStore下载同一应用的ipa包是一样的,不同的是sinf文件,里面可能记录了跟账号有关的信息。
“在安装应用时,iOS设备尝试使用这个密钥解密”,这也不对,只有在运行时才解密到内存,安装不解密。
你可以拿越狱手机试试。

其实这个只是验证软件签名,并不是解密ipa。

sinf购买返回加上纯净appstore包组合成。登陆账号好像在scinfo下生成对应密钥之类。
助手利用itune授权信息写入,把a账户授权信息同步到其他手机,在安装a账户购买收费应用。实现免费玩收费app。跟接账号一样。主要把a账号授权信息拿过来

我想知道主程序是怎么加密的 :thinking: