【问题标题】:Identify whether a portable executable is an ssh client application确定可移植可执行文件是否是 ssh 客户端应用程序
【发布时间】:2021-09-01 20:48:01
【问题描述】:

如标题所示,我需要开发一个 C++ 程序来识别 .exe 文件是否是 ssh 客户端应用程序。我做了一些研究,但我的脑海中并不清楚,这些解决方案中的哪一个可能适用于这个问题:

我是否已经解析了引用可移植可执行文件格式的 .exe,或者只是阅读了二进制文件并检查了特定的“客户端 ssh 应用程序”。

ssh 客户端应用程序与其他应用程序有何不同,它们的独特特征将帮助我区分或指出它们。显示原始二进制文件的简单、幼稚的解决方案将由下面的代码表示。现在有人说要在此数据上搜索单词“ssh”(这意味着我可以在字符串上应用正则表达式模式并找到 ssh 旁边的任何内容)。还有其他方法可以解决这个问题吗?

int main(int argc, char* argv[])
{
    std::ifstream fs;

    fs.open(argv[0], std::ios::binary);
    if (fs.fail())
    {
        std::cerr << "Failed to open file!" << std::endl;
        return 0;
    }

    fs.seekg(0, std::ios::end);
    std::size_t index = fs.tellg();

    char* buff = new char[index];
    fs.seekg(0, std::ios::beg);
    fs.read(buff, index);
    fs.close();

    std::string s;
    s.assign(buff, index);
    delete[] buff;

    std::cout << s;

    std::cin.ignore();
}

【问题讨论】:

  • 怀疑您可以以任何可靠的方式对所有可能的可执行文件执行此操作。为什么需要这样做?基本目标是什么?
  • 如果您的目标是在二进制文件中查找给定的字符串,而您的代码无法正常工作,那么这就是 Stack Overflow 的主题。
  • 99% 的问题可以通过“是叫 putty.exe 还是 ssh.exe?”来解决。剩下的 1% 可能包括加密的可执行文件,如果不运行它们,你就无法知道它们做了什么(并且使用一些调试器和 VM 检测技术甚至可能还没有)。

标签: c++ ssh


【解决方案1】:

根据Rice's theorem不可能查看一个程序并自动判断该程序是否做了某件事。这就是病毒扫描程序如此复杂且并不总是准确的原因。

您可能会查找字符串“ssh”,但如果有人不想让您知道他们的程序是 SSH 客户端程序,那么它会存储字符串“tti!dmjfou”,然后从所有 ASCII 中减去 1运行时的代码?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2015-12-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多