首页
社区
课程
招聘
[求助]驱动下怎么调用ZwReadVirtualMemory函数?
发表于: 2010-12-26 18:29 10101

[求助]驱动下怎么调用ZwReadVirtualMemory函数?

2010-12-26 18:29
10101
请教各位驱动前辈:驱动下怎么调用ZwReadVirtualMemory函数?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可以直接调用吧
2010-12-26 18:54
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没有导出,不好调用!!!真想调用,可以分析NTDLL的ZwReadVirtualMemory,获取序号,再通过KeServiceDescriptorTable计算得ZwReadVirtualMemory地址,调用即可。
在内核,也可以直接通过KeStackAttachProcess(KeAttachProcess)和KeUnstackDetachProcess(KeDetachProcess)来附加到对方进程,直接读写对方进程内存.
2010-12-26 20:49
0
雪    币: 233
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
/************************************************************************
获取DLL中的函数地址
lpFunctionName        函数名称
pDllName                DLL文件名称
************************************************************************/
/***************************************************************************************
*
*        原理:  R0下没有LoadLibrary函数
*                        利用ZwCreateFile打开文件
*                        利用ZwCreateSection创建区段
*                        利用ZwMapViewOfSection映射区段到当前进程的虚拟内存
*                        定位PE Header地址
*                        定位第一个数据目录
*                        到EAT导出表
*                        搜索函数名,定位函数地址
****************************************************************************************/
DWORD GetDllFunctionId(char* lpFunctionName, PUNICODE_STRING pDllName)
{
        HANDLE  hSection, hFile, hMod;
        //        SECTION_IMAGE_INFORMATION sii;
        IMAGE_DOS_HEADER* dosheader;
        IMAGE_OPTIONAL_HEADER* opthdr;
        IMAGE_EXPORT_DIRECTORY* pExportTable;
        DWORD* arrayOfFunctionAddresses;
        DWORD* arrayOfFunctionNames;
        WORD* arrayOfFunctionOrdinals;
        DWORD functionOrdinal;
        DWORD Base, x, functionAddress;
        char* functionName;
        STRING  ntFunctionName, ntFunctionNameSearch;
        PVOID BaseAddress = NULL;
        SIZE_T size=0;
       
        OBJECT_ATTRIBUTES oa = {sizeof oa, 0, pDllName, OBJ_CASE_INSENSITIVE};
        IO_STATUS_BLOCK iosb;
        NTSTATUS status = STATUS_UNSUCCESSFUL;
       
        ZwOpenFile(&hFile, FILE_EXECUTE | SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);
       
        oa.ObjectName = 0;
        //小红伞杀ZwCreateSection +ZwMapViewOfSection
        ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0,PAGE_EXECUTE, SEC_IMAGE, hFile);
       
        ZwMapViewOfSection(hSection, NtCurrentProcess(), &BaseAddress, 0, 1000, 0, &size, (SECTION_INHERIT)1,
                                                         MEM_TOP_DOWN, PAGE_READWRITE);
        ZwClose(hFile);
       
        hMod = BaseAddress;
                               
        dosheader = (IMAGE_DOS_HEADER *)hMod;
                               
        opthdr =(IMAGE_OPTIONAL_HEADER *) ((BYTE*)hMod+dosheader->e_lfanew+24);
                               
        pExportTable =(IMAGE_EXPORT_DIRECTORY*)((BYTE*) hMod + opthdr->DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT].
               
                VirtualAddress);
                               
        arrayOfFunctionAddresses = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfFunctions);
                               
        arrayOfFunctionNames = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfNames);
                               
        arrayOfFunctionOrdinals = (WORD*)( (BYTE*)hMod + pExportTable->AddressOfNameOrdinals);
                               
        Base = pExportTable->Base;
                               
        RtlInitString(&ntFunctionNameSearch, lpFunctionName);
                               
        for(x = 0; x < pExportTable->NumberOfFunctions; x++)
                                {
                functionName = (char*)( (BYTE*)hMod + arrayOfFunctionNames[x]);
               
                RtlInitString(&ntFunctionName, functionName);
               
                functionOrdinal = arrayOfFunctionOrdinals[x] + Base - 1;
                functionAddress = (DWORD)( (BYTE*)hMod + arrayOfFunctionAddresses[functionOrdinal]);
                if (RtlCompareString(&ntFunctionName, &ntFunctionNameSearch, TRUE) == 0)
                {
                        ZwClose(hSection);
                        return functionAddress;
                }
        }
                               
        ZwClose(hSection);
        return 0;
}

/************************************************************************
根据DLL中函数的地址 找到在SSDT中索引号
lpFunctionName        函数名称
************************************************************************/
PVOID*  GetSSDTFunctionAddress(char* lpFunctionName){
        DWORD FunctionId = 0;
        ULONG Pread = 0;
        UNICODE_STRING DllName;
        RtlInitUnicodeString(&DllName,L"\\Device\\HarddiskVolume1\\Windows\\System32\\ntdll.dll");
        FunctionId=GetDllFunctionId(lpFunctionName,&DllName);
        Pread=*((WORD *)(FunctionId+1));
       
        return (KeServiceDescriptorTable->ServiceTable[Pread]);
}
2010-12-30 15:18
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
5
可以根据名字在NTDLL里面找出 服务索引号。 用得到的号索引 系统服务表 或者Nt 的函数。调用的时候需要选择一下俩中种之一的办法
1 设置调用线程的 MODE
2 或者 ATTACH到一个用户进程空间,然后 参数用ZwAllocatexxx 来分配,再调用Ntxxx
2010-12-30 21:42
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
6
另外自己INT 2E也可以
2010-12-30 21:45
0
游客
登录 | 注册 方可回帖
返回
//