以下代码是一个自定义的 fread 函数 freadEx,它类似于标准库函数 fread,并包含解密功能。

int __fastcall freadEx(int a1, int a2, int a3, FILE *a4)
{
  int v4; // r4
  FILE *v5; // r5
  int v6; // r10
  int v7; // r3
  FILE **v8; // r11
  int v9; // r9
  int v10; // r6
  char *v11; // r8
  int v12; // r9
  int v13; // r1
  int v14; // lr
  char *v15; // r3
  unsigned int v16; // r5
  unsigned int v17; // r4
  unsigned int v18; // r6
  int v20; // [sp+Ch] [bp-1Ch]
  int v21; // [sp+10h] [bp-18h]
  int size; // [sp+14h] [bp-14h]
  int v23; // [sp+18h] [bp-10h]

  v4 = a2;
  v5 = a4;
  v6 = a3;
  v7 = 0;
  if ( dword_12B48 < 1 )
    return 0;
  v8 = (FILE **)&unk_12054;
  while ( *(v8 - 3) != v5 )
  {
    ++v7;
    v8 += 11;
    if ( v7 >= dword_12B48 )
      return 0;
  }
  if ( v7 < 0 )
    return 0;
  v23 = a1;
  v9 = (int)*(v8 - 2);
  if ( v9 )
  {
    v10 = (int)*(v8 - 1);
    size = a3 * a2;
    v11 = (char *)malloc(a3 * a2 + 6);
    if ( v11 )
    {
      v20 = (v10 & 3) + v6 * v4;
      _aeabi_memclr(v11, v6 * v4 + 6);
      fseek(v5, v10 + v9 - (v10 & 3), 0);
      fread(v11, v10 & 3, 1u, v5);
      fseek(v5, v10 + v9, 0);
      v21 = (int)&v11[v10 & 3];
      fread(&v11[v10 & 3], size, 1u, v5);
      fseek(v5, v10 + v9 + size, 0);
      v12 = (4 - v20 % 4) % 4;
      fread(&v11[v20], v12, 1u, v5);
      if ( v12 + v20 >= 4 )
      {
        v13 = 0;
        v14 = -(v10 & 3);
        do
        {
          v15 = &v11[4 * v13];
          v17 = _byteswap_ulong(*(_DWORD *)&v11[4 * v13]);
          if ( v17 + 1 >= 2 )
          {
            v16 = ((unsigned __int8)v11[4 * v13 + 1] << 16) | ((unsigned __int8)v11[4 * v13] << 24) | ((unsigned __int8)v11[4 * v13 + 2] << 8);
            v18 = *(unsigned int *)((char *)v8 + (((unsigned __int8)*(v8 - 1) + (_BYTE)v14) & 0x1C)) ^ ((((v17 << 23) | (v16 >> 9)) >> 13) | (v16 >> 9 << 19));
            v11[4 * v13] = HIBYTE(v18);
            v15[1] = BYTE2(v18);
            v15[2] = BYTE1(v18);
            v15[3] = v18;
          }
          ++v13;
          LOBYTE(v14) = v14 + 4;
        } while ( v13 < (v12 + v20) / 4 );
      }
      _aeabi_memcpy(v23, v21, size);
      free(v11);
      return v6;
    }
    return 0;
  }
  return fread(a1, a2, a3, (int)v5);
}

传入的四个参数分别是什么:

  1. a1 读取数据的存放地址。
  2. a2 每个数据项的大小(单位字节)。
  3. a3 要读取的数据项的个数。
  4. a4 文件指针,指向要读取的文件。

代码分析:

  1. 初始化和参数处理:

    • 将参数分别赋值给局部变量 v4, v5, v6
    • 初始化 v7 为 0,用于循环计数。
  2. 文件指针校验:

    • 检查全局变量 dword_12B48 是否小于 1,该变量可能表示文件指针的个数。
    • 如果 dword_12B48 小于 1,则返回 0,表示没有有效的文件指针。
  3. 查找文件指针:

    • 使用一个循环遍历全局变量 unk_12054,该变量可能是一个存放文件指针的数组。
    • 循环遍历每个文件指针,直到找到与 a4 相匹配的指针。
    • 如果循环结束仍未找到匹配的指针,则返回 0。
  4. 加密文件处理:

    • v9 表示当前文件指针对应的文件是否加密,如果 v9 非零,则需要进行解密操作。
    • 使用 malloc 函数分配内存空间用于存储读取的数据,并进行初始化。
    • 通过一系列 fseekfread 操作,读取文件内容并进行解密操作。
    • 解密算法没有在代码中体现,需要根据具体情况分析。
  5. 解密操作:

    • 代码中使用了一系列位操作和循环来完成解密操作。
    • 具体解密算法需要根据实际情况分析。
  6. 数据拷贝和内存释放:

    • 将解密后的数据拷贝到 a1 指示的地址。
    • 使用 free 函数释放之前分配的内存空间。
  7. 非加密文件处理:

    • 如果 v9 为 0,则说明文件未加密,直接调用标准库函数 fread 读取文件内容。

总结:

freadEx 函数是一个自定义的文件读取函数,它包含解密功能,通过一系列操作读取文件内容并进行解密,最后将解密后的数据拷贝到指定的地址。该函数代码中的解密算法需要根据实际情况进行分析。

freadEx 函数解析 - 自定义文件读取和解密

原文地址: http://www.cveoy.top/t/topic/fuN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录