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

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

2020-2-17 10:09
3164
源码如下:
//枚举进程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之后,就会变动,应该是指针访问的问题,不知道怎么解决,望大佬解决

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

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