首页
社区
课程
招聘
[求助]高手看下这个是怎么加密的啊
发表于: 2018-6-4 15:54 3931

[求助]高手看下这个是怎么加密的啊

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期)!

收藏
免费
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册