首页
社区
课程
招聘
未解决 [求助]关于驱动获取模块加载地址(DllBase)
发表于: 2020-2-17 10:09 3359

未解决 [求助]关于驱动获取模块加载地址(DllBase)

2020-2-17 10:09
3359
源码如下:
//枚举进程DLL获得加载地址
void GetProcessModule(HANDLE hProcessID, unsigned short* uni_ModuleName, void* Buffer)
{
UNICODE_STRING uniModuleName = { NULL };
RtlInitUnicodeString(&uniModuleName, uni_ModuleName);
PUNICODE_STRING uni_alloc = ExAllocatePoolWithTag(PagedPool, uniModuleName.Length, 'pinu');
*uni_alloc = uniModuleName;
NTSTATUS nStatus;
//PEB结构指针
PPEB pPEB = NULL;

//EPROCESS结构指针
PEPROCESS  pEProcess = NULL;

//查找的函数名称
UNICODE_STRING uniFunctionName;

//进程参数信息
PRTL_USER_PROCESS_PARAMETERS pParam = NULL;

//LDR数据结构
PPEB_LDR_DATA pPebLdrData = NULL;

//LDR链表入口
PLDR_DATA_TABLE_ENTRY pLdrDataEntry = NULL;

//链表头节点、尾节点
PLIST_ENTRY pListEntryStart = NULL;
PLIST_ENTRY pListEntryEnd = NULL;

//函数指针
PFNPsGetProcessPeb  PsGetProcessPeb = NULL;

//保存APC状态
KAPC_STATE KAPC = { 0 };

//是否已经附加到进程
BOOLEAN bIsAttached = FALSE;

//获取进程的EPROCESS结构指针
nStatus = PsLookupProcessByProcessId((HANDLE)hProcessID, &pEProcess);
if (!NT_SUCCESS(nStatus))
{
return;
}

//查找函数地址
RtlInitUnicodeString(&uniFunctionName, L"PsGetProcessPeb");
PsGetProcessPeb = (PFNPsGetProcessPeb)MmGetSystemRoutineAddress(&uniFunctionName);
if (PsGetProcessPeb == NULL)
{
KdPrint(("Get PsGetProcessPeb Failed~!\n"));
return;
}

//获取PEB指针
pPEB = PsGetProcessPeb(pEProcess);
if (pPEB == NULL)
{
KdPrint(("Get pPEB Failed~!\n"));
return;
}
//附加到进程
KeStackAttachProcess(pEProcess, &KAPC);

bIsAttached = TRUE;

//指向LDR
pPebLdrData = pPEB->Ldr;

//头节点、尾节点
pListEntryStart = pListEntryEnd = pPebLdrData->InMemoryOrderModuleList.Flink;


//开始遍历_LDR_DATA_TABLE_ENTRY
do
{
//通过_LIST_ENTRY的Flink成员获取_LDR_DATA_TABLE_ENTRY结构  
pLdrDataEntry = (PLDR_DATA_TABLE_ENTRY)CONTAINING_RECORD(pListEntryStart, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);

pListEntryStart = pListEntryStart->Flink;

} while (!RtlEqualUnicodeString(uni_alloc, &pLdrDataEntry->BaseDllName, TRUE));

//数据传递
memcpy(Buffer, &pLdrDataEntry->DllBase, sizeof(pLdrDataEntry->DllBase));
//Detach进程
if (bIsAttached != FALSE)
{
KeUnstackDetachProcess(&KAPC);
}

//减少引用计数
if (pEProcess != NULL)
{
ObDereferenceObject(pEProcess);
pEProcess = NULL;
}

return;

}
问题就出在KeStackAttackProcess之前uni_alloc是正常的传进来的DLL名,在Attach之后,就会变动,应该是指针访问的问题,不知道怎么解决,望大佬解决

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 198
活跃值: (81)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
2020-2-17 10:26
0
雪    币: 198
活跃值: (81)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
2020-2-17 11:43
0
雪    币: 9941
活跃值: (2163)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
标 题:用文档化方法列举系统模块
作 者:nightxie
时 间:2008-10-12 15:07:08 
链 接:http://bbs.pediy.com/showthread.php?t=74504
2020-2-17 14:21
0
游客
登录 | 注册 方可回帖
返回
//