利用NtUnmapViewOfSection強制卸載模塊
確實可以卸載指定進程指定位置的模塊,但有幾個問題:[1] PEB的模塊列表中還存在該模塊的記錄,大部分模塊枚舉函數都是枚舉這個列表
[2] 可能會出現訪問異常
看來RING3下是不可能做到強制卸載模塊的完美實現,要進ring0才行。下面是測試代碼
typedef ULONG (WINAPI *PFNNtUnmapViewOfSection)( IN HANDLE ProcessHandle,IN PVOID BaseAddress );
BOOL UnmapViewOfModule ( DWORD dwProcessId, LPVOID lpBaseAddr )
...{
HMODULE hModule = GetModuleHandle ( L"ntdll.dll" ) ;
if ( hModule == NULL )
hModule = LoadLibrary ( L"ntdll.dll" ) ;
PFNNtUnmapViewOfSection pfnNtUnmapViewOfSection = (PFNNtUnmapViewOfSection)GetProcAddress ( hModule, "NtUnmapViewOfSection" ) ;
HANDLE hProcess = OpenProcess ( PROCESS_ALL_ACCESS, TRUE, dwProcessId ) ;
ULONG ret = pfnNtUnmapViewOfSection ( hProcess, lpBaseAddr ) ;
CloseHandle ( hProcess ) ;
return ret ? false : true ;
}posted on 2007-09-24 15:08 葉子 閱讀(4823) 評論(2) 編輯 收藏 引用 所屬分類: 技術研究

