检查可执行文件是不是可以尝试连接到互联网

Posted

技术标签:

【中文标题】检查可执行文件是不是可以尝试连接到互联网【英文标题】:Check if executable may try to connect to the internet检查可执行文件是否可以尝试连接到互联网 【发布时间】:2014-05-01 15:42:30 【问题描述】:

我正在为我的年终学校项目编写一个简单的反恶意软件。我已经掌握了一些基础知识,但我想添加一个功能来检查可执行文件,看看它是否会尝试连接到互联网。

我应该以哪种方式处理这个问题?查看用 C 编写的程序的十六进制,我可以看到包含的库以纯文本显示。我应该寻找像 socket.h 这样的库吗?这可靠吗?

请注意,我是一名道德黑客专业二年级学生,因此我预计不会生产出与专业 AV 软件相媲美的产品。

我也在用 Python 编写我的 AV 并在 Linux 下演示它。

【问题讨论】:

你在 python 中确实有套接字,但是直接使用它是一个痛苦的 ... 腿。将 url 请求放入函数并检查结果/错误不是更容易吗?我认为 urlopen 可能会在几秒钟后报告连接失败 我不认为寻找字符串是可靠的,因为函数可以按序号从 DLL 中导入,而不是必须按名称(至少在 Windows 下)。简短的回答是,没有简单的方法来检查程序是否连接到互联网。 【参考方案1】:

我不认为您将能够看到是否包含socket.h,并且相关函数在 libc 中,因此它们将始终可供应用程序使用。我会尝试看看应用程序是否真的调用了这些函数。

检查可执行文件是否直接调用套接字函数的简单方法(在 shell 中):

objdump -D `which wget` | grep '<\(accept\|bind\|connect\|getpeername\|getsockname\|getsockopt\|listen\|recv\|recvfrom\|recvmsg\|send\|sendmsg\|sendto\|setsockopt\|shutdown\|socket\|socketpair\)@'

objdump -D 反汇编可执行文件(包括数据部分,以防某些恶意可执行文件使用了一些诡计),然后 grep 检查对 socket.h 中原型化的 libc 函数的任何调用。

但这只有在可执行文件本身直接调用套接字函数时才有效,但情况并非总是如此。将wget 替换为curl,您将不会得到任何结果。原因是curl的网络功能都在libcurl内。

那么,下一步:查看库。

ldd `which curl`

实际上,这甚至可能是您的第一步。如果可执行文件链接到一些明显的网络库(即libssl.so.1.0.0),你可以在这里停下来。但假设不是,您现在拥有可执行文件加载的动态库列表。你也可以在上面使用objdump -D。反汇编/usr/lib/x86_64-linux-gnu/libcurl.so.4 表明该库确实调用了套接字函数。

希望这能给你一个不错的起点。除了单调乏味(尽管您将编写代码来为您执行此操作这一事实减轻了这一点),还有一个问题是任何与套接字函数命名相同的外部函数都将使用我的命令行显示。如果您可以接受误报方面的错误,那应该没什么大不了的,但是可能有更好的方法来检查功能。

编辑:这可能不适用于所有二进制文件。 grep 直接在可执行文件中找到这些函数名称,这是我在 Ubuntu 中的分布式 wgetcurl 上没想到的。

【讨论】:

感谢您的回答。另外,请原谅我的无知,但您的方法是否仅适用于用 C 编写的可执行文件? 是的。它可以与编译为机器代码的其他语言一起使用,但解释/字节码语言需要不同的方法。例如,使用 Python,您可以检查 .py 文件(即socketurllib 等)中的任何相关导入,并对.pyc/.pyo 文件使用 Python 反编译器 - 但您还需要执行C 风格检查任何 .so 文件是否存在(以防有人创建 C 扩展以直接使用套接字函数以绕过这些导入)。【参考方案2】:

您所说的是一种签名扫描形式。

您会将代码与已知的恶意代码签名进行比较,并查看该代码是否包含在恶意应用程序中。

假设这是一行代码,被称为恶意代码并编译为特定的签名,该签名也是已知的:

Send IP address to hacker

十六进制

 00105e0 e6b0 343b 9c74 0804 e7bc 0804 e7d5 0804
 00105f0 e7e4 0804 e6b0 0804 e7f0 0804 e7ff 0804
 0010600 e80b 0804 e81a 0804 e6b0 0804 e6b0 0804

然后,您的程序可能会搜索文件的十六进制以尝试定位已知的恶意签名。

你更有可能在短时间内完成的事情就是所谓的:

行为屏蔽

想想病毒或恶意代码可能会尝试对您的系统进行的操作,并加以注意。 前面的代码假装连接并在某处发送一个 IP 地址。 与防火墙非常相似,您可以观察尝试建立的连接 OUT 并提醒用户。

您还可以监视通常未修改或访问的文件是否发生此类情况。

【讨论】:

以上是关于检查可执行文件是不是可以尝试连接到互联网的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ANSI C 检查文件是不是可执行?

如何通过连接到 sqlite3 数据库来制作可执行的 python tkinter 文件

我的可执行 JavaFX 文件如何连接到 MySQL 数据库?

如何测试输出到 std::cout (连接到管道)是不是会阻塞

将 sqlite DB 添加到可执行 JAR 文件

谁知道怎么把java web项目打包成exe可执行文件,要连数据库一起打包