AI生成的补丁
/*
* 文件二进制修改工具
* 功能:直接修改二进制文件中指定偏移量的数据
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 补丁信息结构体 */
typedef struct {
long offset; // 文件中的偏移量位置
unsigned char old_data[4]; // 原始数据(最大支持4字节)
unsigned char new_data[4]; // 要修改的新数据
size_t data_size; // 数据长度(1-4字节)
} PatchInfo;
/* 文件修改器结构体 */
typedef struct {
char* filename; // 要修改的文件名
PatchInfo* patches; // 补丁信息数组
int patch_count; // 补丁数量
} FilePatcher;
/*
* 应用补丁到文件
* 参数:patcher - 包含文件信息和补丁信息的结构体
* 返回:0成功,-1失败
*/
int apply_patches(FilePatcher* patcher) {
FILE* file = fopen(patcher->filename, "rb+"); // 以二进制读写模式打开文件
if (!file) {
perror("文件打开失败");
return -1;
}
// 遍历所有补丁并逐个应用
for (int i = 0; i < patcher->patch_count; i++) {
PatchInfo* patch = &patcher->patches[i];
unsigned char buffer[4]; // 读取缓冲区
// 定位到指定偏移量
fseek(file, patch->offset, SEEK_SET);
// 读取原始数据
if (fread(buffer, 1, patch->data_size, file) != patch->data_size) {
perror("读取原始数据失败");
fclose(file);
return -1;
}
// 验证原始数据是否匹配
if (memcmp(buffer, patch->old_data, patch->data_size) != 0) {
printf("错误:偏移量 0x%lX 的数据不匹配\n", patch->offset);
fclose(file);
return -1;
}
// 重新定位并写入新数据
fseek(file, patch->offset, SEEK_SET);
if (fwrite(patch->new_data, 1, patch->data_size, file) != patch->data_size) {
perror("写入新数据失败");
fclose(file);
return -1;
}
}
fclose(file);
return 0;
}
int main() {
// 定义要修改的两个补丁点
PatchInfo patches[] = {
// 第一个修改点:将0x2FE4F0F处的74 0A改为90 90
{0x2FE4F0F, {0x74, 0x0A}, {0x90, 0x90}, 2},
// 第二个修改点:将0x2A26EE1处的74改为EB
{0x2A26EE1, {0x74}, {0xEB}, 1}
};
// 初始化文件修改器
FilePatcher patcher = {
"codevm.exe", // 要修改的文件名
patches, // 补丁数组
sizeof(patches) / sizeof(PatchInfo) // 计算补丁数量
};
printf("正在修改文件 %s...\n", patcher.filename);
if (apply_patches(&patcher) == 0) {
printf("文件修改成功!\n");
} else {
printf("文件修改失败\n");
}
return 0;
}