使用现有的TCP连接发送数据包

时间:2014-05-12 23:14:58

标签: windows tcp winsock socks

我正在使用WPE PRO,我可以捕获数据包并将其发回。我尝试使用WinSock 2(WPE PRO使用的相同的lib),但我不知道如何将数据包发送到现有的TCP连接,如WPE PRO。

http://wpepro.net/index.php?categoryid=2

我该怎么做?

1 个答案:

答案 0 :(得分:5)

您是否在询问如何让其他人的程序通过现有的Winsock连接发送数据?

我已经做到了这一点,但遗憾的是目前还没有手头的代码。如果你给我一两个小时,我可以用C做一个工作的例子; 如果你需要,请告诉我,我会。

编辑示例DLL,如果您或其他任何人想要在页面底部进行测试;我不能。我所知道的只是它编译。您只需要下载(或编写!)一个免费的DLL注入程序来测试它;那里有很多。

与此同时,您需要研究的是:

  1. EXE如何执行的基础知识。
  2. DLL注入
  3. API挂钩
  4. Windows套接字API
  5. 1。 EXE如何执行的基础知识:

    我要向你解释的整个过程归结为这个原则。双击可执行文件时,Windows会对其进行解析并将其代码等加载到内存中。这是关键。编译后的代码全部放入RAM中。这意味着什么?好吧,如果应用程序的代码都在RAM中,我们是否可以更改应用程序的代码,只需更改一些内存即可运行?毕竟,它只是一堆指令。

    答案是,它将为我们提供弄乱另一个应用程序的方法 - 在这种情况下,告诉它通过其打开的套接字发送一些数据。

    (这个原则也是你必须小心编写像C这样的低级语言的程序的原因,因为如果你把坏东西放在RAM的坏部分,它可能会崩溃程序或打开你的shell代码漏洞)

    2。 DLL注入:

    问题是,我们如何知道要覆盖哪个内存?我们是否可以访问该程序的内存,尤其是包含我们想要更改的说明的部分?你可以写信给另一个进程'记忆但它更复杂。更改内存的最简单方法(再次,当我说内存时,我们正在谈论正在执行的机器代码指令)是通过在该进程中加载​​并运行DLL。将您的DLL视为.c文件,您可以将其添加到另一个程序并编写自己的代码:您可以访问程序的变量,调用其函数,任何东西;因为它在这个过程中运行。

    DLL注入可以通过多种方法完成。通常是通过调用CreateRemoteThread()API函数。对此进行谷歌搜索。

    3。 API挂钩

    什么是API挂钩?更常见的是,它的功能挂钩",我们碰巧对挂钩API调用感兴趣;在这种情况下,用于套接字(socket(),send()等)。

    让我们举个例子。使用Winsock用C编写的目标应用程序。让我们看看他们在做什么,然后展示一下我们想要做什么的例子:

    他们创建套接字的原始源代码:

    SOCKET ConnectSocket = INVALID_SOCKET;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    

    现在,这是原始程序的源代码。我们的DLL无法访问它,因为它在EXE中加载并编译了EXE(duh!)。因此,让我们说,在编译为机器代码(程序集)后,他们对socket()的调用看起来像这样。我根本不知道汇编 ,但这只是为了说明:

    装配/机器代码:

    PUSH 06             ; IPPROTO_TCP
    PUSH 01             ; SOCK_STREAM
    PUSH 02             ; AF_INET
    CALL WS2_32.socket ; This is one of the parts our DLL will need to intercept ("hook").
    

    为了让我们让程序发送数据(使用我们的DLL),我们需要知道socket的句柄。所以我们需要拦截他们对socket函数的调用。以下是一些注意事项:

    1. 最后一条指令需要更改为:CALL OurOwnDLL.socket。那个CALL指令只是内存中的一个值(还记得吗?)所以我们可以用WriteProcessMemory做到这一点。我们会做到这一点。

    2. 我们希望控制目标程序,不会崩溃或使其行为异常。所以我们的代码需要透明。我们将注入的DLL需要与原始函数具有socket函数相同的,返回相同的值等。唯一的区别是,我们将记录返回值({{ 1}})以便我们以后可以在发送数据时使用它。

    3. 我们还需要知道套接字是否/何时连接,因为我们无法发送数据,除非它是(假设我们像大多数应用程序一样使用TCP)。这意味着我们还需要挂钩Winsock SocketHandle API函数,复制我们的DLL。

    4. 用于注入和监控connectsocket函数的DLL(未经测试):

      这个C DLL将拥有挂钩和取消挂钩功能的所有功能。我现在无法测试它,我甚至不是一个C程序员,所以如果你遇到任何问题,请告诉我。

      使用Unicode将其编译为Windows DLL 而不是并将其注入到您知道使用WS2_32的socket()和connect()函数的进程中,并让我知道它是否有效。对不起,我没办法测试。如果您需要进一步的帮助或修复,请告诉我。

      connect