重新编译用 "new" 语言编写的二进制程序

Recompile binary program written in "new" language

所以我面临以下挑战: 我收到二进制文件。在记事本++中打开时,第一行显示:

This program is developed with specific programming language. Opcodes: 0x3F byte - gotox byte, 0x40 byte - gotoy byte, 0x2400 - print ' ', 0x2401 - print ','

我从来没有做过那样的事情,但我想知道如何破解这个问题。基本上二进制文件是一个函数,我需要重新编译它并提取输出。

我的想法是用 C 打开二进制格式的文件,然后读取每个字节。但我不确定该怎么做……程序应该是什么。读取每个字节然后是什么?

感谢您的帮助:)

编辑:感谢 clbx,我取得了一些真正的进步,但我被困在了最后! 这是我的简单 C 代码:

#include <stdio.h>
#include <stdlib.h>

void gotoxy(int x, int y)
{
    printf("%c[%d;%df", 0x1B, y, x);
}

int main(int argc, char const *argv[])
{
    FILE *fp = fopen("elbitsystems.elbit", "rb");
    unsigned char byte, x, y, print_code;
    while (fread(&byte, 1, 1, fp) != 0)
    {
        switch (byte)
        {
        case 0x3F: // gotox byte
            fread(&x, 1, 1, fp);
            break;
        case 0x40: // gotoy byte
            fread(&y, 1, 1, fp);
            break;
        case 0x24: // print
            fread(&print_code, 1, 1, fp);
            if (print_code == 1)
            {
                gotoxy(x, y);
                printf(",");
            }
            break;
        default:
            break;
        }
    }
    fclose(fp);
    printf("\n");
    return 0;
}

这是我得到的输出:

我真的可以看到答案(“Sysco..?”但是其中一些被搞砸了,我不知道怎么办。我在网上找到了 gotoxy() 函数,它似乎可以工作..但不是很. 我尝试不使用它,而是创建了大小为 255,255 的二维数组,并在 while 循环后将其写入文本文件,结果与上图相同。 知道我能做什么吗?我觉得离终点很近了……不知道该怎么办哈哈。 谢谢!!

每个操作码都是一条指令,给出的字节决定了程序应该做什么。

看起来你只有 4 个操作码,这很简单:

0x3F 字节 - gotox 字节,

0x40 字节 - gotoy 字节,

0x2400 - 打印“ ”,

0x2401 - 打印','

你走对了,打开文件并逐字节读取。当你得到一个你知道的字节 (0x3F, 0x40, 0x2400, 0x2401) 时,执行它的相关函数 (goto x, goto y, print ' ', print '.'

我也试着解决了这个挑战,你做得很好! 请注意,在文件的中间有更多的操作码字符。 "2=%, 4=, 16=#, 32=(, 64=/, 128=*" 将它们添加到您的代码中,您将成功完成此挑战!