C 可以用1和0查看二进制文件吗?
我的意思是,有没有可能用C写一个程序,编译它,然后看看它在1和0中是什么样子?像1337黑客一样假装用1和0编程是很酷的:p。使用或a查看十六进制字节的二进制文件 十六进制只是查看二进制的一种更简洁的方式。每个十六进制数字(0-F)表示四位。例如,C 可以用1和0查看二进制文件吗?,c,C,我的意思是,有没有可能用C写一个程序,编译它,然后看看它在1和0中是什么样子?像1337黑客一样假装用1和0编程是很酷的:p。使用或a查看十六进制字节的二进制文件 十六进制只是查看二进制的一种更简洁的方式。每个十六进制数字(0-F)表示四位。例如,0xF十进制为15,二进制为1111。您可以使用: C:\opt\bin>xxd-b ctags.exe | head 0000000:01001101 01011010 1001000000000000000011 00000000 MZ。。。。 0
0xF
十进制为15,二进制为1111。您可以使用:
C:\opt\bin>xxd-b ctags.exe | head
0000000:01001101 01011010 1001000000000000000011 00000000 MZ。。。。
0000006: 00000000 00000000 00000100 00000000 00000000 00000000 ......
000000c:11111111111111 00000000 00000000 101110000000000。。。。。。
0000012: 00000000 00000000 00000000 00000000 00000000 00000000 ......
0000018: 01000000 00000000 00000000 00000000 00000000 00000000 @.....
000001e:00000000000000000000000000000000000000000000000000000000000000。。。。。。
0000024: 00000000 00000000 00000000 00000000 00000000 00000000 ......
000002a:00000000000000000000000000000000000000000000000000000000000000000000。。。。。。
0000030: 00000000 00000000 00000000 00000000 00000000 00000000 ......
0000036: 00000000 00000000 00000000 00000000 00000000 00000000 ......
只是为了让这与编程更加相关:
#include <stdio.h>
#include <stdlib.h>
const char *lookup[] = {
/* 0 1 2 3 4 5 6 7 */
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
/* 8 9 A B C D E F */
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111",
};
int main(int argc, char *argv[]) {
FILE *fin;
int c;
size_t bytes_read = 0;
if ( argc != 2 ) {
fputs("No filename provided", stderr);
exit(EXIT_FAILURE);
}
fin = fopen(argv[1], "rb");
if ( !fin ) {
fprintf(stderr, "Cannot open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
while ( EOF != (c = fgetc(fin)) ) {
printf("%s", lookup[ (c & 0xf0) >> 4 ]);
printf("%s", lookup[ (c & 0x0f) ]);
bytes_read += 1;
if ( bytes_read % 9 == 0 ) {
puts("");
}
}
fclose(fin);
return EXIT_SUCCESS;
}
#包括
#包括
常量字符*查找[]={
/* 0 1 2 3 4 5 6 7 */
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
/*8 9 A B C D E F*/
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111",
};
int main(int argc,char*argv[]){
文件*fin;
INTC;
大小\u t字节\u读取=0;
如果(argc!=2){
fputs(“未提供文件名”,标准文件);
退出(退出失败);
}
fin=fopen(argv[1],“rb”);
如果(!fin){
fprintf(stderr,“无法打开%s\n”,argv[1]);
退出(退出失败);
}
而(EOF!=(c=fgetc(fin))){
printf(“%s”,查找[(c&0xf0)>>4]);
printf(“%s”,查找[(c&0x0f)];
字节_read+=1;
如果(字节数_读取%9==0){
认沽权(“”);
}
}
财务总监(财务);
返回退出成功;
}
输出:
C:\Temp> binary.exe c:\opt\bin\ctags.exe | head
010011010101101010010000000000000000001100000000000000000000000000000100
000000000000000000000000111111111111111100000000000000001011100000000000
000000000000000000000000000000000000000000000000010000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000111000000000000000000000
000000000000111000011111101110100000111000000000101101000000100111001101
001000011011100000000001010011001100110100100001010101000110100001101001
011100110010000001110000011100100110111101100111011100100110000101101101
C:\Temp>binary.exe C:\opt\bin\ctags.exe|head
010011010101101010010000000000000000001100000000000000000000000000000100
000000000000000000000000111111111111111100000000000000001011100000000000
000000000000000000000000000000000000000000000000010000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000111000000000000000000000
000000000000111000011111101110100000111000000000101101000000100111001101
001000011011100000000001010011001100110100100001010101000110100001101001
011100110010000001110000011100100110111101100111011100100110000101101101
当然有可能。您可以使用中的信息编写自己的查看器。您的意思是您不能在头脑中编译操作码并将其转换为二进制
实际上,我学习编程的一台计算机必须通过前面板开关切换引导代码。您需要输入足够的代码,使其能够将加载程序从8启动“软盘驱动器并加载操作系统。你可以看到一张照片。我真的需要知道引导加载程序操作码的二进制文件。是的。。。。只要用hexeditor打开编译好的程序。。。事实上,人们这样做是为了对东西进行反向工程*。可悲的是,我不得不盯着十六进制内存转储来调试工作中的某些崩溃。我的同事称之为“阅读矩阵”,而我认为这是“吃阿斯匹林的时候了”。如果你碰巧在Linux下运行KDE,KHexEdit是一个很好的十六进制编辑器。+1因为使用了8“软盘。这让我想起了几天我在一个巨大的柜子里与一个拥有64K内存的水冷IBM系统一起度过的时光?“几个操作码,几十个,几百个?”布鲁克斯——我希望我能记得。我不认为会有太多。我很确定我可以切换整个程序,跳过软盘。调试是通过单步遍历内存空间并查看指示1/0的红灯来检查值来完成的。当我将操作系统复制到自己的软盘上时,我得到了我的第一次反盗版讲座,这样我就可以将操作系统和程序放在一个软盘上,而不必切换。这给人留下了持久的印象。我想说的是,许可部门和我现在相处得很好。
#include <stdio.h>
#include <stdlib.h>
const char *lookup[] = {
/* 0 1 2 3 4 5 6 7 */
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
/* 8 9 A B C D E F */
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111",
};
int main(int argc, char *argv[]) {
FILE *fin;
int c;
size_t bytes_read = 0;
if ( argc != 2 ) {
fputs("No filename provided", stderr);
exit(EXIT_FAILURE);
}
fin = fopen(argv[1], "rb");
if ( !fin ) {
fprintf(stderr, "Cannot open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
while ( EOF != (c = fgetc(fin)) ) {
printf("%s", lookup[ (c & 0xf0) >> 4 ]);
printf("%s", lookup[ (c & 0x0f) ]);
bytes_read += 1;
if ( bytes_read % 9 == 0 ) {
puts("");
}
}
fclose(fin);
return EXIT_SUCCESS;
}
C:\Temp> binary.exe c:\opt\bin\ctags.exe | head
010011010101101010010000000000000000001100000000000000000000000000000100
000000000000000000000000111111111111111100000000000000001011100000000000
000000000000000000000000000000000000000000000000010000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000111000000000000000000000
000000000000111000011111101110100000111000000000101101000000100111001101
001000011011100000000001010011001100110100100001010101000110100001101001
011100110010000001110000011100100110111101100111011100100110000101101101