MASM32编写TcpStatC再进阶 显示PID和对应进程说明符
上周改写的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和对应进程说明符相关推荐
- Java黑皮书课后题第1章:*1.11(人口估算)编写一个程序,显示未来5年的每年人口数。假设当前的人口是312 032 486,每年有365天
Java黑皮书课后题第1章:*1.11(人口估算) 题目 题目描述 破题 代码块 方法评析 为什么print函数内的表达式不能分开 修改日志 题目 题目描述 *1.11(人口估算)编写一个程序,显示未 ...
- Java黑皮书课后题第6章:*6.16(一年的天数)使用下面的方法体编写一个方法,返回一年的天数。编写一个测试程序,显示从2000年到2020年间每年的天数
*6.16(一年的天数)使用下面的方法体编写一个方法,返回一年的天数.编写一个测试程序,显示从2000年到2020年间每年的天数 题目 题目描述 破题 本题代码 运行示例 题目 题目描述 *6.16( ...
- Java黑皮书课后题第6章:*6.14(估算π)π可以使用下面的数列进行计算。编写一个方法,对于给定的i返回m(i),并编写一个测试程序,显示如下表格
6.14(估算π)π可以使用下面的数列进行计算.编写一个方法,对于给定的i返回m,并编写一个测试程序,显示如下表格 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 6.14(估算π)π ...
- jps显示当前所有java进程pid
很多Java命令都在jdk的JAVA_HOME/bin/目录下面,jps也不例外,他就在bin目录下,所以,他是java自带的一个命令. jps(Java Virtual Machine Proces ...
- 树状数组再进阶(区间修改+区间查询)
今天,我们再在树状数组上进一步突破,我们来讲一讲区间修改和区间查询.同样的,这需要各位对树状数组的基本知识有所了解,大家可以看看我的另一篇文章:树状数组趣解. 下面进入正题. 同样的,我还是先给代码, ...
- vs2017c语言一闪而逝6,Visual Studio IDE编写程序时不显示窗口或窗口一闪而逝的解决方法...
这篇文章主要为大家详细介绍了Visual Studio IDE编写程序时不显示窗口或窗口一闪而逝的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 使用Visual Studio IDE编写 ...
- Win10 服务器的任务管理器不显示PID处理方法
一.PID介绍 Windows操作系统中,pid标志符是自动分配正在运行的程序的唯一顺序编号,进程终止后,PID被系统回收,并且可能继续分配给新运行的程序.户可以通过任务管理器查看进程程序. 二.现象 ...
- 编写 Java 程序用于显示人的姓名和年龄。
题目 编写 Java 程序用于显示人的姓名和年龄. 定义一个人类Person. 该类中应该有两个私有属性: 姓名 (name) 和年龄 (age) . 定义构造方法用来初始化数据成员. 再定义显示 ...
- 服务器任务管理器不显示pid,任务管理器pid如何显示 Win10系统任务管理器显示PID进程方法...
任务管理器pid如何显示?在Windows操作系统中,pid标志符是自动分配正在运行的程序的唯一顺序编号,在进程终止后,PID被系统回收,并且可能继续分配给新运行的程序,并且在用户需要查看该进程时,通 ...
- Java //PP1.6 编写一个程序,显示一首歌的一段歌词,并标注合声部分(歌曲自选)。
Java程序设计教程(第七版) John Lewis & William Loftus 电子工业出版社 PP1.6 编写一个程序,显示一首歌的一段歌词,并标注合声部分(歌曲自选). 注意:在不 ...
最新文章
- RDKit | 基于RDKit绘制化学反应
- JVM基础系列第7讲:JVM 类加载机制
- 那些在一个公司死磕5-10年的人,最后都怎么样了...
- C++二维数组new小结(zz)
- C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序...
- CodeForces - 1551E Fixed Points(dp)
- Javascript玩转Prototype(一)——先谈C#原型模式
- signature=348a7ccbb9abe65fb90d6a0f44514435,Built-in self test for memory interconnect testing
- Dnsmasq原理总结
- [CMake] find_package 指定路径
- 【6】测试用例设计-输入域+输出域+异常分析+错误出错法
- 64位Windows下安装Redis教程
- 拉取 google.golang.org/grpc 报错
- UBUNTU安装Android Studio 3
- android中jni的调用过程,Android中JNI的调用生成头文件步骤
- spss的独立样本T检验
- 公司邮箱地址格式是什么?邮箱地址怎么写?邮箱地址大全
- linux网络操作系统项目教程第三版答案,《Linux网络操作系统项目教程(RHEL7.4 CentOS 7.4)(第3版))》习题及答案...
- 项目风险常见清单列表库--再也不愁不能提前预知风险了
- ExaGrid报告显示新冠疫情期间季度业绩仍表现强劲
热门文章
- python游戏挂机脚本_python游戏挂机
- 投入大小的伪原创工具
- 三级网络技术通关指南
- python考勤记录_python做考勤统计
- 小米路由器显示DNS服务器设置错误,小米路由器dns地址怎么设置
- 微信小程序获取二维码:报错47001 data format error
- 生物信息数据格式:fastq格式
- android 复制assets,Android复制Assets目录下的文件到指定目录
- 【全部译文】Deep-Waveform: A Learned OFDM Receiver Based on Deep Complex Convolutional Networks
- plc控制电机实验报告_五相十拍步进电动机控制-PLC课程实验报告