(转)ZwQuerySystemInformation枚举内核模块及简单应用
http://hi.baidu.com/_achillis/item/8b33ead8ccac28ea3cc2cb17
簡(jiǎn)單說(shuō),即調(diào)用第11號(hào)功能,枚舉一下內(nèi)核中已加載的模塊。
部分代碼如下:
//功能號(hào)為11,先獲取所需的緩沖區(qū)大小
ZwQuerySystemInformation(SystemModuleInformation,NULL,0,&needlen);
//申請(qǐng)內(nèi)存
ZwAllocateVirtualMemory(NtCurrentProcess(),(PVOID*)&pBuf,0,&needlen,MEM_COMMIT,PAGE_READWRITE);
//再次調(diào)用
ZwQuerySystemInformation(SystemModuleInformation,(PVOID)pBuf,truelen,&needlen);
......
//最后,釋放內(nèi)存
ZwFreeVirtualMemory(NtCurrentProcess(),(PVOID*)&pBuf,&needlen,MEM_RELEASE);
突出過(guò)程,省略了錯(cuò)誤判斷,和調(diào)用其它的功能時(shí)操作并沒(méi)有什么區(qū)別。
關(guān)鍵在返回的內(nèi)容中,緩沖區(qū)pBuf的前四個(gè)字節(jié)是已加載的模塊總數(shù),記為ModuleCnt,接下來(lái)就是共有ModuleCnt個(gè)元素的模塊信息數(shù)組了。
該結(jié)構(gòu)如下:
typedef struct _SYSTEM_MODULE_INFORMATION {
ULONG Count;
SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
模塊詳細(xì)信息結(jié)構(gòu)如下:
typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {
HANDLE Section;
PVOID MappedBase;
PVOID Base;
ULONG Size;
ULONG Flags;
USHORT LoadOrderIndex;
USHORT InitOrderIndex;
USHORT LoadCount;
USHORT PathLength;
CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
一個(gè)for循環(huán),循環(huán)ModuleCnt次就OK了。
基于此,寫(xiě)了三個(gè)簡(jiǎn)單的函數(shù)。
void ShowAllModules(char *pBuf)
{
//函數(shù)功能:輸出所有模塊信息
//參數(shù)pBuf:ZwQuerySystemInformation返回的緩沖區(qū)首址
PSYSTEM_MODULE_INFORMATION_ENTRY pSysModuleInfo;
DWORD Modcnt=0;
Modcnt=*(DWORD*)pBuf;
pSysModuleInfo=(PSYSTEM_MODULE_INFORMATION_ENTRY)(pBuf+sizeof(DWORD));
for (DWORD i=0;i<Modcnt;i++)
{
?? printf("%d\t0x%08X 0x%08X %s\n",pSysModuleInfo->LoadOrderIndex,pSysModuleInfo->Base,pSysModuleInfo->Size,pSysModuleInfo->ImageName);
?? pSysModuleInfo++;
}
}
void GetOSKrnlInfo(char *pBuf,DWORD *KernelBase,char *szKrnlPath)
{
//函數(shù)功能:返回系統(tǒng)內(nèi)核(ntoskrnl.exe或ntkrnlpa.exe)的基址和路徑
//參數(shù)pBuf:ZwQuerySystemInformation返回的緩沖區(qū)首址
//參數(shù)KernelBase:接收返回的系統(tǒng)內(nèi)核的基址
//參數(shù)szKrnlPath:接收返回的內(nèi)核文件的路徑
PSYSTEM_MODULE_INFORMATION_ENTRY pSysModuleInfo;
DWORD Modcnt=0;
*KernelBase=0;
Modcnt=*(DWORD*)pBuf;
pSysModuleInfo=(PSYSTEM_MODULE_INFORMATION_ENTRY)(pBuf+sizeof(DWORD));
//其實(shí)第一個(gè)模塊就是了,還是驗(yàn)證一下吧
if (strstr((strlwr(pSysModuleInfo->ImageName),pSysModuleInfo->ImageName),"nt"))
{
?? *KernelBase=(DWORD)pSysModuleInfo->Base;
?? GetSystemDirectory(szKrnlPath,MAX_PATH);
?? lstrcat(szKrnlPath,strrchr(pSysModuleInfo->ImageName,'\\'));
}
}
void DetectModule(char *pBuf,DWORD dwAddress,char *ModulePath)
{
//函數(shù)功能:找出給定地址所在的模塊
//參數(shù)pBuf:緩沖區(qū)地址,同上
//參數(shù)dwAddress:要查詢的內(nèi)核地址
//參數(shù)ModulePath:接收返回的模塊路徑
PSYSTEM_MODULE_INFORMATION_ENTRY pSysModuleInfo;
DWORD Modcnt=0;
Modcnt=*(DWORD*)pBuf;
pSysModuleInfo=(PSYSTEM_MODULE_INFORMATION_ENTRY)(pBuf+sizeof(DWORD));
for (DWORD i=0;i<Modcnt;i++)
{
?? if ((dwAddress>=(DWORD)pSysModuleInfo->Base)&&(dwAddress<(DWORD)pSysModuleInfo->Base+pSysModuleInfo->Size))
?? {
??? lstrcpy(ModulePath,pSysModuleInfo->ImageName);
?? }
?? pSysModuleInfo++;
}
}
該功能是通過(guò)遍歷PsLoadedModuleList實(shí)現(xiàn)的,所以要隱藏的話,最簡(jiǎn)單的方法還是斷鏈~~
更高級(jí)的方法比如抹DriveObject,抹PE信息等等,以后再玩~
轉(zhuǎn)載于:https://www.cnblogs.com/himessage/archive/2013/01/22/2872032.html
總結(jié)
以上是生活随笔為你收集整理的(转)ZwQuerySystemInformation枚举内核模块及简单应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简单用于测试的listview的视图
- 下一篇: linux截图软件