老设备之家

找回密码
立即注册
搜索
热搜: iOSIPA 美化
发新帖

311

积分

0

好友

5

主题
发表于 昨天 15:47 | 查看: 15| 回复: 0
爱思助手的一键越狱软件,内部存在上传签名证书到服务器的行为


函数: sub_430A90(IDA Pro 9)

伪代码:
  1. void __thiscall sub_430A90(
  2.         void *this,
  3.         char a2,
  4.         int a3,
  5.         int a4,
  6.         int a5,
  7.         int a6,
  8.         int a7,
  9.         int a8,
  10.         int a9,
  11.         int a10,
  12.         int a11,
  13.         int a12,
  14.         int a13,
  15.         int a14,
  16.         int a15,
  17.         int a16,
  18.         int a17,
  19.         int a18,
  20.         int a19,
  21.         int a20,
  22.         int a21,
  23.         int a22,
  24.         int a23,
  25.         int a24,
  26.         int a25,
  27.         int a26,
  28.         int a27,
  29.         int a28,
  30.         int a29,
  31.         int a30,
  32.         char a31,
  33.         __int64 a32,
  34.         int a33,
  35.         int a34,
  36.         int a35,
  37.         void *a36,
  38.         int a37,
  39.         int a38,
  40.         int a39,
  41.         int a40,
  42.         unsigned int a41,
  43.         int a42,
  44.         void *a43,
  45.         int a44,
  46.         int a45,
  47.         int a46,
  48.         int a47,
  49.         unsigned int a48,
  50.         int a49,
  51.         int a50,
  52.         char *a51,
  53.         int a52,
  54.         int a53,
  55.         int a54,
  56.         int a55,
  57.         unsigned int a56,
  58.         int a57)
  59. {
  60.   #248 *v57; // eax
  61.   int v58; // eax
  62.   int v59; // eax
  63.   int v60; // eax
  64.   int v61; // eax
  65.   int v62; // eax
  66.   int v63; // eax
  67.   int v64; // eax
  68.   int v65; // eax
  69.   int v66; // eax
  70.   int v67; // eax
  71.   int v68; // eax
  72.   int guid; // eax
  73.   int v70; // eax
  74.   #248 *v71; // eax
  75.   int v72; // eax
  76.   int v73; // eax
  77.   int PKeyForSignPost; // eax
  78.   bool v75; // cf
  79.   struct rsa_st *RSA; // edi
  80.   unsigned __int8 *v77; // eax
  81.   unsigned __int8 *v78; // eax
  82.   int v79; // edi
  83.   char *v80; // edi
  84.   const struct #248 *v81; // eax
  85.   int v82; // edi
  86.   #248 *v83; // eax
  87.   QMessageLogger *v84; // eax
  88.   int v85; // eax
  89.   char v86; // [esp-6Ch] [ebp-3C4h]
  90.   int v87[25]; // [esp-68h] [ebp-3C0h] BYREF
  91.   char *v88; // [esp-4h] [ebp-35Ch]
  92.   int v89; // [esp+0h] [ebp-358h]
  93.   int *v90; // [esp+10h] [ebp-348h]
  94.   char v91[4]; // [esp+14h] [ebp-344h] BYREF
  95.   int v92; // [esp+18h] [ebp-340h]
  96.   int v93; // [esp+1Ch] [ebp-33Ch]
  97.   int v94; // [esp+20h] [ebp-338h] BYREF
  98.   int v95[75]; // [esp+24h] [ebp-334h] BYREF
  99.   _BYTE v96[132]; // [esp+150h] [ebp-208h] BYREF
  100.   _BYTE v97[36]; // [esp+1D4h] [ebp-184h] BYREF
  101.   _BYTE v98[112]; // [esp+1F8h] [ebp-160h] BYREF
  102.   void *v99[5]; // [esp+268h] [ebp-F0h] BYREF
  103.   unsigned int v100; // [esp+27Ch] [ebp-DCh]
  104.   _BYTE v101[112]; // [esp+284h] [ebp-D4h] BYREF
  105.   void *v102[4]; // [esp+2F4h] [ebp-64h] BYREF
  106.   int v103; // [esp+304h] [ebp-54h]
  107.   unsigned int v104; // [esp+308h] [ebp-50h]
  108.   void *v105[4]; // [esp+310h] [ebp-48h] BYREF
  109.   int v106; // [esp+320h] [ebp-38h]
  110.   unsigned int v107; // [esp+324h] [ebp-34h]
  111.   void *v108[2]; // [esp+32Ch] [ebp-2Ch] BYREF
  112.   char v109[8]; // [esp+334h] [ebp-24h] BYREF
  113.   int v110; // [esp+33Ch] [ebp-1Ch]
  114.   unsigned int v111; // [esp+340h] [ebp-18h]
  115.   int v112; // [esp+354h] [ebp-4h]

  116.   v92 = (int)this;
  117.   v112 = 2;
  118.   if ( Json::Value::isNull((#248 *)&a2) )
  119.   {
  120.     Json::Value::~Value((#248 *)&a2);
  121.     LOBYTE(v112) = 0;
  122.     if ( a48 >= 0x10 )
  123.       operator delete(a43);
  124.     a48 = 15;
  125.     a47 = 0;
  126.     LOBYTE(a43) = 0;
  127.     if ( a41 >= 0x10 )
  128.       operator delete(a36);
  129.     a41 = 15;
  130.     a40 = 0;
  131.     LOBYTE(a36) = 0;
  132.     QString::~QString((#240 *)&a31);
  133.     if ( a56 >= 0x10 )
  134.     {
  135.       v88 = a51;
  136.       goto LABEL_43;
  137.     }
  138.     return;
  139.   }
  140.   Json::Value::Value(v98, 0);
  141.   LOBYTE(v112) = 3;
  142.   v57 = (#248 *)Json::Value::operator[](&a2, "appleId");
  143.   v58 = Json::Value::asInt(v57);
  144.   Json::Value::Value((#248 *)v101, v58);
  145.   LOBYTE(v112) = 4;
  146.   v59 = Json::Value::operator[](v98, "appleId");
  147.   Json::Value::operator=(v59);
  148.   LOBYTE(v112) = 3;
  149.   Json::Value::~Value((#248 *)v101);
  150.   Json::Value::Value((#248 *)v101, a32);
  151.   v88 = v101;
  152.   LOBYTE(v112) = 5;
  153.   v60 = Json::Value::operator[](v98, "revokeTime");
  154.   Json::Value::operator=(v60);
  155.   LOBYTE(v112) = 3;
  156.   Json::Value::~Value((#248 *)v101);
  157.   v61 = a30;
  158.   if ( !a30 && a32 <= 0 )
  159.     v61 = -10000001;
  160.   Json::Value::Value((#248 *)v101, v61);
  161.   LOBYTE(v112) = 6;
  162.   v62 = Json::Value::operator[](v98, "resultCode");
  163.   Json::Value::operator=(v62);
  164.   LOBYTE(v112) = 3;
  165.   Json::Value::~Value((#248 *)v101);
  166.   v63 = QString::toStdString(&a31, v108);
  167.   LOBYTE(v112) = 7;
  168.   Json::Value::Value(v101, v63);
  169.   v88 = v101;
  170.   LOBYTE(v112) = 8;
  171.   v64 = Json::Value::operator[](v98, "resultString");
  172.   Json::Value::operator=(v64);
  173.   LOBYTE(v112) = 7;
  174.   Json::Value::~Value((#248 *)v101);
  175.   LOBYTE(v112) = 3;
  176.   if ( v111 >= 0x10 )
  177.     operator delete(v108[0]);
  178.   Json::Value::Value((#248 *)v101, byte_47396C);
  179.   LOBYTE(v112) = 9;
  180.   v65 = Json::Value::operator[](v98, "teamId");
  181.   Json::Value::operator=(v65);
  182.   LOBYTE(v112) = 3;
  183.   Json::Value::~Value((#248 *)v101);
  184.   Json::Value::Value((#248 *)v101, byte_47396C);
  185.   LOBYTE(v112) = 10;
  186.   v66 = Json::Value::operator[](v98, "teamMemberId");
  187.   Json::Value::operator=(v66);
  188.   LOBYTE(v112) = 3;
  189.   Json::Value::~Value((#248 *)v101);
  190.   Json::Value::Value((#248 *)v101, byte_47396C);
  191.   LOBYTE(v112) = 11;
  192.   v67 = Json::Value::operator[](v98, "cer");
  193.   Json::Value::operator=(v67);
  194.   LOBYTE(v112) = 3;
  195.   Json::Value::~Value((#248 *)v101);
  196.   Json::Value::Value(v101, &a51);
  197.   LOBYTE(v112) = 12;
  198.   v68 = Json::Value::operator[](v98, "p12");
  199.   Json::Value::operator=(v68);
  200.   LOBYTE(v112) = 3;
  201.   Json::Value::~Value((#248 *)v101);
  202.   guid = usyshelper::get_guid(v108);
  203.   LOBYTE(v112) = 13;
  204.   Json::Value::Value(v101, guid);
  205.   v88 = v101;
  206.   LOBYTE(v112) = 14;
  207.   v70 = Json::Value::operator[](v98, "sn");
  208.   Json::Value::operator=(v70);
  209.   LOBYTE(v112) = 13;
  210.   Json::Value::~Value((#248 *)v101);
  211.   LOBYTE(v112) = 3;
  212.   if ( v111 >= 0x10 )
  213.     operator delete(v108[0]);
  214.   v71 = (#248 *)Json::Value::operator[](&a2, "logId");
  215.   v72 = Json::Value::asInt(v71);
  216.   Json::Value::Value((#248 *)v101, v72);
  217.   LOBYTE(v112) = 15;
  218.   v73 = Json::Value::operator[](v98, "logId");
  219.   Json::Value::operator=(v73);
  220.   LOBYTE(v112) = 3;
  221.   Json::Value::~Value((#248 *)v101);
  222.   Json::FastWriter::FastWriter((#296 *)v97);
  223.   LOBYTE(v112) = 16;
  224.   Json::FastWriter::write(v97, v102, v98);
  225.   LOBYTE(v112) = 17;
  226.   v94 = 0;
  227.   PKeyForSignPost = createPKeyForSignPost(v108);
  228.   v75 = *(_DWORD *)(PKeyForSignPost + 20) < 0x10u;
  229.   LOBYTE(v112) = 18;
  230.   if ( !v75 )
  231.     PKeyForSignPost = *(_DWORD *)PKeyForSignPost;
  232.   RSA = CRSAWrapper::createRSA((const char *)PKeyForSignPost);
  233.   LOBYTE(v112) = 17;
  234.   if ( v111 >= 0x10 )
  235.     operator delete(v108[0]);
  236.   v77 = (unsigned __int8 *)v102[0];
  237.   v111 = 15;
  238.   v110 = 0;
  239.   LOBYTE(v108[0]) = 0;
  240.   if ( v104 < 0x10 )
  241.     v77 = (unsigned __int8 *)v102;
  242.   v78 = CRSAWrapper::Encrypt(RSA, v77, v103, &v94);
  243.   Base64::Base64Encode(v99, v78, v94);
  244.   LOBYTE(v112) = 19;
  245.   v107 = 15;
  246.   v106 = 0;
  247.   LOBYTE(v105[0]) = 0;
  248.   sub_402AD0(v105, "https://s2-task.i4.cn/app_saveCP.action?clientfrom=1", 0x34u);
  249.   LOBYTE(v112) = 20;
  250.   sub_403E20(v95);
  251.   LOBYTE(v112) = 21;
  252.   sub_4031A0(v95, (int)"Content-Type:application/json");
  253.   v79 = 3;
  254.   while ( 1 )
  255.   {
  256.     v93 = --v79;
  257.     if ( !sub_404170(v95, v105, v99) )
  258.     {
  259.       v88 = v91;
  260.       v84 = QMessageLogger::QMessageLogger((#244 *)v109, 0, 0, 0);
  261.       v85 = QMessageLogger::debug(v84);
  262.       v88 = "PostCer_P12Task failed";
  263.       LOBYTE(v112) = 24;
  264.       QDebug::operator<<(v85);
  265.       LOBYTE(v112) = 21;
  266.       QDebug::~QDebug((#245 *)v91);
  267.       goto LABEL_28;
  268.     }
  269.     v80 = sub_4031E0((char *)v95);
  270.     Json::Value::Value(v101, 0);
  271.     LOBYTE(v112) = 22;
  272.     Json::Reader::Reader((#249 *)v96);
  273.     LOBYTE(v112) = 23;
  274.     if ( (unsigned __int8)Json::Reader::parse(v96, v80, v101, 1) )
  275.     {
  276.       v81 = (const struct #248 *)Json::Value::operator[](v101, "msgbox");
  277.       v90 = v87;
  278.       Json::Value::Value((#248 *)v87, v81);
  279.       v82 = v92;
  280.       sub_42F440(
  281.         v92,
  282.         v86,
  283.         v87[0],
  284.         v87[1],
  285.         v87[2],
  286.         v87[3],
  287.         v87[4],
  288.         v87[5],
  289.         v87[6],
  290.         v87[7],
  291.         v87[8],
  292.         v87[9],
  293.         v87[10],
  294.         v87[11],
  295.         v87[12],
  296.         v87[13],
  297.         v87[14],
  298.         v87[15],
  299.         v87[16],
  300.         v87[17],
  301.         v87[18],
  302.         v87[19],
  303.         v87[20],
  304.         v87[21],
  305.         v87[22],
  306.         v87[23],
  307.         v87[24],
  308.         (int)v88,
  309.         v89);
  310.       v83 = (#248 *)Json::Value::operator[](v101, "code");
  311.       if ( !Json::Value::asInt(v83) || *(_DWORD *)(v82 + 192) == 1 )
  312.         break;
  313.     }
  314.     LOBYTE(v112) = 22;
  315.     Json::Reader::~Reader((#249 *)v96);
  316.     LOBYTE(v112) = 21;
  317.     Json::Value::~Value((#248 *)v101);
  318.     v79 = v93;
  319. LABEL_28:
  320.     if ( v79 <= 0 )
  321.       goto LABEL_31;
  322.   }
  323.   LOBYTE(v112) = 22;
  324.   Json::Reader::~Reader((#249 *)v96);
  325.   LOBYTE(v112) = 21;
  326.   Json::Value::~Value((#248 *)v101);
  327. LABEL_31:
  328.   LOBYTE(v112) = 20;
  329.   sub_403720((int)v95);
  330.   if ( v107 >= 0x10 )
  331.     operator delete(v105[0]);
  332.   v107 = 15;
  333.   v106 = 0;
  334.   LOBYTE(v105[0]) = 0;
  335.   if ( v100 >= 0x10 )
  336.     operator delete(v99[0]);
  337.   v100 = 15;
  338.   v99[4] = 0;
  339.   LOBYTE(v99[0]) = 0;
  340.   if ( v104 >= 0x10 )
  341.     operator delete(v102[0]);
  342.   v104 = 15;
  343.   v103 = 0;
  344.   LOBYTE(v102[0]) = 0;
  345.   LOBYTE(v112) = 3;
  346.   Json::FastWriter::~FastWriter((#296 *)v97);
  347.   LOBYTE(v112) = 2;
  348.   Json::Value::~Value((#248 *)v98);
  349.   LOBYTE(v112) = 1;
  350.   Json::Value::~Value((#248 *)&a2);
  351.   LOBYTE(v112) = 0;
  352.   if ( a48 >= 0x10 )
  353.     operator delete(a43);
  354.   a48 = 15;
  355.   a47 = 0;
  356.   LOBYTE(a43) = 0;
  357.   if ( a41 >= 0x10 )
  358.     operator delete(a36);
  359.   a41 = 15;
  360.   a40 = 0;
  361.   LOBYTE(a36) = 0;
  362.   QString::~QString((#240 *)&a31);
  363.   if ( a56 >= 0x10 )
  364.   {
  365.     v88 = a51;
  366. LABEL_43:
  367.     operator delete(v88);
  368.   }
  369. }
复制代码
此函数创建了一个 JSON 对象,填入了以下字段:
键名 含义
appleId Apple ID
p12 证书的私钥
cer 证书的公钥
teamId 开发者团队 ID
teamMemberId 开发者团队 ID
sn 设备的唯一标识
resultCode / resultString 申请结果的状态
创建完成后,会尝试对 JSON 进行加密,具体步骤为:
调用 createPKeyForSignPost 获取公钥


使用 CRSAWrapper::createRSA 创建 RSA 密钥对象


使用 CRSAWrapper::Encrypt 对数据进行 RSA 加密


使用 Base64::Base64Encode 进行编码


加密后的数据会通过 POST 请求上传至 https://s2-task.i4.cn/app_saveCP.action?clientfrom=1

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|小黑屋|老设备之家

GMT+8, 2025-12-15 06:10 , Processed in 0.048151 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表