-
-
[求助]高手看下这个是怎么加密的啊
-
发表于: 2018-6-4 15:54 3931
-
已知参数 a1 为NSData数据类型,a3为NSString
根据 sub_100F6C668(v15, &v48);
和sub_100F6C82C((__int64)v16, "rc4", 0LL);
已求得v16 和v18的值。谁能用c语言还原下面的算法吗
__int64 __fastcall sub_100F6C38C(__int64 a1, __int64 a2, __int64 a3)
{
__int64 v3; // x20
__int64 v4; // x21
__int64 v5; // x27
__int64 v6; // x19
__int64 v7; // x1
__int64 v8; // x1
__int64 v9; // x20
__int64 v10; // x23
__int64 v11; // x21
__int64 v12; // x1
__int64 v13; // x0
void *v14; // x22
const char *v15; // x23
_BYTE *v16; // x23
__int64 v17; // x1
char *v18; // x22
void *v19; // x24
void *v20; // x23
void *v21; // x25
char *v22; // x24
unsigned __int64 v23; // x21
size_t v24; // x0
__int64 v25; // x8
signed int v26; // w11
int v27; // w12
int v28; // w11
int v29; // w13
__int64 v30; // x21
signed __int64 v31; // x26
void *v32; // x25
signed int v33; // w11
signed int v34; // w10
int v35; // w12
_BYTE *v36; // x9
int v37; // w13
int v38; // w10
int v39; // w11
int v40; // w12
int v41; // w13
int v42; // w14
char v43; // t1
void *v44; // x0
__int64 result; // x0
__int64 v46; // [xsp+10h] [xbp-860h]
char v47[1024]; // [xsp+18h] [xbp-858h]
__int64 v48; // [xsp+418h] [xbp-458h]
__int64 v49; // [xsp+818h] [xbp-58h]
//传入的参数 a1为 Data
v3 = a3;
v4 = a2;
v5 = __stack_chk_guard;
v6 = objc_retain(a1, a2);
v9 = objc_retain(v3, v7);
if ( v4 )
{
v10 = 0LL;
}
else
{
v11 = objc_retain(v6, v8);
v48 = 0LL;
v13 = objc_retain(v9, v12);
v14 = (void *)objc_retainAutorelease(v13);
v15 = (const char *)objc_msgSend(v14, "cStringUsingEncoding:", 4LL);
objc_release(v14);
v16 = sub_100F6C668(v15, &v48);
v18 = sub_100F6C82C((__int64)v16, "rc4", 0LL);
//
v16===
rc4:79927f330445959dd6a0be6a2d2a27668bee90657453f6f4d5ea7f7a0fc34204c48baa1c6e3031f78d27ab61d1e2b414b6ec6f38963ed5d81fb3dc065661bbf5\x01csign:CJ36HL9A3E|ZM7RGXFQUJ
//
v18=== 79927f330445959dd6a0be6a2d2a27668bee90657453f6f4d5ea7f7a0fc34204c48baa1c6e3031f78d27ab61d1e2b414b6ec6f38963ed5d81fb3dc065661bbf5
//
if ( v16 )
free(v16);
if ( v18 )
{
v46 = v11;
v19 = (void *)objc_retain(v11, v17);
v20 = objc_msgSend(v19, "length");
v21 = (void *)objc_retainAutorelease(v19);
v22 = (char *)objc_msgSend(v21, "bytes");
objc_release(v21);
v23 = 0LL;
do
{
*((_DWORD *)&v48 + v23) = v23;
v24 = strlen(v18);
*(_DWORD *)&v47[4 * v23] = v18[v23 - v23 / v24 * v24];
++v23;
}
while ( v23 != 256 );
v25 = 0LL;
v26 = 0;
do
{
v27 = *(_DWORD *)((char *)&v48 + v25);
v28 = v27 + v26 + *(_DWORD *)&v47[v25];
v29 = v28 + 255;
if ( v28 >= 0 )
v29 = v28;
v26 = v28 - (v29 & 0xFFFFFF00);
*(_DWORD *)((char *)&v48 + v25) = *((_DWORD *)&v48 + v26);
*((_DWORD *)&v48 + v26) = v27;
v25 += 4LL;
}
while ( v25 != 1024 );
v30 = (_QWORD)v20 << 32;
v31 = (((_QWORD)v20 << 32) + 0x100000000LL) >> 32;
v32 = malloc(v31);
bzero(v32, v31);
if ( (signed int)v20 >= 1 )
{
v33 = 0;
v34 = 0;
v35 = v48;
v36 = v32;
do
{
v37 = v34 + 1;
if ( v34 + 1 >= 0 )
v38 = v34 + 1;
else
v38 = v34 + 256;
v34 = v37 - (v38 & 0xFFFFFF00);
v39 = v33 + v35;
v40 = v39 + 255;
if ( v39 >= 0 )
v40 = v39;
v33 = v39 - (v40 & 0xFFFFFF00);
v35 = *((_DWORD *)&v48 + v34);
*((_DWORD *)&v48 + v34) = *((_DWORD *)&v48 + v33);
*((_DWORD *)&v48 + v33) = v35;
v41 = *((_DWORD *)&v48 + v34) + v35;
v42 = v41 + 255;
if ( v41 >= 0 )
v42 = *((_DWORD *)&v48 + v34) + v35;
v43 = *v22++;
*v36++ = v43 ^ *((unsigned int *)&v48 + (signed int)(v41 - (v42 & 0xFFFFFF00)));
LODWORD(v20) = (_DWORD)v20 - 1;
}
while ( (_DWORD)v20 );
}
v44 = objc_msgSend(&OBJC_CLASS___NSMutableData, "dataWithBytes:length:", v32, v30 >> 32);
v10 = objc_retainAutoreleasedReturnValue(v44);
free(v32);
free(v18);
v11 = v46;
}
else
{
v10 = 0LL;
}
objc_release(v11);
}
objc_release(v9);
result = objc_release(v6);
if ( v5 == v49 )
result = objc_autoreleaseReturnValue(v10);
return result;
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!