能力值:
( LV2,RANK:10 )
|
-
-
2 楼
可以直接调用吧
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
没有导出,不好调用!!!真想调用,可以分析NTDLL的ZwReadVirtualMemory,获取序号,再通过KeServiceDescriptorTable计算得ZwReadVirtualMemory地址,调用即可。
在内核,也可以直接通过KeStackAttachProcess(KeAttachProcess)和KeUnstackDetachProcess(KeDetachProcess)来附加到对方进程,直接读写对方进程内存.
|
能力值:
( 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]);
}
|
能力值:
( LV12,RANK:600 )
|
-
-
5 楼
可以根据名字在NTDLL里面找出 服务索引号。 用得到的号索引 系统服务表 或者Nt 的函数。调用的时候需要选择一下俩中种之一的办法
1 设置调用线程的 MODE
2 或者 ATTACH到一个用户进程空间,然后 参数用ZwAllocatexxx 来分配,再调用Ntxxx
|
能力值:
( LV12,RANK:600 )
|
-
-
6 楼
另外自己INT 2E也可以
|