freadEx函数分析

本文分析的代码是一个自定义的fread函数,函数名为freadEx。它主要功能是从文件中读取数据,并对其进行解密操作,最终将解密后的数据存储到指定的内存地址。

freadEx解密过程

  1. 定位文件信息: freadEx首先根据传入的文件指针a4在一个全局变量数组中找到对应的位置。该位置存储着文件的偏移量和长度信息。
  2. 计算读取数据大小: 根据获取到的偏移量和长度信息,计算出需要读取的数据大小,并分配相应大小的内存空间。
  3. 读取并拼接数据:
    • 根据偏移量将文件指针移动到相应位置,并读取偏移量前的数据(长度为偏移量对4取模的结果)。
    • 将文件指针移动到偏移量后的位置,并读取指定大小的数据。
    • 将文件指针移动到偏移量后的位置加上数据大小后的位置,并读取剩余的数据(长度为4减去偏移量对4取模的结果)。
  4. 解密操作: 对读取到的数据进行解密操作。
  5. 存储解密数据: 将解密后的数据存储到指定的内存地址中。
  6. 释放内存: 释放分配的内存空间,并返回读取的数据大小。

提取解密操作代码

以下代码是从freadEx函数中提取的解密操作代码,并将其封装成一个名为decryptData的函数:

void decryptData(char* data, int size, int offset) {
    int v13 = 0;
    int v14 = -(offset & 3);
    do {
        char* v15 = &data[4 * v13];
        unsigned int v17 = _byteswap_ulong(*reinterpret_cast<unsigned int*>(&data[4 * v13]));
        if (v17 + 1 >= 2) {
            unsigned int v16 = ((unsigned char)data[4 * v13 + 1] << 16) | ((unsigned char)data[4 * v13] << 24) | ((unsigned char)data[4 * v13 + 2] << 8);
            unsigned int v18 = *(unsigned int*)((char*)v8 + (((unsigned char)*(v8 - 1) + (_BYTE)v14) & 0x1C)) ^ ((((v17 << 23) | (v16 >> 9)) >> 13) | (v16 >> 9 << 19));
            v15[0] = static_cast<char>(v18 >> 24);
            v15[1] = static_cast<char>(v18 >> 16);
            v15[2] = static_cast<char>(v18 >> 8);
            v15[3] = static_cast<char>(v18);
        }
        ++v13;
        LOBYTE(v14) = v14 + 4;
    } while (v13 < size / 4);
}

参数说明:

  • data: 要解密的数据的起始地址。
  • size: 数据的大小。
  • offset: 偏移量。

该decryptData函数实现了freadEx函数中的核心解密逻辑,可以用于其他需要解密类似数据的场景。

C语言文件解密函数freadEx分析

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

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