IoM Go SDK 使用指南¶
IoM Go SDK 是 Malice Network 的官方 Golang SDK,提供完整的 gRPC 客户端功能。
完整文档和示例请参考:Go SDK
快速开始¶
安装¶
go get github.com/chainreactors/IoM-go
最小示例¶
package main
import (
"context"
"fmt"
"github.com/chainreactors/IoM-go/client"
"github.com/chainreactors/IoM-go/mtls"
"github.com/chainreactors/IoM-go/proto/client/clientpb"
)
func main() {
// 加载配置并连接
config, _ := mtls.ReadConfig("config.yaml")
conn, _ := mtls.Connect(config)
defer conn.Close()
// 初始化服务器状态
server, _ := client.NewServerStatus(conn, config)
// 获取活动会话
sessions := server.AlivedSessions()
session := server.AddSession(sessions[0])
// 获取任务
tasks, _ := server.Rpc.GetTasks(context.Background(), &clientpb.TaskRequest{
SessionId: session.SessionId,
})
for _, task := range tasks.Tasks {
fmt.Printf("任务 %d: %s\n", task.TaskId, task.Type)
}
}
核心概念¶
SDK 的设计完全对应 IoM 的架构概念,详细架构说明请参考 IoM 核心概念。
ServerStatus - 服务器状态¶
对应 Client 概念,通过 ServerStatus 管理与 Server 的 gRPC 连接。
初始化方式:
// 从配置文件加载(推荐)
config, _ := mtls.ReadConfig("config.yaml")
conn, _ := mtls.Connect(config)
server, _ := client.NewServerStatus(conn, config)
// 手动配置
config := &mtls.ClientConfig{
Host: "127.0.0.1",
Port: 5004,
Operator: "admin",
CACert: "...",
Cert: "...",
Key: "...",
}
Session - 会话¶
对应 Session 概念,代表一个已连接的 Implant。
// 获取所有活动会话
sessions := server.AlivedSessions()
// 添加会话以便使用
session := server.AddSession(sessions[0])
// 获取特定会话
session, _ := server.GetOrUpdateSession(sessionId)
Task - 任务¶
对应 Task 概念,IoM 使用基于任务的异步执行模型。
// 获取任务列表
tasks, _ := server.Rpc.GetTasks(context.Background(), &clientpb.TaskRequest{
SessionId: session.SessionId,
})
// 注册任务完成回调
server.DoneCallbacks.Store(
fmt.Sprintf("%s-%d", task.SessionId, task.TaskId),
func(resp *clientpb.TaskContext) {
fmt.Printf("任务完成: %s\n", string(resp.Spite.Body))
},
)
Context - 会话上下文¶
SDK 提供会话上下文管理,可添加自定义元数据。
// 获取会话上下文
ctx := session.Context()
// 添加自定义值
sessionWithValue, _ := session.WithValue("key1", "value1")
// 克隆会话
sdkSession := session.Clone(consts.CalleeSDK)
常用操作¶
会话管理¶
// 更新所有会话(包括已断开的)
server.UpdateSessions(true)
// 检查会话能力
if session.HasDepend("execute") {
// 会话具有 execute 模块
}
// 设置活动会话
server.ActiveTarget.Set(session)
监听器管理¶
// 获取监听器
listeners, _ := server.Rpc.GetListeners(context.Background(), &clientpb.Empty{})
// 列出管道
pipelines, _ := server.Rpc.ListPipelines(context.Background(), &clientpb.Listener{})
事件处理¶
import "github.com/chainreactors/IoM-go/consts"
// 注册事件钩子
server.On(client.EventCondition{
Type: consts.EventSession,
Op: consts.CtrlSessionRegister,
}, func(event *clientpb.Event) (bool, error) {
fmt.Printf("新会话: %s\n", event.Session.SessionId)
return true, nil
})
// 启动事件流
eventStream, _ := server.Rpc.Events(context.Background(), &clientpb.Empty{})
go func() {
for {
event, _ := eventStream.Recv()
server.HandlerEvent(event)
}
}()
高级功能¶
观察者模式¶
监控多个会话:
// 添加观察者
observerId := server.AddObserver(session)
// 获取观察者日志
log := server.ObserverLog(session.SessionId)
// 完成后移除观察者
defer server.RemoveObserver(observerId)
活动目标管理¶
// 设置活动会话
server.ActiveTarget.Set(session)
// 获取活动会话
activeSession := server.ActiveTarget.Get()
// 将会话置于后台
server.ActiveTarget.Background()
错误处理¶
import "log"
conn, err := mtls.Connect(config)
if err != nil {
log.Fatalf("连接失败: %v", err)
}
defer conn.Close()
session, err := server.GetOrUpdateSession(sessionId)
if err != nil {
log.Printf("获取会话失败: %v", err)
}
最佳实践¶
-
正确关闭连接 - 使用 defer 确保连接关闭
conn, _ := mtls.Connect(config) defer conn.Close() -
复用 ServerStatus 实例 - 避免频繁创建连接
server, _ := client.NewServerStatus(conn, config) // 复用 server 进行多次操作 -
使用事件流 - 实时监听服务器事件
eventStream, _ := server.Rpc.Events(context.Background(), &clientpb.Empty{}) go server.HandlerEvent(event) -
检查会话能力 - 执行前确认模块可用
if session.HasDepend("execute") { // 执行操作 }