-
Notifications
You must be signed in to change notification settings - Fork 0
/
pack_exe.c
91 lines (75 loc) · 2.38 KB
/
pack_exe.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//
// Created by Eric Fry on 7/1/21.
//
#include <strings.h>
#include "file.h"
uint32 getEXESize(FILE *file) {
uint16 word = file_read2(file);
uint32 offset = 0;
while(word == 0x5a4d) { // 'MZ'
uint16 bytesInLastBlock = file_read2(file);
uint16 blocksInEXE = file_read2(file);
offset = blocksInEXE * 512;
if (bytesInLastBlock) {
offset -= (512 - bytesInLastBlock);
}
word = file_read2(file);
}
return offset;
}
void encodeFilename(unsigned char *filename) {
for(int i = 0; i < 14; i++) {
if (filename[i] != 0) {
filename[i] = filename[i] + 0x60;
}
}
}
void writeFileToArchive(char *filename, FILE *outfile) {
FILE *inputFile = file_open(filename, "r");
uint32 size = file_get_size(filename);
for (int i = 0; i < size; i++) {
uint8 byte = file_read1(inputFile);
fwrite(&byte, 1, 1, outfile);
}
fclose(inputFile);
}
int main(int argc, char *argv[]) {
if (argc < 4) {
printf("Usage: %s originalEXEFile outputFile [files to be packed]\n", argv[0]);
return 1;
}
FILE *inputFile = file_open(argv[1], "r");
FILE *outputFile = file_open(argv[2], "wb");
uint32 exeSize = getEXESize(inputFile);
uint16 numEntries = argc - 3;
printf("Original EXE Size: %d\n", exeSize);
printf("numEntries: %d\n", numEntries);
fseek(inputFile, 0, SEEK_SET);
if (exeSize > 0) {
for (int i = 0; i < exeSize; i++) {
uint8 byte = file_read1(inputFile);
fwrite(&byte, 1, 1, outputFile);
}
}
file_write2(0x424d, outputFile);
file_write2(numEntries, outputFile);
uint32 headerTableOffset = ftell(outputFile);
uint32 dataOffset = headerTableOffset + (numEntries * 22);
for( int i = 0; i < numEntries; i++) {
unsigned char filenameEncoded[14];
strcpy((char *)filenameEncoded, argv[3 + i]);
uint32 size = file_get_size((char *)filenameEncoded);
file_write4(size, outputFile);
file_write4(dataOffset, outputFile);
encodeFilename(filenameEncoded);
fwrite(filenameEncoded, 1, 14, outputFile);
dataOffset += size;
}
//TODO write actual filedata here
for( int i = 0; i < numEntries; i++) {
writeFileToArchive(argv[3 + i], outputFile);
}
fclose(inputFile);
fclose(outputFile);
return 0;
}