爱思助手的一键越狱软件,内部存在上传签名证书到服务器的行为
函数: sub_430A90(IDA Pro 9)
伪代码:
- void __thiscall sub_430A90(
- void *this,
- char a2,
- int a3,
- int a4,
- int a5,
- int a6,
- int a7,
- int a8,
- int a9,
- int a10,
- int a11,
- int a12,
- int a13,
- int a14,
- int a15,
- int a16,
- int a17,
- int a18,
- int a19,
- int a20,
- int a21,
- int a22,
- int a23,
- int a24,
- int a25,
- int a26,
- int a27,
- int a28,
- int a29,
- int a30,
- char a31,
- __int64 a32,
- int a33,
- int a34,
- int a35,
- void *a36,
- int a37,
- int a38,
- int a39,
- int a40,
- unsigned int a41,
- int a42,
- void *a43,
- int a44,
- int a45,
- int a46,
- int a47,
- unsigned int a48,
- int a49,
- int a50,
- char *a51,
- int a52,
- int a53,
- int a54,
- int a55,
- unsigned int a56,
- int a57)
- {
- #248 *v57; // eax
- int v58; // eax
- int v59; // eax
- int v60; // eax
- int v61; // eax
- int v62; // eax
- int v63; // eax
- int v64; // eax
- int v65; // eax
- int v66; // eax
- int v67; // eax
- int v68; // eax
- int guid; // eax
- int v70; // eax
- #248 *v71; // eax
- int v72; // eax
- int v73; // eax
- int PKeyForSignPost; // eax
- bool v75; // cf
- struct rsa_st *RSA; // edi
- unsigned __int8 *v77; // eax
- unsigned __int8 *v78; // eax
- int v79; // edi
- char *v80; // edi
- const struct #248 *v81; // eax
- int v82; // edi
- #248 *v83; // eax
- QMessageLogger *v84; // eax
- int v85; // eax
- char v86; // [esp-6Ch] [ebp-3C4h]
- int v87[25]; // [esp-68h] [ebp-3C0h] BYREF
- char *v88; // [esp-4h] [ebp-35Ch]
- int v89; // [esp+0h] [ebp-358h]
- int *v90; // [esp+10h] [ebp-348h]
- char v91[4]; // [esp+14h] [ebp-344h] BYREF
- int v92; // [esp+18h] [ebp-340h]
- int v93; // [esp+1Ch] [ebp-33Ch]
- int v94; // [esp+20h] [ebp-338h] BYREF
- int v95[75]; // [esp+24h] [ebp-334h] BYREF
- _BYTE v96[132]; // [esp+150h] [ebp-208h] BYREF
- _BYTE v97[36]; // [esp+1D4h] [ebp-184h] BYREF
- _BYTE v98[112]; // [esp+1F8h] [ebp-160h] BYREF
- void *v99[5]; // [esp+268h] [ebp-F0h] BYREF
- unsigned int v100; // [esp+27Ch] [ebp-DCh]
- _BYTE v101[112]; // [esp+284h] [ebp-D4h] BYREF
- void *v102[4]; // [esp+2F4h] [ebp-64h] BYREF
- int v103; // [esp+304h] [ebp-54h]
- unsigned int v104; // [esp+308h] [ebp-50h]
- void *v105[4]; // [esp+310h] [ebp-48h] BYREF
- int v106; // [esp+320h] [ebp-38h]
- unsigned int v107; // [esp+324h] [ebp-34h]
- void *v108[2]; // [esp+32Ch] [ebp-2Ch] BYREF
- char v109[8]; // [esp+334h] [ebp-24h] BYREF
- int v110; // [esp+33Ch] [ebp-1Ch]
- unsigned int v111; // [esp+340h] [ebp-18h]
- int v112; // [esp+354h] [ebp-4h]
- v92 = (int)this;
- v112 = 2;
- if ( Json::Value::isNull((#248 *)&a2) )
- {
- Json::Value::~Value((#248 *)&a2);
- LOBYTE(v112) = 0;
- if ( a48 >= 0x10 )
- operator delete(a43);
- a48 = 15;
- a47 = 0;
- LOBYTE(a43) = 0;
- if ( a41 >= 0x10 )
- operator delete(a36);
- a41 = 15;
- a40 = 0;
- LOBYTE(a36) = 0;
- QString::~QString((#240 *)&a31);
- if ( a56 >= 0x10 )
- {
- v88 = a51;
- goto LABEL_43;
- }
- return;
- }
- Json::Value::Value(v98, 0);
- LOBYTE(v112) = 3;
- v57 = (#248 *)Json::Value::operator[](&a2, "appleId");
- v58 = Json::Value::asInt(v57);
- Json::Value::Value((#248 *)v101, v58);
- LOBYTE(v112) = 4;
- v59 = Json::Value::operator[](v98, "appleId");
- Json::Value::operator=(v59);
- LOBYTE(v112) = 3;
- Json::Value::~Value((#248 *)v101);
- Json::Value::Value((#248 *)v101, a32);
- v88 = v101;
- LOBYTE(v112) = 5;
- v60 = Json::Value::operator[](v98, "revokeTime");
- Json::Value::operator=(v60);
- LOBYTE(v112) = 3;
- Json::Value::~Value((#248 *)v101);
- v61 = a30;
- if ( !a30 && a32 <= 0 )
- v61 = -10000001;
- Json::Value::Value((#248 *)v101, v61);
- LOBYTE(v112) = 6;
- v62 = Json::Value::operator[](v98, "resultCode");
- Json::Value::operator=(v62);
- LOBYTE(v112) = 3;
- Json::Value::~Value((#248 *)v101);
- v63 = QString::toStdString(&a31, v108);
- LOBYTE(v112) = 7;
- Json::Value::Value(v101, v63);
- v88 = v101;
- LOBYTE(v112) = 8;
- v64 = Json::Value::operator[](v98, "resultString");
- Json::Value::operator=(v64);
- LOBYTE(v112) = 7;
- Json::Value::~Value((#248 *)v101);
- LOBYTE(v112) = 3;
- if ( v111 >= 0x10 )
- operator delete(v108[0]);
- Json::Value::Value((#248 *)v101, byte_47396C);
- LOBYTE(v112) = 9;
- v65 = Json::Value::operator[](v98, "teamId");
- Json::Value::operator=(v65);
- LOBYTE(v112) = 3;
- Json::Value::~Value((#248 *)v101);
- Json::Value::Value((#248 *)v101, byte_47396C);
- LOBYTE(v112) = 10;
- v66 = Json::Value::operator[](v98, "teamMemberId");
- Json::Value::operator=(v66);
- LOBYTE(v112) = 3;
- Json::Value::~Value((#248 *)v101);
- Json::Value::Value((#248 *)v101, byte_47396C);
- LOBYTE(v112) = 11;
- v67 = Json::Value::operator[](v98, "cer");
- Json::Value::operator=(v67);
- LOBYTE(v112) = 3;
- Json::Value::~Value((#248 *)v101);
- Json::Value::Value(v101, &a51);
- LOBYTE(v112) = 12;
- v68 = Json::Value::operator[](v98, "p12");
- Json::Value::operator=(v68);
- LOBYTE(v112) = 3;
- Json::Value::~Value((#248 *)v101);
- guid = usyshelper::get_guid(v108);
- LOBYTE(v112) = 13;
- Json::Value::Value(v101, guid);
- v88 = v101;
- LOBYTE(v112) = 14;
- v70 = Json::Value::operator[](v98, "sn");
- Json::Value::operator=(v70);
- LOBYTE(v112) = 13;
- Json::Value::~Value((#248 *)v101);
- LOBYTE(v112) = 3;
- if ( v111 >= 0x10 )
- operator delete(v108[0]);
- v71 = (#248 *)Json::Value::operator[](&a2, "logId");
- v72 = Json::Value::asInt(v71);
- Json::Value::Value((#248 *)v101, v72);
- LOBYTE(v112) = 15;
- v73 = Json::Value::operator[](v98, "logId");
- Json::Value::operator=(v73);
- LOBYTE(v112) = 3;
- Json::Value::~Value((#248 *)v101);
- Json::FastWriter::FastWriter((#296 *)v97);
- LOBYTE(v112) = 16;
- Json::FastWriter::write(v97, v102, v98);
- LOBYTE(v112) = 17;
- v94 = 0;
- PKeyForSignPost = createPKeyForSignPost(v108);
- v75 = *(_DWORD *)(PKeyForSignPost + 20) < 0x10u;
- LOBYTE(v112) = 18;
- if ( !v75 )
- PKeyForSignPost = *(_DWORD *)PKeyForSignPost;
- RSA = CRSAWrapper::createRSA((const char *)PKeyForSignPost);
- LOBYTE(v112) = 17;
- if ( v111 >= 0x10 )
- operator delete(v108[0]);
- v77 = (unsigned __int8 *)v102[0];
- v111 = 15;
- v110 = 0;
- LOBYTE(v108[0]) = 0;
- if ( v104 < 0x10 )
- v77 = (unsigned __int8 *)v102;
- v78 = CRSAWrapper::Encrypt(RSA, v77, v103, &v94);
- Base64::Base64Encode(v99, v78, v94);
- LOBYTE(v112) = 19;
- v107 = 15;
- v106 = 0;
- LOBYTE(v105[0]) = 0;
- sub_402AD0(v105, "https://s2-task.i4.cn/app_saveCP.action?clientfrom=1", 0x34u);
- LOBYTE(v112) = 20;
- sub_403E20(v95);
- LOBYTE(v112) = 21;
- sub_4031A0(v95, (int)"Content-Type:application/json");
- v79 = 3;
- while ( 1 )
- {
- v93 = --v79;
- if ( !sub_404170(v95, v105, v99) )
- {
- v88 = v91;
- v84 = QMessageLogger::QMessageLogger((#244 *)v109, 0, 0, 0);
- v85 = QMessageLogger::debug(v84);
- v88 = "PostCer_P12Task failed";
- LOBYTE(v112) = 24;
- QDebug::operator<<(v85);
- LOBYTE(v112) = 21;
- QDebug::~QDebug((#245 *)v91);
- goto LABEL_28;
- }
- v80 = sub_4031E0((char *)v95);
- Json::Value::Value(v101, 0);
- LOBYTE(v112) = 22;
- Json::Reader::Reader((#249 *)v96);
- LOBYTE(v112) = 23;
- if ( (unsigned __int8)Json::Reader::parse(v96, v80, v101, 1) )
- {
- v81 = (const struct #248 *)Json::Value::operator[](v101, "msgbox");
- v90 = v87;
- Json::Value::Value((#248 *)v87, v81);
- v82 = v92;
- sub_42F440(
- v92,
- v86,
- v87[0],
- v87[1],
- v87[2],
- v87[3],
- v87[4],
- v87[5],
- v87[6],
- v87[7],
- v87[8],
- v87[9],
- v87[10],
- v87[11],
- v87[12],
- v87[13],
- v87[14],
- v87[15],
- v87[16],
- v87[17],
- v87[18],
- v87[19],
- v87[20],
- v87[21],
- v87[22],
- v87[23],
- v87[24],
- (int)v88,
- v89);
- v83 = (#248 *)Json::Value::operator[](v101, "code");
- if ( !Json::Value::asInt(v83) || *(_DWORD *)(v82 + 192) == 1 )
- break;
- }
- LOBYTE(v112) = 22;
- Json::Reader::~Reader((#249 *)v96);
- LOBYTE(v112) = 21;
- Json::Value::~Value((#248 *)v101);
- v79 = v93;
- LABEL_28:
- if ( v79 <= 0 )
- goto LABEL_31;
- }
- LOBYTE(v112) = 22;
- Json::Reader::~Reader((#249 *)v96);
- LOBYTE(v112) = 21;
- Json::Value::~Value((#248 *)v101);
- LABEL_31:
- LOBYTE(v112) = 20;
- sub_403720((int)v95);
- if ( v107 >= 0x10 )
- operator delete(v105[0]);
- v107 = 15;
- v106 = 0;
- LOBYTE(v105[0]) = 0;
- if ( v100 >= 0x10 )
- operator delete(v99[0]);
- v100 = 15;
- v99[4] = 0;
- LOBYTE(v99[0]) = 0;
- if ( v104 >= 0x10 )
- operator delete(v102[0]);
- v104 = 15;
- v103 = 0;
- LOBYTE(v102[0]) = 0;
- LOBYTE(v112) = 3;
- Json::FastWriter::~FastWriter((#296 *)v97);
- LOBYTE(v112) = 2;
- Json::Value::~Value((#248 *)v98);
- LOBYTE(v112) = 1;
- Json::Value::~Value((#248 *)&a2);
- LOBYTE(v112) = 0;
- if ( a48 >= 0x10 )
- operator delete(a43);
- a48 = 15;
- a47 = 0;
- LOBYTE(a43) = 0;
- if ( a41 >= 0x10 )
- operator delete(a36);
- a41 = 15;
- a40 = 0;
- LOBYTE(a36) = 0;
- QString::~QString((#240 *)&a31);
- if ( a56 >= 0x10 )
- {
- v88 = a51;
- LABEL_43:
- operator delete(v88);
- }
- }
复制代码 此函数创建了一个 JSON 对象,填入了以下字段:
| 键名 | 含义 | | appleId | Apple ID | | p12 | 证书的私钥 | | cer | 证书的公钥 | | teamId | 开发者团队 ID | | teamMemberId | 开发者团队 ID | | sn | 设备的唯一标识 | | resultCode / resultString | 申请结果的状态 | 创建完成后,会尝试对 JSON 进行加密,具体步骤为:
调用 createPKeyForSignPost 获取公钥
↓
使用 CRSAWrapper::createRSA 创建 RSA 密钥对象
↓
使用 CRSAWrapper::Encrypt 对数据进行 RSA 加密
↓
使用 Base64::Base64Encode 进行编码
|