Re[2]: BSOD при перезаписи MDL
От: A.Pastukhov  
Дата: 09.11.09 09:39
Оценка:
Речь идет о перехвате TDI_SEND и подмене Irp->MdlAddress (в продолжении *моего* предыдущего поста о проблемах редиректа в TDI_CONNECT, там сошлись на странностях поведения некоторых web-серверов и необходимости подмены "на лету" данных в TDI_SEND, в частности поля "Host"). Собственно это я хочу реализовать. Шеф поставил такую задачу — при посещении развлекательных сайтов организовать скрытый редирект на какой-нибудь нейтральный сайт.

static const char Data[] = "GET / HTTP/1.1\r\n"
               "Host: www.rambler.ru\r\n"
                   "Connection: close\r\n"
               "\r\n";

NTSTATUS TdiSend(IN PDEVICE_EXTENSION pde, IN PIRP pIrp, IN PIO_STACK_LOCATION stack)
{
    NTSTATUS status;
    void* p;
    PUCHAR pAddress, pDstDddress;
    ULONG r;
    PMDL pDstMdl, pSrcMdl;

    MappedAddress = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
    p = strstr((PCCHAR)MappedAddress, "Host: www.sex.com");
    if(p != NULL & glRedirectFlag == TRUE)
    {
        pSrcMdl = IoAllocateMdl((PVOID)&Data, 2048, FALSE, FALSE, NULL);
        if(pSrcMdl)
        {
            MmBuildMdlForNonPagedPool(pSrcMdl);
            pAddress = MmGetSystemAddressForMdlSafe(pSrcMdl, NormalPagePriority);
            __try
            {
                            pDstDddress = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
                if (pDstDddress)
                            {
                                memset(pDstDddress, 0, 2048);
                                for (r = 0; r < 2048; r++)
                                {
                                     if (MmIsAddressValid(pAddress)) 
                           *pDstDddress = *pAddress;
                                     pAddress++;
                                     pDstDddress++;
                                }
                         }
                     
             }
        __except(EXCEPTION_EXECUTE_HANDLER){}
               IoFreeMdl(pSrcMdl);
           }
    }
    try
    {
                IoCopyCurrentIrpStackLocationToNext(pIrp);
        IoSetCompletionRoutine(pIrp, DefaultCompletionRoutine, pde, TRUE, TRUE, TRUE);
        status = IoCallDriver(pde->LowerDeviceObject, pIrp);
    }
    finally{}
    return status;
}

C "r = 1" ступил, каюсь. Переменная glRedirectFlag устанавливается в TRUE при отлове "плохих" IP-адресов в обработчике TDI_CONNECT.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.