在WINDBG中手动查看dwPeBase + pBaseOffset_Name可以看到获取到的DLL模块的名称,
但调试单步过 [DWORD32 pBaseOffset_Name = pExportDir->Name]这句时必蓝屏 本人是新手,请多指教
考虑可能和IRQL以及分页有关系,但没有尝试无果
考虑和附加进程有关系,更换为KeStackAttachProcess 原来使用 KeAttachProcess
经过多次尝试无果,特此请教
//设置为不可写
void DisableWrite()
{
__try
{
_asm
{
mov eax, cr0;
or eax, 10000h;
mov cr0, eax;
sti;
}
}
__except (EXCEPTION_EXECUTE_HANDLER) {
DbgPrint("[-] [DisableWrite]函数发生SEH错误 Code[%d]!", GetExceptionCode());
}
}
// 设置为可写
void EnableWrite()
{
__try
{
_asm
{
cli
mov eax, cr0
and eax, not 10000h //and eax,0FFFEFFFFh
mov cr0, eax
}
}
__except (EXCEPTION_EXECUTE_HANDLER) {
DbgPrint("[-] [EnableWrite]函数发生SEH错误 Code[%d]!", GetExceptionCode());
}
}
BOOL PEReadMouduleName(
DWORD32 BaseAddr,//模块在进程中的加载地址
PEPROCESS arg_EPROCESS)//需要操作进程的执行体
{
__try
{
__asm int 3;
KAPC_STATE ks;
KeStackAttachProcess(arg_EPROCESS, &ks);
EnableWrite();
DWORD32 dwPeBase = BaseAddr;
PIMAGE_NT_HEADERS pNtHead = (PIMAGE_NT_HEADERS)(PBYTE(dwPeBase) + pDosHead->e_lfanew);
if (!MmIsAddressValid(&pNtHead->OptionalHeader.DataDirectory))
return FALSE;
/*DLL导出表中地址相对主模块的偏移*/
DWORD32 BaseOffset_pExportDir = pNtHead->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
KeLowerIrql(PASSIVE_LEVEL);//为了可以读取分页内存所以降低了IRQL.不知道有没有用
/*获取导出表实际地址*/
PIMAGE_EXPORT_DIRECTORY pExportDir = (PIMAGE_EXPORT_DIRECTORY)(BaseOffset_pExportDir + dwPeBase);
/*从导出表中获取模块名称指针相对模块基址的偏移*/
DWORD32 pBaseOffset_Name = pExportDir->Name; *************这里必蓝屏*******************
/*获取模块名称的指针*/
PCHAR pMouduleName = PCHAR(dwPeBase + pBaseOffset_Name);
/*擦除*/
pMouduleName[0] = 0;
KIRQL OldIrql;
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
KeUnstackDetachProcess(&ks);
DisableWrite();
return TRUE;
}
__except (EXCEPTION_EXECUTE_HANDLER){
KeDetachProcess();
DbgPrint("[-] [RemovePESymbol]函数发生SEH错误 Code[%d]!\r\n", GetExceptionCode());
return -1;
}
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!