|
楼主 |
发表于 2013-6-9 17:19:20
|
显示全部楼层
- PVOID RetrieveFuncAddrInSSDT(IN CHAR FuncName[])
- {
- PVOID FuncAddr=NULL;
- ULONG ServiceID=0;
- PSYSTEM_SERVICE_TABLE pTable = NULL;
- #if defined(_WIN64)
- pTable = (PSYSTEM_SERVICE_TABLE)GetKeServiceDescriptorTable64();
- #else
- pTable = &KeServiceDescriptorTable;
- #endif
- if(FuncName==NULL)
- {
- return NULL;
- }
- if(FindFuncInfoInNtdll(FuncName,&ServiceID)!=NULL)
- {
- FuncAddr=*(PULONG*)((PUCHAR)pTable->ServiceTableBase+4*ServiceID);
- }
- return FuncAddr;
- }
- PVOID FindFuncInfoInNtdll(IN CHAR FuncName[],IN PULONG ServiceID)
- {
- NTSTATUS Status = STATUS_SUCCESS;
- ULONG ulModuleNum,ulLen,ulRetLen;
- PSYSTEM_MODULE_INFORMATION SystemModuleInfo = NULL;
- PVOID Buffer=0;
- ULONG ulIndex=0;
- PVOID FuncAddr=NULL;
- if (FuncName==NULL || ServiceID==NULL)
- {
- return NULL;
- }
- *ServiceID=0;
- ZwQuerySystemInformation(SystemModuleInformation,NULL,0,&ulLen);
- Buffer=ExAllocatePoolWithTag(NonPagedPool,ulLen,'_Hi_');
- if (Buffer==NULL)
- {
- return NULL;
- }
- Status=ZwQuerySystemInformation(SystemModuleInformation,Buffer,ulLen,&ulRetLen);
- if (!NT_SUCCESS(Status))
- {
- return NULL;
- }
- SystemModuleInfo=(PSYSTEM_MODULE_INFORMATION)((PULONG)Buffer+1);
- ulModuleNum=*(PULONG)Buffer;
- for (ulIndex=0;ulIndex<ulModuleNum;ulIndex++)
- {
- PCHAR CurModuleName=CurModuleName=SystemModuleInfo->ImageName + SystemModuleInfo->ModuleNameOffset;
- if(_stricmp(CurModuleName,"ntdll.dll")==0)
- {
- PVOID ModuleAddr=SystemModuleInfo->Base;
- ulIndex=ulModuleNum;
- {
- PIMAGE_DOS_HEADER ImgDosHdr=NULL;
- PIMAGE_NT_HEADERS ImgNtHdrs=NULL;
- PIMAGE_EXPORT_DIRECTORY ImgExpDir=NULL;
- ImgDosHdr=(PIMAGE_DOS_HEADER)ModuleAddr;
- ImgNtHdrs=(PIMAGE_NT_HEADERS)(ImgDosHdr->e_lfanew+(PUCHAR)ModuleAddr);
- ImgExpDir=(PIMAGE_EXPORT_DIRECTORY)((PUCHAR)ModuleAddr+ImgNtHdrs->OptionalHeader.DataDirectory[0].VirtualAddress);
- {
- ULONG ulIndex;
- ULONG *ulFuncNameRVA=(ULONG *)((PUCHAR)ModuleAddr+ImgExpDir->AddressOfNames);
- ULONG *ulFuncAddrRVA=(ULONG *)((PUCHAR)ModuleAddr+ImgExpDir->AddressOfFunctions);
- USHORT *usFuncOrdiRVA=(USHORT *)((PUCHAR)ModuleAddr+ImgExpDir->AddressOfNameOrdinals);
- UCHAR *ExpFuncNmae=NULL;
- for (ulIndex=0;ulIndex<ImgExpDir->NumberOfNames ;ulIndex++)
- {
- ExpFuncNmae=(PUCHAR)ModuleAddr+ulFuncNameRVA[ulIndex];
- if(_stricmp(ExpFuncNmae,FuncName)==0)
- {
- FuncAddr=(PVOID)((PUCHAR)ModuleAddr+ulFuncAddrRVA[usFuncOrdiRVA[ulIndex]]);
- *ServiceID=*(PULONG)((PUCHAR)FuncAddr+1);
- ulIndex=ImgExpDir->NumberOfNames;
- }
- }
- }
- }
- }
- else
- {
- SystemModuleInfo++;
- }
- }
- ExFreePoolWithTag(Buffer,'_Hi_');
- return FuncAddr;
- }
- VOID DenyLoadDll(PVOID pParam)
- {
- PDenyLoadDllParam pContext = NULL;
- UCHAR fuck64[]="\xB8\x00\x00\x00\x00\xC3";
- UCHAR fuck32[]="\xB8\x00\x00\x00\x00\xC2\x08\x00";
- PEPROCESS pEprocess = NULL;
- KAPC_STATE ks = {0};
- SIZE_T RegionSize;
- PIMAGE_DOS_HEADER dos = NULL;
- PIMAGE_NT_HEADERS nth = NULL;
- PIMAGE_OPTIONAL_HEADER poh = NULL;
- PVOID pOEP = NULL;
- PVOID pImageBase = NULL;
- NTSTATUS status;
- PVOID BaseAddress = NULL;
- ULONG OldProtect;
- do
- {
- if( !pParam )
- {
- break;
- }
- pContext = (PDenyLoadDllParam)pParam;
- if( pContext->hProcessId == NULL || !pContext->pImageInfo )
- {
- break;
- }
- if( !NT_SUCCESS(PsLookupProcessByProcessId( pContext->hProcessId, &pEprocess )) )
- {
- break;
- }
- if( !NtProtectVirtualMemory )
- {
- NtProtectVirtualMemory = (NtProtectVirtualMemory_)RetrieveFuncAddrInSSDT("NtProtectVirtualMemory");
- }
- if( !NtProtectVirtualMemory )
- {
- break;
- }
- //attach the process
- KeStackAttachProcess(pEprocess, &ks);
- pImageBase = pContext->pImageInfo->ImageBase;
- dos = (PIMAGE_DOS_HEADER) pImageBase;
- nth = (PIMAGE_NT_HEADERS) (dos->e_lfanew + (char *)pImageBase);
- poh = (PIMAGE_OPTIONAL_HEADER) &nth->OptionalHeader;
- // "MZ" "PE\0\0"
- if( (dos->e_magic != 0x5a4d) || (nth->Signature != 0x4550) )
- {
- break;
- }
- pOEP = (PVOID)( poh->AddressOfEntryPoint + (char *)pImageBase );
- BaseAddress = pOEP;
- if((ULONG64)pOEP<(ULONG64)0x7FFFFFFF)
- {
- RegionSize=sizeof(fuck32);
- }
- else
- {
- RegionSize=sizeof(fuck64);
- }
- status = NtProtectVirtualMemory((HANDLE)-1,&BaseAddress,&RegionSize,PAGE_EXECUTE_READWRITE,&OldProtect);
- if(NT_SUCCESS(status))
- {
- __try
- {
- if((ULONG64)pOEP<(ULONG64)0x7FFFFFFF)
- {
- RtlCopyMemory(pOEP,fuck32,sizeof(fuck32));
- //SafeMemCopy(pOEP,fuck32,sizeof(fuck32));
- }
- else
- {
- RtlCopyMemory(pOEP,fuck64,sizeof(fuck64));
- //SafeMemCopy(pOEP,fuck64,sizeof(fuck64));
- }
- }
- __except(1)
- {
- ;
- }
- }
- ObDereferenceObject(pEprocess);
- KeUnstackDetachProcess(&ks);
-
- } while (FALSE);
- PsTerminateSystemThread(STATUS_SUCCESS);
- }
复制代码 我修改了一下你的代码,在执行到 NtProtectVirtualMemory 的时候卡住了,求教。 |
|