试图输出exe文件中的所有内容

时间:2015-10-13 21:45:06

标签: c++ ifstream

我试图输出此.exe文件的纯文本内容。它有明文内容,如#34;以这种方式更改代码不会影响最终优化代码的质量。"所有的东西微软放入.exe文件。当我运行以下代码时,我得到M Z E的输出,后跟一颗心和一颗钻石。我做错了什么?

ifstream file;
char inputCharacter;    

file.open("test.exe", ios::binary);

while ((inputCharacter = file.get()) != EOF)
{   

    cout << inputCharacter << "\n";     
}


file.close();

4 个答案:

答案 0 :(得分:4)

我会使用std::isprint之类的东西来确保字符是可打印的,而不是在打印之前的某些奇怪的控制代码。

这样的事情:

#include <cctype>
#include <fstream>
#include <iostream>

int main()
{
    std::ifstream file("test.exe", std::ios::binary);

    char c;
    while(file.get(c)) // don't loop on EOF
    {
        if(std::isprint(c)) // check if is printable
            std::cout << c;
    }
}

答案 1 :(得分:3)

您已打开二进制流,这有助于达到预期目的。但是,您按原样打印每个二进制数据:某些字符不可打印,给出奇怪的输出。

潜在解决方案:

如果要打印exe的内容,您将获得比可打印的字符更多的不可打印字符。因此,一种方法可能是打印十六进制值:

while ( file.get(inputCharacter ) )
{   
    cout << setw(2) << setfill('0') << hex << (int)(inputCharacter&0xff) << "\n";     
}

或者您可以使用显示十六进制值的调试器方法,然后显示char,如果它可打印或&#39;。&#39;如果没有:

while (file.get(inputCharacter)) {
    cout << setw(2) << setfill('0') << hex << (int)(inputCharacter&0xff)<<" ";
    if (isprint(inputCharacter & 0xff))
        cout << inputCharacter << "\n";
    else cout << ".\n";
}

嗯,为了符合人体工程学,如果exe文件包含任何真正的exe,你最好选择在每一行显示几个字符; - )

答案 2 :(得分:2)

二进制文件是字节的集合。字节的值范围为0..255。可以安全打印的可打印字符&#34;形成一个更窄的范围。假设大多数基本的ASCII编码

  • 32..63
  • 64..95
  • 96..126
  • 加上,如果您的代码页有
  • ,可能会高于128

请参阅ascii table

超出该范围的每个角色至少可以:

  • 打印为不可见
  • 打印出一些奇怪的垃圾
  • 实际上是一个控制角色,可以更改终端的设置

一些终端支持&#34;文本结束&#34;字符,然后将停止打印任何文本。也许你打了那个。

我要说,如果您只对文字感兴趣,那么只打印那些原则并忽略其他原语。或者,如果你想要一切,那么可能用十六进制形式写出来吗?

答案 3 :(得分:0)

这有效:

ifstream file;
char inputCharacter;
string Result;

file.open("test.exe", ios::binary);

while (file.get(inputCharacter))
{       
    if ((inputCharacter > 31) && (inputCharacter < 127))
        Result += inputCharacter;       
}

cout << Result << endl;
cout << "These are the ascii characters in the exe file" << endl;
file.close();