elva

利用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 叶子 阅读(2791) 评论(2)  编辑 收藏 引用 所属分类: 技术研究

Feedback

# re: 利用NtUnmapViewOfSection强制卸载模块 2009-09-05 03:05 mszjk

这是ring0的代码么?  回复  更多评论   

# re: 利用NtUnmapViewOfSection强制卸载模块 [未登录] 2014-07-28 18:19 小学毕业生

NtUnmapViewOfSection可以再Ring3下使用。
我用VB做给你看
Private Declare Function NtUnmapViewOfSection Lib "ntdll.dll" (ByVal ProcessHandle As Long ,ByVal BaseAddress As Long)As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long ,ByVal bInheritHandle As Boolean, ByVal dwProcessId As Long)As Long
Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleFileName As String) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Sub UnloadNtdll(ByVal PID As Long)
Dim hProc As Long
hProc = OpenProcess(&h8 Or &H400, False, PID)
If hProc = 0 Then Exit Sub
NtUnmapViewOfSection hProc, GetModuleHandleA("ntdll.dll")
CloseHandle hProc
End Sub  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理