CreateRemoteThread 然后将用于对Firefox内的 0x0D000000 可执行区域进行挂钩和初始化

时间:2021-11-15 08:13:02

    有没有想过恶意软件如何能够从Web浏览器中获取根据?最风行的要领是Man-in-The-Browser(MITB)打击,是我们熟知的Inline Hooking (有时又称为detours)。Inline hooks出格的通用并且在恶意软件中很常见。使用Inline Hooks,恶意软件可以控制任何进程的流程,它独霸着进程,恶意软件作者可以为所欲为。让我们来看看他们是如何做到这一点。

How do you get your code into the target process?

    Inline Hooks的第一步是让你的代码到方针进程中运行。这个过程被称为注入

    有几种常见的注入要领,例如CreateRemoteThread/RtlCreateUserThread/QueueUserApc/SetWindowsHookEx/SetThreadContext/反射注入/atom注入等等。在我们的例子中,我们使用  VirtualAllocEx 在Firefox中分配一个存储区域  0x0D000000。 CreateRemoteThread 然后将用于对Firefox内的  0x0D000000 可执行区域进行挂钩和初始化事情。(实际注入过程是对本身的一个庞大的话题,不在本文的讨论范畴内。)下面是我们注入的代码块的样子。

    Inline Hooks有四个部分构成:hook,shellcode(这里用的NOP填充),trample和返回。

What is a Windows API?

    这是一组函数和数据的布局,一个Windows措施可以用它来让Windows做一些工作,如打开一个文件,显示动静等。

一个Windows措施几乎所有的操纵都挪用各类AP??I函数。

    总的来说,所有的Windows使可用的API函数被称作“在Windows API”。

The hook

    Hook有时被称为 trampoline,类似于一个交通员将交通转移到另一个位置。在我们的例子中,我们将挂钩WS2_32的 send() 函数。下面是ws2_32!send 最初的几个指令的为了告成挂钩,我们要笼罩调send()函数存在的一些指令。下面绿色方框的指令我们会将它笼罩失

    请注意,五个字节将要被改写。这是需要我们挂钩简直切字节数:一个  jmp 是跳进我们的代码指令  0x0D000000(还有其他的要领来安排钩子好比用  push 地点,  ret 指令组合。)挂钩之后 send() 函数如下图所示:

The malicious code

    此刻,执行流程已经被重定向到我们注入的代码,寄存器必需生存,,以确保我们回到send()函数执行的时候不会crash在32位的过程中,我们可以使用PUSHAD指令将所有的寄存器生存下来当shellcode被执行完毕,在使用  POPAD 指令恢复所有寄存器的值,回到  send() 最初执行的时候。此刻,我们在控制  send() 成果,我们必需想出一些有趣的工作。有一件事我们可以做的是,将一个发送POST请求和发送数据发还到我们,解析看看是否包罗登录根据。

The execution of trampled bytes and the return

    我们已经在shellcode中做了一些有用的对象之后,我们必需确保我们的措施返回到它在hook之前完全不异的状态。首先,我们使用的  popad 指令来恢复所有的寄存器。还记得我们Hook笼罩的五个字节吗?这些指令仍需要运行,因此他们在Hook的时候复制到我们shellcode的结尾,让他们在恢复寄存器后无缝的运行。最后,我们安适的调回到send()+ 0×05(我们的挂钩指令的长度)。

Putting it all together