首页
社区
课程
招聘
[旧帖] 修改NtDeviceIoControlFile recv的问题 0.00雪花
发表于: 2014-8-8 13:16 5199

[旧帖] 修改NtDeviceIoControlFile recv的问题 0.00雪花

2014-8-8 13:16
5199
#define IO_CONTROL_AFD_SEND_DATAGRAM        0x12023 //UDP
#define IO_CONTROL_AFD_SEND                 0x1201f //TCP
#define IO_CONTROL_AFD_RECV_DATAGRAM        0x1201b //UDP
#define IO_CONTROL_AFD_RECV                 0x12017 //TCP
typedef LONG NTSTATUS;
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define STATUS_SUCCESS        ((NTSTATUS)0x00000000L) //成功
#define STATUS_UNSUCCESSFUL   ((NTSTATUS)0xC0000001L) //失败
#define STATUS_NOT_IMPLEMENTED           ((NTSTATUS)0xC0000002L) //函数未实现
#define STATUS_INVALID_INFO_CLASS        ((NTSTATUS)0xC0000003L) //参数错误
//IO_CONTROL_AFD_SEND
//IO_CONTROL_AFD_RECV对应的数据接收结构
typedef struct AFD_WSABUF
{
        UINT  len;
        PCHAR  buf;
}AFD_WSABUF , *PAFD_WSABUF;
typedef struct AFD_INFO
{
        PAFD_WSABUF  BufferArray;
        ULONG  BufferCount;
        ULONG  AfdFlags;
        ULONG  TdiFlags;
} AFD_INFO,  *PAFD_INFO;

NTSTATUS __stdcall NewNtDeviceIoControlFile(HANDLE FileHandle,HANDLE Event OPTIONAL,
PVOID ApcRoutine OPTIONAL,PVOID ApcContext OPTIONAL, PVOID IoStatusBlock,ULONG IoControlCode,
PVOID InputBuffer OPTIONAL,ULONG InputBufferLength, PVOID OutputBuffer OPTIONAL,ULONG OutputBufferLength)
{
        LONG stat;
//#define STATUS_SUCCESS        ((NTSTATUS)0x00000000L) //成功
//#define STATUS_UNSUCCESSFUL   ((NTSTATUS)0xC0000001L) //失败

        if (IoControlCode != IO_CONTROL_AFD_SEND)
        {
        __asm
                {
                        push  OutputBufferLength
                        push  OutputBuffer
                        push  InputBufferLength
                        push  InputBuffer
                        push  IoControlCode
                        push  IoStatusBlock
                        push  ApcContext
                        push  ApcRoutine
                        push  Event
                        push  FileHandle
                        call  pNtDeviceIoControl//原函数地址
                        mov    stat ,eax
                }
                if (!NT_SUCCESS(stat))
                        return stat ;
        }
       

        printf("控制码: %X\n", IoControlCode);
        if(IoControlCode != IO_CONTROL_AFD_SEND && IoControlCode != IO_CONTROL_AFD_RECV)
        {
                //printf("%x\n", IoControlCode);
                return stat;
        }
       
        __try
        {
                PAFD_INFO AfdInfo = (PAFD_INFO)InputBuffer ;
                PVOID Buffer = AfdInfo->BufferArray->buf;
                ULONG Len = AfdInfo->BufferArray->len;
               
                //TCP 发送数据
                if (IoControlCode == IO_CONTROL_AFD_SEND)
                {
                        //这里修改发送的数据包

                                /*        text = (char*)Buffer;               
                                text = "已经修改!!";
                                AfdInfo->BufferArray->len = text.size();
                                AfdInfo->BufferArray->buf = (PCHAR)text.c_str();*/
                                        __asm
                                        {
                                                        push  OutputBufferLength
                                                        push  OutputBuffer
                                                        push  InputBufferLength
                                                        push  InputBuffer
                                                        push  IoControlCode
                                                        push  IoStatusBlock
                                                        push  ApcContext
                                                        push  ApcRoutine
                                                        push  Event
                                                        push  FileHandle
                                                        call  pNtDeviceIoControl//调用原始函数,让驱动去发包
                                                        mov    stat ,eax
                                        }
                                if (!NT_SUCCESS(stat))
                                return stat ;
                                printf("dll_send\n");
                }
                else
                {
                        printf("dll_recv: %s\n", AfdInfo->BufferArray->buf);
                        //MessageBox(0,AfdInfo->BufferArray->buf,0,0);
                       
                        if (strlen(AfdInfo->BufferArray->buf)>0)
                        {
                                st = "HTTP/1.1 301 Moved Permanently";//修改成
                                memcpy(AfdInfo->BufferArray->buf, st.c_str(), st.size());
                                AfdInfo->BufferArray->len = st.size();
                                printf("dll_recv: %s\n", "接收内存以改");
                        }
                        else
                        {
                               
                                /*hook发送包和接收包 更改buf都是ok的,已经实现,但是有种情况下问题,
                        以下是我要陈述的讨论问题
                                A: 表示客户端   B表示服务端
                                B先调用recv, 进入NewNtDeviceIoControlFile函数,执行完毕返回,
                                然后A调用send B ,就不进入NewNtDeviceIoControlFile函数了
                                不知道这种情况下 怎么修改A recv的buf


                                如果在这里*/
                                st = "HTTP/1.1 301 Moved Permanently";
                                memcpy(AfdInfo->BufferArray->buf, st.c_str(), st.size());
                                AfdInfo->BufferArray->len = st.size();
                                /*这样修改了,buf的数据是"123P/1.1 301 Moved Permanently"
                                        但是 然后A调用send(""123",..."),
                                        然后buf的数据是"123P/1.1 301 Moved Permanently"*/

                        }
                }
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
                return stat ;
        }

        return stat;
}

先recv  NtDeviceIoControlFile调用结束后 ,然后 send, 这种情况 怎么修改 recv 的buf?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
- -!做啥费这大劲,直接Ring3读>2G的内存不就完事了。
2014-8-11 21:55
0
雪    币: 608
活跃值: (643)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
膜拜一下可以在Ring3读0x80000000以上地址的大神
2014-8-11 22:04
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
刚想了一下,你这个结构不对,接收时,是一个环型地,你粗暴地,接收一个缓冲区,而不提升IRQL肯定不行,全跑过去了
2014-8-11 22:05
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我是一个水货。
2014-8-11 22:06
0
游客
登录 | 注册 方可回帖
返回
//