枚举进程的模块的问题
<font style="BACKGROUND-COLOR: #ffffff" size="4" face="Verdana">附件里的代码可以枚举进程,点某个进程的右键菜单,然后点查看模块,就能查看模块了。但我发现有的进程能查看模块,有的进程不能显示模块。请问怎么办?</font><br/> <p>测试了一下,在我这里貌似都行.</p><p> </p>
<p>估计是有安全软件限制了,或者用户权限过低之类.</p>
还是不行
<p><font style="BACKGROUND-COLOR: #ffffff" size="4" face="Verdana">我把代码生成为EXE文件。我又在一个没有安装杀毒软件的虚拟机里试了一下,结果还是有的能,有的不能。当前用户是管理员,安全模式下试了也是有的能,有的不能。</font></p><p><font style="BACKGROUND-COLOR: #ffffff" size="4" face="Verdana">alg.exe不能<br/>conime.exe能<br/>csrss.exe不能<br/>ctfmon.exe能<br/>explorer.exe能<br/>smss.exe不能<br/>lsass.exe不能<br/>services.exe不能<br/>svchost.exe不能<br/>winlogon.exe不能</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" size="4" face="Verdana">有的进程点右键打开显示模块的窗口后,ListView控件没有条目。有的却能显示模块。我用GetLastError和FormatMessage显示"操作成功完成"。不知您能查看上面那些标为不能的进程的模块吗?<br/>关于制作进程管理器,您推荐用什么函数?是CreateToolhelpSnapshot,还是EnumProcesses?<br/></font></p><br/> <p>我又测试了一下,除了SYSTEM等无模块的进程外,其余都是能行的.</p>
<p> </p>
<p>我的系统是2003 SP2,没开任何安全软件.</p>
<p> </p>
<p>也许是系统本身的限制吧.</p>
<p> </p>
<p>你试一下提升进程权限: </p>
<div class="msgheader">QUOTE:</div><div class="msgborder"><b>
<p><font face="Verdana">Option Explicit<br/>'*************************************************************************<br/>'**模 块 名:ModSetProDebug<br/>'**说 明:将本进程运行级别设置为DEBUG<br/>'**创 建 人:马大哈<br/>'**日 期:2006年10月22日<br/>'**描 述:网上收集<br/>'**版 本:V1.0<br/>'*************************************************************************</font></p>
<p><font face="Verdana">Private Type LARGE_INTEGER</font></p>
<p><font face="Verdana"> lowpart As Long<br/> highpart As Long</font></p>
<p><font face="Verdana">End Type</font></p>
<p><font face="Verdana">Private Const ANYSIZE_ARRAY As Long = 1</font></p>
<p><font face="Verdana">Private Const SE_PRIVILEGE_ENABLED As Long = &H2</font></p>
<p><font face="Verdana">Private Const TOKEN_ADJUST_PRIVILEGES As Long = &H20</font></p>
<p><font face="Verdana">Private Const TOKEN_QUERY As Long = &H8</font></p>
<p><font face="Verdana">Private Type LUID_AND_ATTRIBUTES</font></p>
<p><font face="Verdana"> LUID As LARGE_INTEGER<br/> Attributes As Long</font></p>
<p><font face="Verdana">End Type</font></p>
<p><font face="Verdana">Private Type TOKEN_PRIVILEGES</font></p>
<p><font face="Verdana"> PrivilegeCount As Long<br/> Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES</font></p>
<p><font face="Verdana">End Type</font></p>
<p><font face="Verdana">Private Declare Function LookupPrivilegeValue _<br/> Lib "advapi32.dll" _<br/> Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, _<br/> ByVal lpName As String, _<br/> ByRef lpLuid As LARGE_INTEGER) As Long</font></p>
<p><font face="Verdana">Private Declare Function AdjustTokenPrivileges _<br/> Lib "advapi32.dll" (ByVal TokenHandle As Long, _<br/> ByVal DisableAllPrivileges As Long, _<br/> ByRef NewState As TOKEN_PRIVILEGES, _<br/> ByVal BufferLength As Long, _<br/> ByRef PreviousState As Long, _<br/> ByRef ReturnLength As Long) As Long</font></p>
<p><font face="Verdana">Private Declare Function GetCurrentProcess Lib "KERNEL32.dll" () As Long</font></p>
<p><font face="Verdana">Private Declare Function GetCurrentProcessId Lib "KERNEL32.dll" () As Long</font></p>
<p><font face="Verdana">Private Declare Function CloseHandle Lib "KERNEL32.dll" (ByVal hObject As Long) As Long</font></p>
<p><font face="Verdana">Private Declare Function OpenProcessToken _<br/> Lib "advapi32.dll" (ByVal ProcessHandle As Long, _<br/> ByVal DesiredAccess As Long, _<br/> ByRef TokenHandle As Long) As Long</font></p>
<p><font face="Verdana">Private Declare Function GetLastError Lib "KERNEL32.dll" () As Long</font></p>
<p><font face="Verdana">Public Function EnableDebugPrivilege() As Boolean</font></p>
<p><font face="Verdana"> Dim TP As TOKEN_PRIVILEGES</font></p>
<p><font face="Verdana"> Dim hToken As Long, r As Long, e As Long</font></p>
<p><font face="Verdana"> r = OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken)<br/> e = GetLastError</font></p>
<p><font face="Verdana"> ' Err.Raise 6<br/> If r And Not e Then<br/> r = LookupPrivilegeValue(vbNullString, "SeDebugPrivilege", TP.Privileges(0).LUID)<br/> e = GetLastError</font></p>
<p><font face="Verdana"> If r And Not e Then<br/> TP.PrivilegeCount = 1<br/> TP.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED</font></p>
<p><font face="Verdana"> r = AdjustTokenPrivileges(hToken, False, TP, LenB(TP), 0, 0)<br/> EnableDebugPrivilege = GetLastError = 0<br/> End If<br/> End If</font></p>
<p><font face="Verdana"> Call CloseHandle(hToken)<br/>End Function</font></p></b></div>
<p>启动时先调用<font face="Verdana">EnableDebugPrivilege就行.</font></p> <p><font size="4">谢谢,提权后又有好多进程可以列出模块了。在有杀毒软件的系统里,360安全卫士、卡巴斯基这种进程仍然无法列出模块。</font></p> <p>晕,这些安全软件随便让你几句普通函数就列出来了他们还混个啥- -!</p>
<p> </p>
<p>作为安全软件,如果连自己都保护不了,如何去保护别人呢.</p> 感谢老马的教导。 支持老马 热心老马
页:
[1]