Golang实现MS-RPC/DCERPC IDL解析与代码生成工具 - go-msrpc

Golang实现MS-RPC/DCERPC IDL解析与代码生成工具 - go-msrpc 用于C706的Microsoft扩展(类似Impacket或Samba RPC客户端)的IDL解析器和存根代码生成器。

MS-RPC允许执行各种管理任务,例如配置/查看MS DNS/DHCP服务器、WMI查询、事件日志转储、加入AD域,或通过Netlogon安全通道执行NTLM验证。

Git: GitHub - oiweiwei/go-msrpc: The DCE/RPC / MS-RPC Client for Go

Go pkg: go-msrpc module - github.com/oiweiwei/go-msrpc - Go Packages

欢迎合作!


更多关于Golang实现MS-RPC/DCERPC IDL解析与代码生成工具 - go-msrpc的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

手册:dcerpc 包 - github.com/oiweiwei/go-msrpc/dcerpc - Go Packages

示例(在远程机器上通过 WMI 执行 calc.exe、Windows 注册表转储、DNS 区域下载、端点映射器 (EPM)、通过外部身份验证获取 NTLM 会话密钥、事件日志下载):go-msrpc/examples at main · oiweiwei/go-msrpc · GitHub

更多关于Golang实现MS-RPC/DCERPC IDL解析与代码生成工具 - go-msrpc的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个非常专业的MS-RPC/DCERPC实现项目。从项目描述看,go-msrpc 实现了完整的IDL解析器和存根代码生成器,这对于构建基于MS-RPC协议的客户端工具至关重要。

核心功能分析

1. IDL解析器

项目实现了Microsoft IDL(接口定义语言)解析器,能够解析类似Samba使用的IDL文件格式:

// 示例:解析IDL文件
parser := msrpc.NewIDLParser()
idl, err := parser.ParseFile("dnsserver.idl")
if err != nil {
    log.Fatal(err)
}

// 获取接口定义
for _, iface := range idl.Interfaces {
    fmt.Printf("Interface: %s\n", iface.Name)
    for _, op := range iface.Operations {
        fmt.Printf("  Operation: %s (opnum: %d)\n", op.Name, op.OpNum)
    }
}

2. 存根代码生成

自动生成客户端存根代码,简化RPC调用:

// 生成的存根代码使用示例
client, err := dnsserver.NewClient(conn)
if err != nil {
    log.Fatal(err)
}

// 调用RPC方法
resp, err := client.EnumZones(context.Background(), &dnsserver.EnumZonesRequest{
    ServerName: "dc01.example.com",
})
if err != nil {
    log.Fatal(err)
}

for _, zone := range resp.Zones {
    fmt.Printf("Zone: %s\n", zone.Name)
}

3. 协议支持

支持关键的MS-RPC协议特性:

// NTLM认证示例
auth := msrpc.NewNTLMAuthenticator("DOMAIN", "user", "password")
conn, err := msrpc.Dial("dc01.example.com:135", auth)
if err != nil {
    log.Fatal(err)
}

// 绑定到接口
binding := msrpc.NewBinding(conn, &msrpc.UUID{
    TimeLow: 0x12345678,
    TimeMid: 0x1234,
    TimeHiAndVersion: 0x1234,
    ClockSeqHiAndReserved: 0x12,
    ClockSeqLow: 0x34,
    Node: [6]byte{0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc},
}, 1, 0)

实际应用场景

1. AD域管理

// 加入AD域示例
netlogon, err := netlogon.NewClient(conn)
if err != nil {
    log.Fatal(err)
}

resp, err := netlogon.NetrJoinDomain2(context.Background(), &netlogon.NetrJoinDomain2Request{
    ServerName: "\\\\dc01",
    DomainName: "EXAMPLE.COM",
    AccountName: "COMPUTER$",
    Options: netlogon.NETSETUP_JOIN_DOMAIN,
})

2. WMI查询

// 通过MS-RPC执行WMI查询
iwbem, err := wmi.NewClient(conn)
if err != nil {
    log.Fatal(err)
}

resp, err := iwbem.ExecQuery(context.Background(), &wmi.ExecQueryRequest{
    QueryLanguage: "WQL",
    Query: "SELECT * FROM Win32_Process",
})

3. 事件日志处理

// 读取Windows事件日志
eventlog, err := eventlog.NewClient(conn)
if err != nil {
    log.Fatal(err)
}

resp, err := eventlog.ReadEventLog(context.Background(), &eventlog.ReadEventLogRequest{
    LogName: "Security",
    Flags: eventlog.EVENTLOG_SEQUENTIAL_READ | eventlog.EVENTLOG_FORWARDS_READ,
})

协议细节实现

项目需要处理MS-RPC的复杂特性:

// PDU(协议数据单元)处理
type PDUHeader struct {
    Version      uint8
    PacketType   uint8
    PacketFlags  uint8
    DataRepresentation [4]byte
    FragLength   uint16
    AuthLength   uint16
    CallID       uint32
}

// 数据表示格式(NDR)
type NDRDataRepresentation struct {
    IntegerRepresentation uint8
    CharacterRepresentation uint8
    FloatingPointRepresentation uint8
}

// 处理碎片化传输
func handleFragmentedPDU(conn net.Conn) {
    var fullData []byte
    for {
        pdu, err := readPDU(conn)
        if err != nil {
            break
        }
        
        fullData = append(fullData, pdu.Data...)
        
        if pdu.PacketFlags&LastFrag == 0 {
            break
        }
    }
}

安全特性

// 安全上下文和多态句柄
type SecurityContext struct {
    ContextID uint32
    AuthType  uint32
    AuthLevel uint32
    SessionKey []byte
}

// 签名和加密处理
func signAndSealPDU(pdu *PDU, ctx *SecurityContext) {
    if ctx.AuthLevel >= RPC_C_AUTHN_LEVEL_PKT_INTEGRITY {
        pdu.Signature = calculateSignature(pdu, ctx.SessionKey)
    }
    
    if ctx.AuthLevel >= RPC_C_AUTHN_LEVEL_PKT_PRIVACY {
        encryptPDU(pdu, ctx.SessionKey)
    }
}

这个项目的实现复杂度很高,需要深入理解MS-RPC协议规范、NDR编码、安全上下文协商等底层细节。对于需要与Windows系统进行RPC交互的Go应用来说,go-msrpc 提供了完整的解决方案。

回到顶部