Facebook
From Violet Capybara, 3 Months ago, written in x86 Assembler.
Embed
Download Paste or View Raw
Hits: 1228
  1. __int64 __fastcall sub_7FF620CE22E0(__int64 a1, _BYTE *a2)
  2. {
  3.   _BYTE *v2; // r13
  4.   __int64 v3; // rdi
  5.   unsigned __int64 v4; // r11
  6.   __int64 v5; // r15
  7.   __int64 v6; // r14
  8.   unsigned __int64 v7; // r8
  9.   unsigned int v8; // ebp
  10.   unsigned __int64 v9; // rbx
  11.   _QWORD *v10; // r10
  12.   unsigned int v11; // er11
  13.   unsigned __int64 v12; // rdx
  14.   unsigned __int64 v13; // r9
  15.   __int64 v14; // rcx
  16.   unsigned __int64 v15; // rdx
  17.   unsigned __int64 v16; // rcx
  18.   unsigned __int64 v17; // rdx
  19.   unsigned __int64 v18; // r9
  20.   __int64 v19; // rdx
  21.   unsigned __int8 *v20; // rcx
  22.   __int64 v21; // rax
  23.   __int64 v22; // rcx
  24.   __int64 v23; // rax
  25.   unsigned __int64 v24; // r11
  26.   unsigned __int64 v25; // r14
  27.   unsigned __int64 v26; // rbx
  28.   _DWORD *v27; // r10
  29.   int v28; // er11
  30.   unsigned int v29; // edx
  31.   unsigned int v30; // ecx
  32.   unsigned int v31; // edx
  33.   unsigned int v32; // er9
  34.   unsigned int v33; // ecx
  35.   unsigned int v34; // edx
  36.   unsigned int v35; // ecx
  37.   unsigned int v36; // edx
  38.   __int64 v37; // rdx
  39.   unsigned __int8 *v38; // rcx
  40.   __int64 v39; // rax
  41.   __int64 v40; // rcx
  42.   __int64 v41; // rax
  43.   unsigned __int64 v42; // r11
  44.   unsigned __int64 v43; // r14
  45.   unsigned __int64 v44; // r12
  46.   char v45; // di
  47.   char v46; // si
  48.   unsigned int v47; // er11
  49.   char v48; // dl
  50.   char v49; // cl
  51.   unsigned __int64 v50; // r11
  52.   unsigned __int64 v51; // r14
  53.   __int64 result; // rax
  54.   __int64 v53; // [rsp+50h] [rbp+8h]
  55.  
  56.   v53 = a1;
  57.   v2 = a2;
  58.   v3 = a1;
  59.   j_memcpy_0(a2, (const void *)(a1 + 14), *(unsigned __int16 *)(a1 + 12));
  60.   v4 = *(unsigned int *)(v3 + 8);
  61.   v5 = 0i64;
  62.   v6 = 2685821657736338717i64 * (v4 ^ (unsigned int)(*(_DWORD *)(v3 + 8) << 25) ^ ((v4 ^ (v4 >> 15)) >> 12));
  63.   v7 = 2685821657736338717i64
  64.      * ((unsigned int)(v4 - 111492228) ^ (unsigned int)(((_DWORD)v4 - 4) << 25) ^ (((unsigned int)(v4 - 111492228) ^ ((unsigned __int64)(unsigned int)(v4 - 111492228) >> 15)) >> 12));
  65.   v8 = 8 * *(unsigned __int16 *)(v3 + 12) + 1;
  66.   if ( v8 >= 0x40 )
  67.   {
  68.     v9 = (unsigned __int64)v8 >> 6;
  69.     do
  70.     {
  71.       v10 = &v2[(unsigned int)v5];
  72.       v11 = __ROR4__(__ROR4__(v4, 1), 1);
  73.       v12 = (2i64 * ~*v10) ^ ((2i64 * ~*v10) ^ (~*v10 >> 1)) & 0x5555555555555555i64;
  74.       v13 = (16 * ((4 * v12) ^ ((4 * v12) ^ (v12 >> 2)) & 0x3333333333333333i64)) ^ ((16
  75.                                                                                     * ((4 * v12) ^ ((4 * v12) ^ (v12 >> 2)) & 0x3333333333333333i64)) ^ (((4 * v12) ^ ((4 * v12) ^ (v12 >> 2)) & 0x3333333333333333i64) >> 4)) & 0xF0F0F0F0F0F0F0Fi64;
  76.       v14 = __ROL8__((v13 << 8) ^ ((v13 << 8) ^ (v13 >> 8)) & 0xFF00FF00FF00FFi64, 32);
  77.       v15 = (2 * (v11 + v14)) ^ ((2 * (v11 + v14)) ^ (((unsigned __int64)v11 + v14) >> 1)) & 0x5555555555555555i64;
  78.       v16 = (2 * v15) ^ ((2 * v15) ^ (v15 >> 1)) & 0x5555555555555555i64;
  79.       v17 = (4 * v16) ^ ((4 * v16) ^ (v16 >> 2)) & 0x3333333333333333i64;
  80.       v18 = (16 * v17) ^ ((16 * v17) ^ (v17 >> 4)) & 0xF0F0F0F0F0F0F0Fi64;
  81.       v19 = 8i64;
  82.       *v10 = __ROL8__((v18 << 8) ^ ((v18 << 8) ^ (v18 >> 8)) & 0xFF00FF00FF00FFi64, 32);
  83.       v20 = &v2[(unsigned int)v5];
  84.       do
  85.       {
  86.         v21 = *v20++;
  87.         *(v20 - 1) = *((_BYTE *)&_ImageBase + v21 + 63173072);
  88.         --v19;
  89.       }
  90.       while ( v19 );
  91.       v22 = 8i64;
  92.       *v10 ^= ~(unsigned __int64)v11;
  93.       do
  94.       {
  95.         v23 = *(unsigned __int8 *)v10;
  96.         v10 = (_QWORD *)((char *)v10 + 1);
  97.         *((_BYTE *)v10 - 1) = *((_BYTE *)&_ImageBase + v23 + 63173072);
  98.         --v22;
  99.       }
  100.       while ( v22 );
  101.       v24 = v6 + v7;
  102.       v5 = (unsigned int)(v5 + 8);
  103.       v25 = v7 ^ v6;
  104.       v4 = v24 >> 32;
  105.       v8 -= 64;
  106.       v7 = v25 ^ (v25 << 14) ^ __ROR8__(v7, 9);
  107.       v6 = __ROR8__(v25, 28);
  108.       --v9;
  109.     }
  110.     while ( v9 );
  111.     v3 = v53;
  112.   }
  113.   if ( v8 >= 0x20 )
  114.   {
  115.     v26 = (unsigned __int64)v8 >> 5;
  116.     do
  117.     {
  118.       v27 = &v2[(unsigned int)v5];
  119.       v28 = __ROL4__(__ROL4__(v4, 1), 1);
  120.       v29 = (2 * ~*v27) ^ ((2 * ~*v27) ^ ((unsigned int)~*v27 >> 1)) & 0x55555555;
  121.       v30 = (4 * v29) ^ ((4 * v29) ^ (v29 >> 2)) & 0x33333333;
  122.       v31 = (16 * v30) ^ ((16 * v30) ^ (v30 >> 4)) & 0xF0F0F0F;
  123.       v32 = __ROL4__((v31 << 8) ^ ((v31 << 8) ^ (v31 >> 8)) & 0xFF00FF, 16) + v28;
  124.       v33 = (2 * v32) ^ ((2 * v32) ^ (v32 >> 1)) & 0x55555555;
  125.       v34 = (2 * v33) ^ ((2 * v33) ^ (v33 >> 1)) & 0x55555555;
  126.       v35 = (4 * v34) ^ ((4 * v34) ^ (v34 >> 2)) & 0x33333333;
  127.       v36 = (16 * v35) ^ ((16 * v35) ^ (v35 >> 4)) & 0xF0F0F0F;
  128.       *v27 = __ROL4__((v36 << 8) ^ ((v36 << 8) ^ (v36 >> 8)) & 0xFF00FF, 16);
  129.       v37 = 4i64;
  130.       v38 = &v2[(unsigned int)v5];
  131.       do
  132.       {
  133.         v39 = *v38++;
  134.         *(v38 - 1) = *((_BYTE *)&_ImageBase + v39 + 63172816);
  135.         --v37;
  136.       }
  137.       while ( v37 );
  138.       *v27 ^= v28;
  139.       v40 = 4i64;
  140.       do
  141.       {
  142.         v41 = *(unsigned __int8 *)v27;
  143.         v27 = (_DWORD *)((char *)v27 + 1);
  144.         *((_BYTE *)v27 - 1) = *((_BYTE *)&_ImageBase + v41 + 63172816);
  145.         --v40;
  146.       }
  147.       while ( v40 );
  148.       v42 = v6 + v7;
  149.       v5 = (unsigned int)(v5 + 4);
  150.       v43 = v7 ^ v6;
  151.       v4 = v42 >> 32;
  152.       v8 -= 32;
  153.       v7 = v43 ^ (v43 << 14) ^ __ROR8__(v7, 9);
  154.       v6 = __ROR8__(v43, 28);
  155.       --v26;
  156.     }
  157.     while ( v26 );
  158.   }
  159.   if ( v8 >= 8 )
  160.   {
  161.     v44 = (unsigned __int64)v8 >> 3;
  162.     do
  163.     {
  164.       v45 = 11 * v4;
  165.       v8 -= 8;
  166.       v46 = 51 * v4;
  167.       v47 = 14641 * v4;
  168.       v48 = __ROR1__(~__ROL1__(v2[v5] + 49 * v47, 1331 * v47 % 7 + 1), 11 * v47 % 7 + 1);
  169.       v49 = v47 % 7 + 1;
  170.       v50 = v6 + v7;
  171.       v51 = v7 ^ v6;
  172.       v4 = v50 >> 32;
  173.       v7 = v51 ^ (v51 << 14) ^ __ROR8__(v7, 9);
  174.       v2[v5] = __ROL1__(v48, v49) - v45 - v46;
  175.       v6 = __ROR8__(v51, 28);
  176.       v5 = (unsigned int)(v5 + 1);
  177.       --v44;
  178.     }
  179.     while ( v44 );
  180.     v3 = v53;
  181.   }
  182.   if ( v8 )
  183.     v2[v5] ^= v4 & 1;
  184.   result = *(unsigned __int16 *)(v3 + 12);
  185.   v2[result] = 0;
  186.   return result;
  187. }