2021-4-3 00:13 /
这是别人委托搞的,由于没有说要回封,我就只写了提取部分。其实这个脚本要回封很简单,直接把文本塞回去就可以了。由于没有记录脚本长度,所以回封时可以不考虑修正offset之类的玩意儿。
#pragma pack (1)
typedef struct {
char Magic[8]; // PCATSCN\0
DWORD unk; // 0x20
DWORD unk2; // 0x1
DWORD FuncStart; // 从文件头开始计算
DWORD FuncEnd; // 从文件头开始计算
DWORD FuncCount; // 计算从UnkSize到UnkSize2内的函数名个数(autoexec.adv)
} adv_header;
#pragma pack ()
int main(int argc, char* argv[])
{
//char FileName[] = "partA1.adv";
char* FileName = argv[1];
FILE* fp = fopen(FileName, "rb");
fseek(fp, 0, SEEK_END);
DWORD FileSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
char* FileBuff = (char*)malloc(FileSize);
if (!fp)
return E("No FileBuff");
fread(FileBuff, FileSize, 1, fp);
fclose(fp);
adv_header* header = (adv_header*)FileBuff;
if (strcmp(header->Magic, "PCATSCN"))
return E("Not PCATSCN");
FileBuff += header->FuncEnd;
char nfnm[MAX_PATH] = { 0 };
sprintf(nfnm, "%s.txt", FileName);
fp = fopen(nfnm, "wb");
char* text_buf = nullptr;
DWORD text_len = 0;
// sub_4221C0
for (int pos = 0; pos < FileSize - header->FuncEnd;)
{
switch (FileBuff[pos] & 0xFF)
{
case 0x90:
pos++;
switch (FileBuff[pos] & 0xFF)
{
case 0x11:
case 0x25:
case 0x28:
pos++;
text_buf = FileBuff + pos;
text_len = strlen(text_buf);
WriteLine(text_buf, text_len, fp);
pos += text_len;
break;
default:
pos++;
break;
}
break;
default:
pos++;
break;
}
}
fclose(fp);
system("pause");
return 0;
}