Adds more decompilation options.

This commit is contained in:
Felix Queißner 2016-06-29 16:39:25 +02:00
parent 7bc60e8c18
commit 233a206329
2 changed files with 36 additions and 24 deletions

View file

@ -1,10 +1,13 @@
CC = gcc CC = gcc
all: exp all: explink expdump
exp: exp.c explink: explink.c
$(CC) -g exp.c -o exp $(CC) -g $^ -o explink
expdump: expdump.c
$(CC) -g $^ -o expdump
test: exp test: exp
./exp -o test.exp $(ARGS) ./exp -o test.exp $(ARGS)

View file

@ -162,8 +162,8 @@ void disassemble(Instruction *list, uint32_t count, uint32_t base, FILE *f)
{ {
case VM_INPUT_ZERO: if (v) fprintf(f, "[i1:zero] "); break; case VM_INPUT_ZERO: if (v) fprintf(f, "[i1:zero] "); break;
case VM_INPUT_POP: fprintf(f, "[i1:pop] "); break; case VM_INPUT_POP: fprintf(f, "[i1:pop] "); break;
case VM_INPUT_PEEK: fprintf(f, "[i1:peek] "); break; // case VM_INPUT_PEEK: fprintf(f, "[i1:peek] "); break;
case VM_INPUT_ARG: fprintf(f, "[i1:arg] "); break; // case VM_INPUT_ARG: fprintf(f, "[i1:arg] "); break;
} }
if (instr.command <= 12) if (instr.command <= 12)
@ -207,16 +207,18 @@ int main(int argc, char **argv)
{ {
opterr = 0; opterr = 0;
int headers = 0;
int dumpSections = 0; int dumpSections = 0;
int dumpMetas = 0; int dumpMetas = 0;
int disassembleSections = 0; int disassembleSections = 0;
int c; int c;
while ((c = getopt(argc, argv, "smdD")) != -1) while ((c = getopt(argc, argv, "HsmdD")) != -1)
{ {
switch (c) switch (c)
{ {
case 'H': headers = 1; break;
case 's': dumpSections = 1; break; case 's': dumpSections = 1; break;
case 'm': dumpMetas = 1; break; case 'm': dumpMetas = 1; break;
case 'D': disassembleVerbose = 1; case 'D': disassembleVerbose = 1;
@ -267,15 +269,18 @@ int main(int argc, char **argv)
continue; continue;
} }
if(headers)
{
// We should be sane now... // We should be sane now...
fprintf(stdout, "EXP FILE %s\n", fileName); fprintf(stdout, "EXP FILE %s\n", fileName);
fprintf(stdout, "Version: %d.%d\n", fileHeader.majorVersion, fileHeader.minorVersion); fprintf(stdout, "Version: %d.%d\n", fileHeader.majorVersion, fileHeader.minorVersion);
fprintf(stdout, "Sections: %d\n", fileHeader.numSections); fprintf(stdout, "Sections: %d\n", fileHeader.numSections);
fprintf(stdout, "Metas: %d\n", fileHeader.numMeta); fprintf(stdout, "Metas: %d\n", fileHeader.numMeta);
}
if (dumpSections) if (dumpSections || disassembleSections)
{ {
fprintf(stdout, "Sections:\n"); if(dumpSections) fprintf(stdout, "Sections:\n");
for (int i = 0; i < fileHeader.numSections; i++) for (int i = 0; i < fileHeader.numSections; i++)
{ {
@ -283,18 +288,22 @@ int main(int argc, char **argv)
fseek(f, fileHeader.posSections + i * sizeof(expsection_t), SEEK_SET); fseek(f, fileHeader.posSections + i * sizeof(expsection_t), SEEK_SET);
fread(&section, 1, sizeof(expsection_t), f); fread(&section, 1, sizeof(expsection_t), f);
if(dumpSections)
{
fprintf(stdout, " Section #%d\n", i); fprintf(stdout, " Section #%d\n", i);
fprintf(stdout, " Name: %s\n", section.name); fprintf(stdout, " Name: %s\n", section.name);
fprintf(stdout, " Type: %s\n", (section.type ? "Data" : "Code")); fprintf(stdout, " Type: %s\n", (section.type ? "Data" : "Code"));
fprintf(stdout, " Base: 0x%X\n", section.base); fprintf(stdout, " Base: 0x%X\n", section.base);
fprintf(stdout, " Start: %d\n", section.start); fprintf(stdout, " Start: %d\n", section.start);
fprintf(stdout, " Size: %d\n", section.length); fprintf(stdout, " Size: %d\n", section.length);
}
// Call disassembler // Call disassembler
if (disassembleSections && section.type == 0) if (disassembleSections && section.type == 0)
{ {
if(dumpSections)
fprintf(stdout, " Disassembly:\n"); fprintf(stdout, " Disassembly:\n");
else
fprintf(stdout, "; Section '%s'@0x%08X\n", section.name, section.base);
Instruction *buffer = malloc(section.length); Instruction *buffer = malloc(section.length);