保护重新编写 PHP 脚本

逆向工程 工具 php
2021-06-22 20:30:56

我有一个非常凌乱的 PHP 脚本,我需要确定它的功能。我不能完全理解的代码,这是真的乱了。现在我想我也许可以对这个脚本进行逆向工程。

我想要做的是运行这个脚本(最终对特定部分进行注释)以更好地理解脚本的哪一部分做了什么。有了这些信息,我应该能够全面了解脚本。

但是,我不想更改服务器上的数据库中的任何内容,我不希望脚本会邮寄东西等。基本上,脚本应该与世界完全分离,但我确实想看看它试图做。所以,例如,当脚本运行一个mail()函数时,我想看到如果脚本没有与世界分开,邮件就会被发送。

因此,我需要一份服务器安装(Ubuntu Server 12.04)的副本,这并不难。困难的部分是我需要一个系统,它的行为就像是外部世界,但实际上是一个日志系统,我可以在其中看到正在发生的事情。

有什么工具可以做到这一点吗?如果没有,我应该如何自己构建它?

4个回答

我建议使用虚拟机来测试您的示例。如果示例要与其他机器交互(例如,如果它发送邮件但邮件服务器位于 mail.example.com),那么您可能想要模拟两台机器设置。如果一切都已经在您的示例将运行的机器上配置好了(所以邮件调用是在本地进行的),那么您可能只需要一台虚拟机。

设置虚拟机仅主机网络

如果您拥有 VMWare,您可以使用它,也可以使用免费VirtualBox如果您使用仅限主机的网络(VMWareVirtualBox指令),那么您可以从主机内嗅探 VM 的网络流量,但流量永远不会离开您的主机。

运行示例之前

如果你怀疑这个 php 脚本会改变你的虚拟机的状态(例如它会删除数据库或覆盖文件),那么我建议你拍一个快照。通过这种方式,您始终可以还原脚本运行时所做的任何更改。VMWareVirtualBox说明。

运行示例

一旦构建了虚拟网络,您就可以在使用wireshark 之类的工具捕获流量的同时运行您的示例这将捕获所有网络流量

获得外部反馈

正如您所描述的,您的示例可能不需要与虚假服务通信,但如果需要,您可以查看以下几个应用程序。

  • 视窗
    • Mick 提到的FakeNet,如果您在 Windows XP SP3 上运行,这是一个很好的解决方案。
  • Linux
    • inetsim - 这将模拟对应用程序级协议(如 HTTP、TCP 或 SMTP)的响应。它还可以回复 DNS 请求。
    • Honeyd - 这比 inetsim 更轻巧,但也会模拟应用程序级协议(如 HTTP、TCP 或 SMTP)的响应。它还可以回复 DNS 请求。
    • farpd - 如果您不知道将请求的 IP 地址,此实用程序非常有用。此应用程序可用于将 IP 流量重定向到您的虚拟机。

您或许可以使用开源FakeNet来模拟真实网络。

但是,FakeNet 被设计为在XP SP3 系统上运行,因此使用它需要您确保流量从您的 Ubuntu 系统/VM 路由到 XP sp3 系统/VM。

可能有一些基于 Linux 的 FakeNet 替代品,但我之前在分析 Windows 恶意软件时使用过 FakeNet,并且效果很好。

特征

  • 支持 DNS、HTTP 和 SSL
  • HTTP 服务器总是服务于一个文件并尝试服务于一个有意义的文件;如果恶意软件请求 .jpg,则提供格式正确的 .jpg,等等。提供的文件是用户可配置的。
  • 能够将所有流量重定向到本地主机,包括发往硬编码 IP 地址的流量。
  • Python 扩展,包括通过 SSL 实现 SMTP 和 SMTP 的示例扩展。
  • 内置为本地主机上的数据包创建捕获文件 (.pcap) 的功能。
  • 虚拟侦听器将侦听任何端口上的流量,自动检测和解密 SSL 流量并将内容显示到控制台。

一个更通用的解决方案是使用类似runkit 的东西,一个 PHP 扩展来拦截任意函数调用。与其尝试模拟网络(对于您的情况来说更安全的选择),如果您知道要防止被调用的完整函数集,您可以简单runkit_function_redefine地记录一条消息。

既然你已经有了源文件,我相信有一种更简单、更容易的方法(与在低级别重新路由网络流量相比,拦截被调用的方法。)

首先,识别并替换你的 php 文件中的方法(记得复制一份!)。例如,如果你想拦截mail(),你可以找到mail(并替换为shim_mail(您也可以为其他有趣的方法(例如mysql_connect().

完成后,include 'shim.php';在文件顶部添加“shim”将充当 php 脚本和实际方法之间的一层,因此您可以选择将其记录到文本文件中,允许它执行,甚至将其指向副本数据库!

shim.php

$logfile = 'log.txt';

function shim_mysql_connect($server, $username, $password, $new_link = false, $client_flags = 0)
{
    file_put_contents($logfile, file_get_contents($logfile) . "\r\nmysql_connect() to " . $server . " with username " . $username . " and password " . $password);

    // intercept the command and point it to the 'honeypot'
    return mysql_connect('your_new_server', 'username', 'password');
}

function shim_mail($to, $subject, $message, $additional_headers = '', $additional_parameters = '')
{
    file_put_contents($logfile, file_get_contents($logfile) . "\r\nmail() to " . $to . " with subject " . $subject . " and message " . $message);

    // don't actually send an email
}

?>

在这个 shim 文件中,您可以添加您有兴趣了解的功能(只需复制与原始文件相同的方法签名并打印相关日志即可)。通过观察日志,你可能会发现更多关于php脚本的信息!

(在我编写这个的中途,我意识到 Daniel W. Steinbrook 也提出了一个类似的方法。我的方法有一个小小的优点,它在不添加新依赖项的情况下更简单,但 runkit 听起来是一个更正确的方法。无论哪种方式,您可以简单地选择一个有效的!)