Advertisement
Guest User

BGAD function 2

a guest
Jan 16th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.26 KB | None | 0 0
  1. int __fastcall bgadFunction(_DWORD *a1, int a2, _DWORD *stringFileSizeParam, int a4, int a5, int shouldCeil, _WORD *a7)
  2. {
  3.   _DWORD *safeFileFlag; // r10
  4.   _DWORD *stringFileSize; // r4
  5.   int a2Ref; // r11
  6.   int v10; // r1
  7.   int v11; // r8
  8.   signed int errorFlag; // r9
  9.   __int64 v13; // r0
  10.   signed int wrongFileFlag; // r0
  11.   signed int logModifier; // r1
  12.   _DWORD *v16; // r5
  13.   __int64 nameCheck; // r0
  14.   int last4Bytes; // r0
  15.   int compressed_data_sizeRef; // r0
  16.   int v20; // r1
  17.   _BYTE *v21; // r6
  18.   int v22; // r4
  19.   int result; // r0
  20.   int v24; // r0
  21.   unsigned int v25; // r1
  22.   _DWORD *v26; // r6
  23.   int v27; // r0
  24.   _DWORD *v28; // r0
  25.   int a4Ref; // [sp+8h] [bp-40h]
  26.   _DWORD *a1Ref; // [sp+Ch] [bp-3Ch]
  27.   int preLast4Bytes; // [sp+10h] [bp-38h]
  28.   int last4BytesRef; // [sp+14h] [bp-34h]
  29.   int v33; // [sp+18h] [bp-30h]
  30.   _DWORD *roundedLog; // [sp+1Ch] [bp-2Ch]
  31.   int magic; // [sp+20h] [bp-28h]
  32.   __int16 const1; // [sp+24h] [bp-24h]
  33.   __int16 flag0; // [sp+26h] [bp-22h]
  34.   int header_size_name_size; // [sp+28h] [bp-20h]
  35.   __int16 var1; // [sp+2Ch] [bp-1Ch]
  36.   unsigned __int16 flag1; // [sp+2Eh] [bp-1Ah]
  37.   int compressed_data_size; // [sp+30h] [bp-18h]
  38.   int uncompressed_data_size; // [sp+34h] [bp-14h]
  39.   int initial_data; // [sp+38h] [bp-10h]
  40.  
  41.   a1Ref = a1;
  42.   safeFileFlag = 0;
  43.   stringFileSize = stringFileSizeParam;
  44.   a4Ref = a4;
  45.   a2Ref = a2;
  46.   preLast4Bytes = 0;
  47.   last4BytesRef = 0;
  48.   (*(void (**)(void))(*(_DWORD *)*stringFileSizeParam + 12))();
  49.   v11 = v10;
  50.   errorFlag = 1;
  51.   LODWORD(v13) = (*(int (__cdecl **)(_DWORD, int *))(*(_DWORD *)*stringFileSize + 8))(*stringFileSize, &magic);
  52.   if ( v13 == 1 )
  53.   {
  54.     wrongFileFlag = 0;
  55.     if ( magic != 0x44414742 )
  56.       wrongFileFlag = 1;
  57.     if ( wrongFileFlag )
  58.     {
  59.       errorFlag = 1;
  60.     }
  61.     else if ( (unsigned __int16)(const1 - 1) > 1u )
  62.     {
  63.       errorFlag = 1;
  64.       safeFileFlag = 0;
  65.     }
  66.     else
  67.     {                                           // floor / ciel (log2(compressedDataSize))
  68.                                                 // 12 8 5 2
  69.                                                 // if (!a6)
  70.                                                 // 12 8 8 4
  71.                                                 // else
  72.                                                 // 16 12 8 4
  73.  
  74.       logModifier = 3;
  75.       if ( shouldCeil )
  76.         logModifier = 4;
  77.       roundedLog = (_DWORD *)((compressed_data_size + logModifier) & 4294967292);
  78.       v16 = (_DWORD *)(*(int (**)(void))(**(_DWORD **)(a2Ref + 16) + 24))();// v16 = 0x14?
  79.       errorFlag = 1;
  80.       safeFileFlag = 0;
  81.       if ( v16 )
  82.       {
  83.         (*(void (__cdecl **)(_DWORD))(*(_DWORD *)*stringFileSize + 16))(*stringFileSize);
  84.         LODWORD(nameCheck) = (*(int (__cdecl **)(_DWORD, _DWORD *))(*(_DWORD *)*stringFileSize + 8))(
  85.                                *stringFileSize,
  86.                                v16);
  87.         if ( nameCheck != 1 )
  88.           goto LABEL_43;
  89.         if ( flag0 & 4 )                        // If the fourth bit of flag 0 is set
  90.         {
  91.           compressed_data_size -= 8;
  92.           last4Bytes = *(_DWORD *)((char *)v16 + compressed_data_size + 4);
  93.           preLast4Bytes = *(_DWORD *)((char *)v16 + compressed_data_size);
  94.           last4BytesRef = last4Bytes;
  95.         }
  96.         switch ( var1 )
  97.         {
  98.           case 0:
  99.             goto LABEL_32;
  100.           case 1:
  101.             compressed_data_sizeRef = compressed_data_size;
  102.             if ( compressed_data_size )
  103.             {
  104.               v20 = HIWORD(header_size_name_size);
  105.               v21 = v16;
  106.               do
  107.               {
  108.                 v20 = 0x19660D * v20 + 0x3C6EF35F;
  109.                 --compressed_data_sizeRef;
  110.                 *v21++ ^= v20;
  111.               }
  112.               while ( compressed_data_sizeRef );
  113.             }
  114.             goto LABEL_32;
  115.           case 2:
  116.             goto LABEL_26;
  117.           case 3:
  118.             safeFileFlag = 0;
  119.             if ( !sub_7F0CB4((int)v16, compressed_data_size, a4Ref, a5, (int)&preLast4Bytes, 0) )
  120.               goto LABEL_32;
  121.             errorFlag = 1;
  122.             goto LABEL_43;
  123.           default:
  124.             goto def_7F0B0A;
  125.         }
  126.         goto def_7F0B0A;
  127.       }
  128.     }
  129.   }
  130.   v22 = 0;
  131.   v16 = 0;
  132.   while ( 1 )
  133.   {
  134.     roundedLog = (_DWORD *)v22;
  135.     (*(void (**)(void))(**(_DWORD **)(a2Ref + 40) + 24))();
  136.     roundedLog = v16;
  137.     (*(void (**)(void))(**(_DWORD **)(a2Ref + 40) + 24))();
  138.     if ( errorFlag == 1 )
  139.     {
  140.       *a1Ref = 0;
  141.       a1Ref[1] = 0;
  142.     }
  143.     else
  144.     {
  145.       if ( a7 )
  146.         *a7 = flag0;
  147.       v16 = (_DWORD *)operator new(0x38u);
  148.       v16[1] = 0;
  149.       v16[2] = 0;
  150.       *v16 = &off_EB1684;
  151.       v16[4] = &off_EB16AC;
  152.       v16[5] = safeFileFlag;
  153.       v16[6] = v11;
  154.       sub_231E80(v16 + 8, a2Ref + 24);
  155.       *a1Ref = v16 + 4;
  156.       a1Ref[1] = v16;
  157.     }
  158.     result = _stack_chk_guard - initial_data;
  159.     if ( _stack_chk_guard == initial_data )
  160.       return result;
  161. LABEL_26:
  162.     if ( (unsigned int)(compressed_data_size + 3) >> 2 )
  163.     {
  164.       v24 = HIWORD(header_size_name_size);
  165.       v25 = (unsigned int)(compressed_data_size + 3) >> 2;
  166.       v26 = v16;
  167.       do
  168.       {
  169.         v24 = 0x19660D * v24 + 0x3C6EF35F;
  170.         --v25;
  171.         *v26 ^= v24;
  172.         ++v26;
  173.       }
  174.       while ( v25 );
  175.     }
  176. LABEL_32:
  177.     if ( (unsigned int)flag1 - 1 >= 2 )
  178.     {
  179.       if ( !flag1 )
  180.       {
  181.         v11 = compressed_data_size;
  182.         v28 = 0;
  183.         safeFileFlag = v16;
  184.         goto LABEL_39;
  185.       }
  186. def_7F0B0A:
  187.       errorFlag = 1;
  188.       safeFileFlag = 0;
  189. LABEL_43:
  190.       v22 = 0;
  191.     }
  192.     else
  193.     {
  194.       v33 = uncompressed_data_size;
  195.       roundedLog = (_DWORD *)(uncompressed_data_size + shouldCeil);
  196.       v27 = (*(int (**)(void))(**(_DWORD **)(a2Ref + 16) + 24))();
  197.       v22 = v27;
  198.       if ( !v27 )
  199.         goto def_7F0B0A;
  200.       if ( j_uncompress(v27, &v33, (int)v16, compressed_data_size) || (v11 = v33, v33 != uncompressed_data_size) )
  201.       {
  202.         errorFlag = 1;
  203.         safeFileFlag = 0;
  204.       }
  205.       else
  206.       {
  207.         safeFileFlag = (_DWORD *)v22;
  208.         v28 = v16;
  209. LABEL_39:
  210.         v22 = 0;
  211.         v16 = v28;
  212.         errorFlag = 0;
  213.         if ( shouldCeil == 1 )
  214.           *((_BYTE *)safeFileFlag + v11) = 0;
  215.       }
  216.     }
  217.   }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement