C语言文件解密函数freadEx分析
freadEx函数分析
本文分析的代码是一个自定义的fread函数,函数名为freadEx。它主要功能是从文件中读取数据,并对其进行解密操作,最终将解密后的数据存储到指定的内存地址。
freadEx解密过程
- 定位文件信息: freadEx首先根据传入的文件指针a4在一个全局变量数组中找到对应的位置。该位置存储着文件的偏移量和长度信息。
- 计算读取数据大小: 根据获取到的偏移量和长度信息,计算出需要读取的数据大小,并分配相应大小的内存空间。
- 读取并拼接数据:
- 根据偏移量将文件指针移动到相应位置,并读取偏移量前的数据(长度为偏移量对4取模的结果)。
- 将文件指针移动到偏移量后的位置,并读取指定大小的数据。
- 将文件指针移动到偏移量后的位置加上数据大小后的位置,并读取剩余的数据(长度为4减去偏移量对4取模的结果)。
- 解密操作: 对读取到的数据进行解密操作。
- 存储解密数据: 将解密后的数据存储到指定的内存地址中。
- 释放内存: 释放分配的内存空间,并返回读取的数据大小。
提取解密操作代码
以下代码是从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函数中的核心解密逻辑,可以用于其他需要解密类似数据的场景。
原文地址: https://www.cveoy.top/t/topic/frp 著作权归作者所有。请勿转载和采集!