内核中获取远程名称管道IP

最近需要在内核中获取远程名称管道的源地址

所以首先逆向了r3的GetNamedPipeClientComputerNameW,该函数在kernelbase.dll中实现,为了更好的分析函数需要下载符号,使用下面的命令

symchk /r D:\rpc\kernelbasex32 /s SRV*D:\rpc\kernelbasex32\*http://msdl.microsoft.com/download/symbols

有了符号分析起来的简单了,最后将该函数所做的事情写成c代码如下:

ULONG AltGetNamedPipeClientComputerName(HANDLE Pipe, PWSTR ClientComputerName, ULONG ClientComputerNameLength)
{
    static const char AttributeName[] = "ClientComputerName";

    if (HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL))
    {
        IO_STATUS_BLOCK iosb = {0};

        NTSTATUS status = NtFsControlFile(Pipe,
            NULL,
            NULL,
            NULL,
            &iosb,
            FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE,
            (void*)AttributeName,
            strlen(AttributeName)+1,
            ClientComputerName,
            ClientComputerNameLength*sizeof(WCHAR));

        if (NT_SUCCESS(status ))
        {
            //xxx
        }
    }
}

这里有三个传入参数,第一个是名称管道的句柄,第二个是传出的参数,第三个是大小,第一个比较好找,那么第二个和第三个怎么确定?由于通常名称管道是在rpc中使用所以在rpcrt4.dll中找到NMP_ConnectionQueryClientAddress分析以下可知大小取的就是MAX_PATH

最后就是在内核中使用NtFsControlFile发送IOCTL就能获取到IP。

但是如果使用NtFsControlFile返回的错误码是0xc0000005,之后查了一下msdn发现NtFsControlFile说的是在用户层需要使用Nt的,在内核中使用ZW的https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntfscontrolfile

最后修改代码为ZwFsControlFile成功获取到源地址IP

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值