• MASM32编写TcpStatC再进阶 显示PID和对应进程说明符


    上周改写的TcpStatC,使用了API函数 GetTcpTable,不能显示网络端口关联的进程ID和进程名或进程对应文件说明符。周末抽空改进了一下。

    要获取和显示网络端口关联的进程ID和进程名,可以改用API函数GetExtendedTcpTable,获取MIB_TCPROW_OWNER_PID 或 MIB_TCPTABLE_OWNER_MODULE,但是MASM32中没有对这两个结构体进行预定义。需要DIY:

    MIB_TCPROW_OWNER_PID 的相关定义如下:

    1. ; typedef struct _MIB_TCPROW_OWNER_PID {
    2. ; DWORD dwState;
    3. ; DWORD dwLocalAddr;
    4. ; DWORD dwLocalPort;
    5. ; DWORD dwRemoteAddr;
    6. ; DWORD dwRemotePort;
    7. ; DWORD dwOwningPid;
    8. ; } MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;
    9. MIB_TCPROW_OWNER_PID struct
    10. dwState DWORD ?
    11. dwLocalAddr DWORD ?
    12. dwLocalPort DWORD ?
    13. dwRemoteAddr DWORD ?
    14. dwRemotePort DWORD ?
    15. dwOwningPid DWORD ? ;进程ID
    16. MIB_TCPROW_OWNER_PID ends
    17. PMIB_TCPROW_OWNER_PID typedef ptr MIB_TCPROW_OWNER_PID
    18. ; typedef struct _MIB_TCPTABLE_OWNER_PID {
    19. ; DWORD dwNumEntries;
    20. ; MIB_TCPROW_OWNER_PID table[ANY_SIZE];
    21. ; } MIB_TCPTABLE_OWNER_PID, *PMIB_TCPTABLE_OWNER_PID;
    22. ;
    23. MIB_TCPTABLE_OWNER_PID struct
    24. dwNumEntries DWORD ?
    25. table MIB_TCPROW_OWNER_PID ANY_SIZE dup()
    26. MIB_TCPTABLE_OWNER_PID ends
    27. PMIB_TCPTABLE_OWNER_PID typedef ptr MIB_TCPTABLE_OWNER_PID

    MIB_TCPROW_OWNER_PID中的成员dwOwningPid包含了端口对应的进程ID。

    MIB_TCPTABLE_OWNER_MODULE 的相关定义如下: 

    1. ; typedef struct _MIB_TCPROW_OWNER_MODULE {
    2. ; DWORD dwState;
    3. ; DWORD dwLocalAddr;
    4. ; DWORD dwLocalPort;
    5. ; DWORD dwRemoteAddr;
    6. ; DWORD dwRemotePort;
    7. ; DWORD dwOwningPid;
    8. ; LARGE_INTEGER liCreateTimestamp;
    9. ; ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
    10. ; } MIB_TCPROW_OWNER_MODULE, *PMIB_TCPROW_OWNER_MODULE
    11. MIB_TCPROW_OWNER_MODULE struct
    12. dwState DWORD ?
    13. dwLocalAddr DWORD ?
    14. dwLocalPort DWORD ?
    15. dwRemoteAddr DWORD ?
    16. dwRemotePort DWORD ?
    17. dwOwningPid DWORD ? ;进程ID
    18. liCreateTimestamp LARGE_INTEGER <>
    19. OwningModuleInfo ULONGLONG TCPIP_OWNING_MODULE_SIZE dup(?)
    20. MIB_TCPROW_OWNER_MODULE ends
    21. PMIB_TCPROW_OWNER_MODULE typedef ptr MIB_TCPROW_OWNER_MODULE
    22. ; typedef struct _MIB_TCPTABLE_OWNER_MODULE {
    23. ; DWORD dwNumEntries;
    24. ; MIB_TCPROW_OWNER_MODULE table[ANY_SIZE];
    25. ; } MIB_TCPTABLE_OWNER_MODULE, *PMIB_TCPTABLE_OWNER_MODULE
    26. MIB_TCPTABLE_OWNER_MODULE struct
    27. dwNumEntries DWORD ?
    28. table MIB_TCPROW_OWNER_MODULE ANY_SIZE dup()
    29. MIB_TCPTABLE_OWNER_MODULE ends
    30. PMIB_TCPTABLE_OWNER_MODULE typedef ptr MIB_TCPTABLE_OWNER_MODULE

    MIB_TCPROW_OWNER_MODULE 中的成员dwOwningPid包含了端口对应的进程ID。

    先试试MIB_TCPROW_OWNER_PID。

            invoke GetExtendedTcpTable, g_pTcpTable, addr dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0
    

    取得PID后,通过依次调用API函数 OpenProcess、EnumProcessModules、GetModuleBaseName来获取进程名。

    如果要取得进程对应的文件说明符,可以将GetModuleBaseName改为另外一个API函数GetModuleFileNameEx。

    我是先尝试GetModuleFileNameEx,如果不成功,再使用GetModuleBaseName。代码如下:

    1. ;=================================================
    2. ;Function: Get process name with process id
    3. ; Input: dwPid: process id
    4. ; Output: if eax = 0 then fail
    5. ; else eax = the length of the string copied to the buffer
    6. ;==================================================
    7. getProcNameById proc dwPid:DWORD
    8. local hMod, hProc: HANDLE
    9. local dwNeeded: DWORD
    10. invoke OpenProcess, PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, dwPid
    11. .if eax!=NULL
    12. mov hProc, eax
    13. invoke GetModuleFileNameEx, hProc, NULL, offset g_szProcFileSpec, sizeof g_szProcFileSpec
    14. .IF eax==0
    15. invoke EnumProcessModules, hProc, addr hMod, sizeof hMod, addr dwNeeded
    16. .if eax!=0
    17. invoke GetModuleBaseName, hProc, hMod, offset g_szProcFileSpec, sizeof g_szProcFileSpec;
    18. .endif
    19. .ENDIF
    20. push eax
    21. invoke CloseHandle, hProc
    22. pop eax
    23. .endif
    24. ret
    25. getProcNameById endp

    在Windows 10上运行时,会发现有不少进程不能获取文件说明符,解决的办法是一要以具有管理员权限的帐号来运行程序,二要提升程序的特权,我尝试了获取SeDebugPrivilege,代码如下:

    1. ;=================================================
    2. ;Function: Let current process get the privilege
    3. ; Input: (none)
    4. ; Output: eax = 0 Success
    5. ; eax = 1 , fail to OpenProcessToken
    6. ; eax = 2 , fail to LookupPrivilegeValue
    7. ;==================================================
    8. EnableDebugPriv proc
    9. LOCAL hToken: HANDLE
    10. ;LOCAL sedebugnameValue: LUID ;An LUID is a 64-bit value
    11. LOCAL sedebugnameValue[2]: DWORD
    12. LOCAL tkp: TOKEN_PRIVILEGES
    13. invoke GetCurrentProcess
    14. mov ebx, eax
    15. invoke OpenProcessToken, ebx, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken
    16. .if (eax == 0)
    17. mov eax, 1
    18. ret
    19. .endif
    20. invoke LookupPrivilegeValue, NULL, offset g_szSE_DEBUG_NAME, addr sedebugnameValue
    21. .if (eax == 0)
    22. invoke CloseHandle, hToken
    23. mov eax, 2
    24. ret
    25. .endif
    26. mov tkp.PrivilegeCount, 1
    27. lea eax, tkp.Privileges
    28. m_m2m [eax], sedebugnameValue
    29. m_m2m [eax+4], [sedebugnameValue+1]
    30. mov ( LUID_AND_ATTRIBUTES ptr [eax]).Attributes, SE_PRIVILEGE_ENABLED
    31. invoke AdjustTokenPrivileges, hToken, FALSE, addr tkp, sizeof tkp, NULL, NULL
    32. .if (eax == 0)
    33. invoke CloseHandle, hToken
    34. .endif
    35. xor eax, eax
    36. ret
    37. EnableDebugPriv endp

    生成的EXE文件信息如下:


    文件说明符 : K:\TcpStatC.exe
    属性 : A---
    数字签名:否
    PE文件:是
    获取文件版本信息大小失败!
    创建时间 : 2022-8-14 22:13:51
    修改时间 : 2022-8-14 22:18:8
    大小 : 5120 字节 5.0 KB
    MD5 : a17a53ab06707808ba456ba90374a9ee
    SHA1: 156A74E1E5BB56D00383E926F9983D8DBE480753
    CRC32: 901593e7

    下载地址:http://endurer.ys168.com/  tools工具/网络工具 下

    程序运行效果如下:

      netstat 命令显示如下:

    参考:

    枚举所有进程 - Win32 apps | Microsoft Docs

    GetModuleFileNameExA function (psapi.h) - Win32 apps | Microsoft Docs

    EnumProcessModules function (psapi.h) - Win32 apps | Microsoft Docs 

    GetModuleBaseNameA function (psapi.h) - Win32 apps | Microsoft Docs

  • 相关阅读:
    SpringMVC Day 03 : 处理静态资源
    条件随机场(CRF)极简原理与超详细代码解析
    Zstack一面面经
    java之冒泡排序和选择排序和直接插入排序原理
    SQL教程之 SQL 聚合函数入门教程
    非对称密钥在ssh远程登陆Linux时的使用
    锐捷RG-UAC统一上网行为管理审计系统信息泄漏漏洞
    docker安装postgresql
    【上海大学计算机组成原理实验报告】六、内存系统实验
    P14 JDBC 快速入门
  • 原文地址:https://blog.csdn.net/Purpleendurer/article/details/126330731