重新编译用 "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=*"
将它们添加到您的代码中,您将成功完成此挑战!
所以我面临以下挑战: 我收到二进制文件。在记事本++中打开时,第一行显示:
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=*" 将它们添加到您的代码中,您将成功完成此挑战!