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

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

MIB_TCPROW_OWNER_PID 的相关定义如下:

 ; typedef struct _MIB_TCPROW_OWNER_PID {;   DWORD dwState;;   DWORD dwLocalAddr;;   DWORD dwLocalPort;;   DWORD dwRemoteAddr;;   DWORD dwRemotePort;;   DWORD dwOwningPid;; } MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;MIB_TCPROW_OWNER_PID structdwState      DWORD ?dwLocalAddr  DWORD ?dwLocalPort  DWORD ?dwRemoteAddr DWORD ?dwRemotePort DWORD ?dwOwningPid  DWORD ? ;进程ID
MIB_TCPROW_OWNER_PID ends
PMIB_TCPROW_OWNER_PID typedef ptr MIB_TCPROW_OWNER_PID; typedef struct _MIB_TCPTABLE_OWNER_PID {;   DWORD                dwNumEntries;;   MIB_TCPROW_OWNER_PID table[ANY_SIZE];; } MIB_TCPTABLE_OWNER_PID, *PMIB_TCPTABLE_OWNER_PID;; MIB_TCPTABLE_OWNER_PID structdwNumEntries DWORD ?table        MIB_TCPROW_OWNER_PID ANY_SIZE dup(<?>)
MIB_TCPTABLE_OWNER_PID ends
PMIB_TCPTABLE_OWNER_PID typedef ptr MIB_TCPTABLE_OWNER_PID

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

MIB_TCPTABLE_OWNER_MODULE 的相关定义如下:

 ; typedef struct _MIB_TCPROW_OWNER_MODULE {;   DWORD         dwState;;   DWORD         dwLocalAddr;;   DWORD         dwLocalPort;;   DWORD         dwRemoteAddr;;   DWORD         dwRemotePort;;   DWORD         dwOwningPid;;   LARGE_INTEGER liCreateTimestamp;;   ULONGLONG     OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];; } MIB_TCPROW_OWNER_MODULE, *PMIB_TCPROW_OWNER_MODULEMIB_TCPROW_OWNER_MODULE structdwState           DWORD ?dwLocalAddr       DWORD ?dwLocalPort       DWORD ?dwRemoteAddr      DWORD ?dwRemotePort      DWORD ?dwOwningPid       DWORD ? ;进程IDliCreateTimestamp LARGE_INTEGER <>OwningModuleInfo  ULONGLONG  TCPIP_OWNING_MODULE_SIZE dup(?)
MIB_TCPROW_OWNER_MODULE ends
PMIB_TCPROW_OWNER_MODULE  typedef ptr MIB_TCPROW_OWNER_MODULE; typedef struct _MIB_TCPTABLE_OWNER_MODULE {;   DWORD                   dwNumEntries;;   MIB_TCPROW_OWNER_MODULE table[ANY_SIZE];; } MIB_TCPTABLE_OWNER_MODULE, *PMIB_TCPTABLE_OWNER_MODULEMIB_TCPTABLE_OWNER_MODULE structdwNumEntries DWORD ?table        MIB_TCPROW_OWNER_MODULE ANY_SIZE dup(<?>)
MIB_TCPTABLE_OWNER_MODULE endsPMIB_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。代码如下:

;=================================================
;Function: Get process name with process id
; Input:  dwPid: process id
; Output: if eax = 0 then fail
; else eax = the length of the string copied to the buffer
;==================================================
getProcNameById proc dwPid:DWORDlocal hMod, hProc: HANDLElocal dwNeeded: DWORDinvoke OpenProcess, PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, dwPid.if eax!=NULLmov    hProc, eaxinvoke GetModuleFileNameEx, hProc, NULL, offset g_szProcFileSpec, sizeof g_szProcFileSpec.IF eax==0invoke EnumProcessModules, hProc, addr hMod, sizeof hMod, addr dwNeeded.if eax!=0invoke GetModuleBaseName, hProc, hMod, offset g_szProcFileSpec,  sizeof g_szProcFileSpec;.endif.ENDIFpush   eaxinvoke CloseHandle, hProcpop    eax.endifret
getProcNameById endp

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

;=================================================
;Function: Let current process get the privilege
; Input: (none)
; Output: eax = 0 Success
; eax = 1 , fail to OpenProcessToken
; eax = 2 , fail to LookupPrivilegeValue
;==================================================
EnableDebugPriv procLOCAL hToken: HANDLE;LOCAL sedebugnameValue: LUID ;An LUID is a 64-bit valueLOCAL sedebugnameValue[2]: DWORDLOCAL tkp: TOKEN_PRIVILEGESinvoke GetCurrentProcessmov ebx, eaxinvoke OpenProcessToken, ebx, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken.if (eax == 0)mov eax, 1ret.endifinvoke LookupPrivilegeValue, NULL, offset g_szSE_DEBUG_NAME, addr sedebugnameValue.if (eax == 0)invoke CloseHandle, hTokenmov eax, 2ret.endifmov tkp.PrivilegeCount, 1lea eax, tkp.Privilegesm_m2m [eax], sedebugnameValuem_m2m [eax+4], [sedebugnameValue+1]mov ( LUID_AND_ATTRIBUTES ptr [eax]).Attributes, SE_PRIVILEGE_ENABLEDinvoke AdjustTokenPrivileges, hToken, FALSE, addr tkp, sizeof tkp, NULL, NULL.if (eax == 0)invoke CloseHandle, hToken.endifxor eax, eaxret
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

MASM32编写TcpStatC再进阶 显示PID和对应进程说明符相关推荐

  1. Java黑皮书课后题第1章:*1.11(人口估算)编写一个程序,显示未来5年的每年人口数。假设当前的人口是312 032 486,每年有365天

    Java黑皮书课后题第1章:*1.11(人口估算) 题目 题目描述 破题 代码块 方法评析 为什么print函数内的表达式不能分开 修改日志 题目 题目描述 *1.11(人口估算)编写一个程序,显示未 ...

  2. Java黑皮书课后题第6章:*6.16(一年的天数)使用下面的方法体编写一个方法,返回一年的天数。编写一个测试程序,显示从2000年到2020年间每年的天数

    *6.16(一年的天数)使用下面的方法体编写一个方法,返回一年的天数.编写一个测试程序,显示从2000年到2020年间每年的天数 题目 题目描述 破题 本题代码 运行示例 题目 题目描述 *6.16( ...

  3. Java黑皮书课后题第6章:*6.14(估算π)π可以使用下面的数列进行计算。编写一个方法,对于给定的i返回m(i),并编写一个测试程序,显示如下表格

    6.14(估算π)π可以使用下面的数列进行计算.编写一个方法,对于给定的i返回m,并编写一个测试程序,显示如下表格 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 6.14(估算π)π ...

  4. jps显示当前所有java进程pid

    很多Java命令都在jdk的JAVA_HOME/bin/目录下面,jps也不例外,他就在bin目录下,所以,他是java自带的一个命令. jps(Java Virtual Machine Proces ...

  5. 树状数组再进阶(区间修改+区间查询)

    今天,我们再在树状数组上进一步突破,我们来讲一讲区间修改和区间查询.同样的,这需要各位对树状数组的基本知识有所了解,大家可以看看我的另一篇文章:树状数组趣解. 下面进入正题. 同样的,我还是先给代码, ...

  6. vs2017c语言一闪而逝6,Visual Studio IDE编写程序时不显示窗口或窗口一闪而逝的解决方法...

    这篇文章主要为大家详细介绍了Visual Studio IDE编写程序时不显示窗口或窗口一闪而逝的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 使用Visual Studio IDE编写 ...

  7. Win10 服务器的任务管理器不显示PID处理方法

    一.PID介绍 Windows操作系统中,pid标志符是自动分配正在运行的程序的唯一顺序编号,进程终止后,PID被系统回收,并且可能继续分配给新运行的程序.户可以通过任务管理器查看进程程序. 二.现象 ...

  8. 编写 Java 程序用于显示人的姓名和年龄。

    题目 编写 Java 程序用于显示人的姓名和年龄. 定义一个人类Person.  该类中应该有两个私有属性: 姓名 (name) 和年龄 (age) . 定义构造方法用来初始化数据成员. 再定义显示 ...

  9. 服务器任务管理器不显示pid,任务管理器pid如何显示 Win10系统任务管理器显示PID进程方法...

    任务管理器pid如何显示?在Windows操作系统中,pid标志符是自动分配正在运行的程序的唯一顺序编号,在进程终止后,PID被系统回收,并且可能继续分配给新运行的程序,并且在用户需要查看该进程时,通 ...

  10. Java //PP1.6 编写一个程序,显示一首歌的一段歌词,并标注合声部分(歌曲自选)。

    Java程序设计教程(第七版) John Lewis & William Loftus 电子工业出版社 PP1.6 编写一个程序,显示一首歌的一段歌词,并标注合声部分(歌曲自选). 注意:在不 ...

最新文章

  1. RDKit | 基于RDKit绘制化学反应
  2. JVM基础系列第7讲:JVM 类加载机制
  3. 那些在一个公司死磕5-10年的人,最后都怎么样了...
  4. C++二维数组new小结(zz)
  5. C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序...
  6. CodeForces - 1551E Fixed Points(dp)
  7. Javascript玩转Prototype(一)——先谈C#原型模式
  8. signature=348a7ccbb9abe65fb90d6a0f44514435,Built-in self test for memory interconnect testing
  9. Dnsmasq原理总结
  10. [CMake] find_package 指定路径
  11. 【6】测试用例设计-输入域+输出域+异常分析+错误出错法
  12. 64位Windows下安装Redis教程
  13. 拉取 google.golang.org/grpc 报错
  14. UBUNTU安装Android Studio 3
  15. android中jni的调用过程,Android中JNI的调用生成头文件步骤
  16. spss的独立样本T检验
  17. 公司邮箱地址格式是什么?邮箱地址怎么写?邮箱地址大全
  18. linux网络操作系统项目教程第三版答案,《Linux网络操作系统项目教程(RHEL7.4 CentOS 7.4)(第3版))》习题及答案...
  19. 项目风险常见清单列表库--再也不愁不能提前预知风险了
  20. ExaGrid报告显示新冠疫情期间季度业绩仍表现强劲

热门文章

  1. python游戏挂机脚本_python游戏挂机
  2. 投入大小的伪原创工具
  3. 三级网络技术通关指南
  4. python考勤记录_python做考勤统计
  5. 小米路由器显示DNS服务器设置错误,小米路由器dns地址怎么设置
  6. 微信小程序获取二维码:报错47001 data format error
  7. 生物信息数据格式:fastq格式
  8. android 复制assets,Android复制Assets目录下的文件到指定目录
  9. 【全部译文】Deep-Waveform: A Learned OFDM Receiver Based on Deep Complex Convolutional Networks
  10. plc控制电机实验报告_五相十拍步进电动机控制-PLC课程实验报告