这个 Generate_Key_IV 汇编器例程是什么?

逆向工程 部件 C 加密 解密
2021-06-15 03:58:27

我想解压一些文件,并找到了一些关于如何解压的信息。显然,它们在 CFB 模式下使用 AES 128 加密,有时使用 ZLIB 压缩。每个文件的密钥和 IV 应该是根据文件大小生成的。此代码应该让他们:

Generate_Key_IV   proc near
      mov   eax, [ecx]
      movzx   edx, ax
      imul   edx, 9069h
      shr   eax, 10h
      add   edx, eax
      mov   eax, [ecx+4]
      push   esi                            ; Here file size
      movzx   esi, ax
      imul   esi, 4650h
      shr   eax, 10h
      add   eax, esi
      mov   [ecx], edx
      mov   [ecx+4], eax
      pop   esi
      test   edx, edx
      jnz   short loc_495EA2
      mov   dword ptr [ecx], 1
loc_495EA2:
      test   eax, eax
      jnz   short loc_495EAD
      mov   dword ptr [ecx+4], 0FFFFFFFFh
loc_495EAD:
      mov   eax, [ecx]
      shl   eax, 10h
      add   eax, [ecx+4]
      retn
Generate_Key_IV   endp

我知道这是在大会中,但不幸的是我不知道它是如何工作的。我当然可以学习它,但我预计这会花费大量时间,而且我认为除了弄清楚上述含义之外,我不会将它用于更多用途。

所以,是的,如果有人可以概述上述内容的作用以及获取密钥和 IV 的方法和/或算法,我将不胜感激。

还给出了此 C 代码,显然显示了如何使用上述代码:

int __usercall sub_47AFA0<eax>(int a1<eax>, int a2<ebp>, void *a3, size_t a4, __int64 a5)
{
  unsigned int v5;  // edi@1
  unsigned int v6;  // edi@3
  char v8;          // [sp-1A0h] [bp-1ACh]@2
  int v9;           // [sp-198h] [bp-1A4h]@1
  void *v10;        // [sp-194h] [bp-1A0h]@1
  char v11;         // [sp-190h] [bp-19Ch]@5
  char v12;         // [sp-140h] [bp-14Ch]@5
  int v13;          // [sp-40h] [bp-4Ch]@6
  void *v14;        // [sp-3Ch] [bp-48h]@5
  char v15;         // [sp-34h] [bp-40h]@2
  char v16;         // [sp-24h] [bp-30h]@4
  unsigned int v17; // [sp-14h] [bp-20h]@1
  char *v18;        // [sp-10h] [bp-1Ch]@1
  int v19;          // [sp-Ch] [bp-18h]@1
  int (__cdecl *v20)(int, int); // [sp-8h] [bp-14h]@1
  signed int v21;   // [sp-4h] [bp-10h]@1
  int v22;          // [sp+0h] [bp-Ch]@1
  void *v23;        // [sp+4h] [bp-8h]@1
  char v24;         // [sp+8h] [bp-4h]@1
  int v25;          // [sp+Ch] [bp+0h]@1

  v22 = a2;
  v23 = (void *)v25;
  v21 = -1;
  v20 = sub_72CCC6;
  v19 = a1;
  v18 = &v24;
  v17 = (unsigned int)&v22 ^ __security_cookie;
  v10 = a3;
  v9 = sub_5657C0(a4);
  sub_495EC0(a4 * a5, (unsigned __int64)a4 * a5 >> 32);
  v5 = 0;
  do
    *(&v15 + v5++) = Generate_Key_IV((int)&v8);                          ;Generating KEY
  while ( v5 < 0x10 );
  v6 = 0;
  do
    *(&v16 + v6++) = Generate_Key_IV((int)&v8);                          ;Generating IV
  while ( v6 < 0x10 );
  sub_47AC20(&v15, 16, &v16);                          ; AES Routine
  v21 = 0;
  sub_433E00(v9, v10, a4);
  v21 = 1;
  sub_4799F0(&v11);
  if ( v14 == &v12 + (-(signed int)&v12 & 0xF) )
    memset(v14, 0, 4 * v13);
  return __security_check_cookie((unsigned int)&v22 ^ v17);
}

我假设这只是使用密钥和 IV 来使用 AES 解码文件。但是,如果它包含我应该知道的任何必要内容,那当然也很棒。

1个回答

它是一个伪随机数生成器:它是一段简单的代码,可以生成难以预测的值,同时不会花费太长时间来计算。查看维基百科文章了解更多信息。

编辑:等效的 C 代码类似于:

int random(unsigned int *seed)
{
  int temp1;
  int temp2;

  temp1 = (*seed >> 16) + 36969 * (unsigned short)*seed;
  temp2 = 18000 * (unsigned short)seed[1] + (seed[1] >> 16);
  *seed = temp1;
  seed[1] = temp2;
  if (!temp1) *seed = 1;
  if (!temp2) seed[1] = -1;
  return seed[1] + (*seed << 16);
}