在64位机器上检查32位程序时,是否可以获得tasklist/m的正确DLL模块列表?

在64位机器上检查32位程序时,是否可以获得tasklist/m的正确DLL模块列表?,dll,cmd,command-prompt,windows-7-x64,Dll,Cmd,Command Prompt,Windows 7 X64,windows上的命令tasklist具有非常有用的功能:它可以列出一个进程或所有进程的所有dll模块。下面的命令将列出explorer.exe使用的所有DLL文件: tasklist /fi "ImageName eq explorer.exe" /m 如下所示(缩写,翻译成英语): 问题是,这对于64位进程来说效果不太好: C:\>tasklist /fi "ImageName eq firefox.exe" /m Process name PID

windows上的命令
tasklist
具有非常有用的功能:它可以列出一个进程或所有进程的所有
dll
模块。下面的命令将列出
explorer.exe使用的所有DLL文件

tasklist /fi "ImageName eq explorer.exe" /m
如下所示(缩写,翻译成英语):

问题是,这对于64位进程来说效果不太好:

C:\>tasklist /fi "ImageName eq firefox.exe" /m

Process name              PID      Modules
========================= ======== ============================================
firefox.exe                   4980 ntdll.dll, wow64.dll, wow64win.dll,
                                   wow64cpu.dll
您看到的是不完整的,看起来更像这样:

然后我的问题是:我可以将tasklist作为32位程序启动,还是确保它返回正确的值?我需要从另一个程序(Java)调用tasklist,并获取加载的DLL文件列表。我需要它来确保我不会尝试加载DLL两次。

您可以从

示例输出:

F:\>c:\apps\NirSoft\SysinternalsSuite\listdlls firefox

ListDLLs v3.1 - List loaded DLLs
Copyright (C) 1997-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

--------------------------------------------------------------------
firefox.exe pid: 2000
Command line: C:\apps\Firefox\firefox.exe

Base                Size      Path
0x00000000012c0000  0x5f000   C:\apps\Firefox\firefox.exe
0x0000000076d80000  0x1a9000  C:\Windows\SYSTEM32\ntdll.dll
0x00000000748a0000  0x3f000   C:\Windows\SYSTEM32\wow64.dll
0x0000000074840000  0x5c000   C:\Windows\SYSTEM32\wow64win.dll
0x0000000074830000  0x8000    C:\Windows\SYSTEM32\wow64cpu.dll
0x00000000012c0000  0x5f000   C:\apps\Firefox\firefox.exe
0x0000000076f60000  0x180000  C:\Windows\SysWOW64\ntdll.dll
0x000000006d100000  0x47000   C:\apps\Avast\snxhk.dll
0x0000000074960000  0x110000  C:\Windows\syswow64\KERNEL32.dll
0x00000000766d0000  0x47000   C:\Windows\syswow64\KERNELBASE.dll
0x00000000741d0000  0x62000   C:\Windows\SysWOW64\guard32.dll
0x0000000076880000  0x100000  C:\Windows\syswow64\USER32.dll
0x00000000753d0000  0x90000   C:\Windows\syswow64\GDI32.dll
0x0000000075110000  0xa000    C:\Windows\syswow64\LPK.dll
0x0000000074b00000  0x9d000   C:\Windows\syswow64\USP10.dll
0x00000000757c0000  0xac000   C:\Windows\syswow64\msvcrt.dll
0x0000000075720000  0xa0000   C:\Windows\syswow64\ADVAPI32.dll
0x00000000753b0000  0x19000   C:\Windows\SysWOW64\sechost.dll
0x0000000075490000  0xf0000   C:\Windows\syswow64\RPCRT4.dll
0x0000000074900000  0x60000   C:\Windows\syswow64\SspiCli.dll
0x00000000748f0000  0xc000    C:\Windows\syswow64\CRYPTBASE.dll
0x00000000746a0000  0x9000    C:\Windows\SysWOW64\VERSION.dll
0x0000000074c50000  0x5000    C:\Windows\syswow64\PSAPI.DLL
0x0000000074bb0000  0x60000   C:\Windows\SysWOW64\IMM32.DLL
0x0000000074d50000  0xcc000   C:\Windows\syswow64\MSCTF.dll
0x0000000074600000  0x7000    C:\Windows\SysWOW64\fltlib.dll
0x000000006d0c0000  0x1b000   C:\apps\Firefox\mozglue.dll
0x000000006d040000  0x71000   C:\apps\Firefox\MSVCP120.dll
0x0000000067c20000  0xee000   C:\apps\Firefox\MSVCR120.dll
0x0000000060700000  0x1a0000  C:\apps\Firefox\nss3.dll
...

来源

ListDLL是一个实用程序,用于报告加载到进程中的DLL。您可以使用它列出加载到所有进程、特定进程中的所有DLL,或列出加载了特定DLL的进程。ListDLL还可以显示DLL的完整版本信息,包括它们的数字签名,并可用于扫描进程以查找未签名的DLL



免责声明:我没有任何关联,我只是该软件的最终用户。

可用于枚举目标进程中的32位和/或64位模块。

您可以使用PowerShell:

Get-Process winword| select -ExpandProperty modules|ft -Autosize


摘自:

尝试使用c:\windows\syswow64中32位版本的tasklist.exe。-虽然这些是32位DLL,而不是64位DLL,但您可能需要重新考虑它们是否计数;很难说,因为我不明白你们到底想实现什么。我在应用程序中注入DLL,我知道它是32位的。注射DLL两次可能会做坏事。因此,我需要检查DLL是否已被注入,并禁用触发注入的按钮。@HarryJohnston Tasklist at
C:\Windows\SysWOW64\Tasklist.exe
不幸地打印相同的结果。这需要我将此程序与我的应用程序捆绑在一起。我在windows安装中看到了一些东西,我想这是一个windows函数,可以通过适当的dll文件导入Java JVM。我不熟悉使用Java调用本机API。在C DLL(或应用程序)中实现面向API的代码并从Java调用可能更简单。@HarryJohnson需要一些工作,但可以使用JNA在Java中实现(也可以使用JNI)。如果我成功了,我会把它贴在这里,我认为这个答案是可以接受的,因为它提出了比运行(和捆绑)外部应用程序更多的编程方法。我用EnumProcessModulesEx()的Win API调用替换了tasklist命令,用32位进程解决了这个问题。
Get-Process winword| select -ExpandProperty modules|ft -Autosize