PP的秘密基地

纸上得来终觉浅,绝知此事要躬行.

0%

deploy流程

一. check

  1. 创建{prefix}/spool/tmp/check-config-XXXXX目录
  2. 将install命令应生成的zeek脚本放入临时目录
  3. 运行check-config脚本,启动所有node(不收包,跑完zeek脚本后正常退出)
  4. 检查node的exitcode是否为0

二. install

  1. 删除以前安装的策略文件以避免混淆
  2. {prefix}/spool/installed-scripts-do-not-touch下创建sizeauto目录,分别存放站点策略和配置信息
  3. 安装本地站点策略(将{prefix}/share/zeek/site/local.zeek拷贝到策略文件目录)
  4. 创建包含集群布局的Zeek脚本cluster-layout.zeek
  5. 创建包含本地网络列表的Zeek脚本local-networks.zeek
  6. 创建包含zeekctl配置的Zeek脚本zeekctl-config.zeek
  7. 将logger节点的工作目录软连接到{prefix}/logs/current
阅读全文 »

Zeek的主循环

IO循环

查阅资料得知,在Zeek 3.1之前,Zeek的主循环使用轮询忙等待来检查是否有Ready的IO源,来处理的数据、事件

在3.1之后,Zeek 转而依赖于操作系统的内置的IO多路复用来fd上的更改,所以引入了 libkqueue

libkqueue是个跨平台的IO多路复用实现。它在 macOS 和 FreeBSD 下使用 kqueue 实现,在 Linux 系统下实际使用 epoll 实现(epoll不可用时使用poll实现)

在创建新的IO源时,会向IO源管理器注册fd。当源有要处理的数据时,此fd用于通知 kqueue,将新数据的处理推入 IO 源。而不是我们问源是否有事情要做

阅读全文 »

libmemif

memif是Mmeory Interface的缩写,memif库实现了进程间高性能数据包传输

为什么高性能?

  • 共享内存实现进程间通信
  • 无锁环形缓冲区 + 批量收发 + 双缓冲实现数据包传输
  • epoll实现事件模式

环形缓冲区也称为循环队列

特点

  • 支持多线程
  • 支持0拷贝
  • 支持epoll外部处理
  • 支持中断(事件)模式或轮询模式
阅读全文 »

前言

之前介绍了很多类型的Hook,但一直都没有写最简单、最常用的Hook,也就是Inline Hook

其实Inline Hook是最容易被检测的Hook,且在没有做特殊处理时也是非线程安全的Hook,有极小概率在Hook时破坏运行栈,从而导致程序崩溃

但Inline Hook依然是最常用的Hook,因为它几乎适用任何需要Hook的场景,不存在VMT、IAT Hook需要特定场景的窘境

这次本文就32位下的Inline Hook和蹦床做简单的原理介绍和实现

阅读全文 »

前言

众所周知,C/C++函数返回值会使用eax寄存器来传递,我们用以下代码验证一下

1
2
3
4
5
6
7
8
uint32_t foo() {
return 1;
}

int main() {
auto n = foo();
return 0;
}
1
2
3
    auto n = foo();
00F22A93 call foo (0F213E8h)
00F22A98 mov dword ptr [n],eax // ebp-4

可以看到,main函数调用完foo后,将eax的值传送到n中。证明了eax确实用于返回值传递

但eax本身只有4字节,那么当返回值大于4字节时是如何传递的呢?

阅读全文 »

前言

在上两个Hook文章中,我实现了虚函数表钩子(VMT Hook)导入地址表(IAT)Hook

VMT Hook和IAT Hook的本质上都修改了内存(重定向了函数指针),所以也比较容易被检测

今天介绍一个不需要修改内存且几乎不会被检测的Hook,也就是向量化异常处理(VEH) Hook

什么是VEH?

在Windows上有着许多的异常处理方法,帮进程在遇到异常时免于崩溃。比如C++原生异常、结构化异常处理SEH(__try__finally__except就是VC++对SEH的封装)以及本文中要使用的向量化异常处理(VEH)

阅读全文 »

前言

在上一个Hook文章中,我利用C++虚函数的特性,实现了虚函数表钩子(VMT Hook)

VMT Hook实现起来简单,但使用范围有限。只能用来挂钩有虚函数的对象。

今天介绍一个适用范围相对更广一些的Hook技术,也就是导入地址表(IAT)Hook。

什么是IAT?

如果你熟悉程序编译的过程,你会知道链接分为两种: - 静态链接:代码从其所在的静态链接库中拷贝到最终的可执行程序中,在程序被执行时,这些代码会被装入到该进程的虚拟地址空间 - 动态链接:代码被放到动态链接库中,在程序执行时,动态链接库的全部内容会被映射到运行时相应进行的虚拟地址的空间

而IAT(导入地址表)就是动态链接的实现方法。

阅读全文 »