MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾

简介: MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾

一、需求分析

最近用MASM32编程更新SysInfo,增加对IPv6连接信息的收集功能,其中涉及到 MIB_TCP6ROW_OWNER_MODULE 结构体:

;typedef struct _MIB_TCP6ROW_OWNER_MODULE {
;  UCHAR         ucLocalAddr[16];
;  DWORD         dwLocalScopeId;
;  DWORD         dwLocalPort;
;  UCHAR         ucRemoteAddr[16];
;  DWORD         dwRemoteScopeId;
;  DWORD         dwRemotePort;
;  DWORD         dwState;
;  DWORD         dwOwningPid;
;  LARGE_INTEGER liCreateTimestamp;
;  ULONGLONG     OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
;} MIB_TCP6ROW_OWNER_MODULE, *PMIB_TCP6ROW_OWNER_MODULE;
 
MIB_TCP6ROW_OWNER_MODULE STRUCT
  ucLocalAddr     UCHAR 16 dup (?) 
  dwLocalScopeId  DWORD ?
  dwLocalPort     DWORD ?
  ucRemoteAddr  UCHAR 16 dup (?)
  dwRemoteScopeId DWORD ?
  dwRemotePort  DWORD ?
  dwState         DWORD ?
  dwOwningPid     DWORD ?
  liCreateTimestamp LARGE_INTEGER <>
  OwningModuleInfo  ULONGLONG TCPIP_OWNING_MODULE_SIZE dup(?)
MIB_TCP6ROW_OWNER_MODULE ENDS
PMIB_TCP6ROW_OWNER_MODULE typedef ptr MIB_TCP6ROW_OWNER_MODULE
;typedef struct _MIB_TCP6TABLE_OWNER_MODULE {
;  DWORD                    dwNumEntries;
;  MIB_TCP6ROW_OWNER_MODULE table[ANY_SIZE];
;} MIB_TCP6TABLE_OWNER_MODULE, *PMIB_TCP6TABLE_OWNER_MODULE;
 
MIB_TCP6TABLE_OWNER_MODULE STRUCT
  dwNumEntries DWORD  ?
    table        MIB_TCP6ROW_OWNER_MODULE ANY_SIZE dup(<?>)
MIB_TCP6TABLE_OWNER_MODULE ENDS 
PMIB_TCP6TABLE_OWNER_MODULE typedef ptr MIB_TCP6TABLE_OWNER_MODULE

其中的成员

    ucLocalAddr     UCHAR    16 dup (?) 
    ucRemoteAddr    UCHAR    16 dup (?)

其值是IPv6格式的IP地址,需要转换成字符串。微软官网上提到可以使用API函数RtlIpv6AddressToString()来完成这个转换:

RtlIpv6AddressToString is a convenience function that does not require that the Windows Sockets DLL be loaded to access a function provided in Windows Sockets to perform IP address to string conversion.

RtlIpv6AddressToString 是一个方便的函数,它不需要加载 Windows 套接字 DLL 来访问 Windows 套接字中提供的函数来执行 IP 地址到字符串的转换。

用grep命令搜索了MASM32安装文件夹中includes文件夹中的.inc文件,发现有以下.inc文件包含了RtlIpv6AddressToString函数的声明:

\masm32\include\dnslib.inc

\masm32\include\ntdll.inc

\masm32\include\ntoskrnl.inc

\masm32\include\wdmsec.inc

image.png

二、代码在Windows 10上汇编连接运行正常

编写了调用代码:

include    \masm32\include\ntoskrnl.inc ;RtlIpv6AddressToStringA
includelib \masm32\lib\ntoskrnl.lib

.code

; Get Local Addr ip
mov    esi, pTable
invoke RtlIpv6AddressToString, addr (MIB_TCP6ROW_OWNER_MODULE ptr [esi]).ucLocalAddr, offset g_szBuf128a    

代码在使用Windows 10的电脑上汇编、连接、运行正常: image.png

三、代码在Windows 7 上汇编连接成功,运行出错

但是把生成的EXE程序复制到使用Windows 7的电脑上运行,就出错:

把程序源代码复制到使用Windows 7的电脑上,汇编连接都行,但是运行时仍然出现上面的故障。

四、换文件头测试

那就换个头文件来试试:

(一)dnslib

include \masm32\include\dnslib.inc

includelib \masm32\lib\dnslib.lib

在windows 10 和 windows 7上可以顺利完成汇编、连接,但运行时均提示:

image.png

二)wdmsec

include \masm32\include\wdmsec.inc

includelib \masm32\lib\wdmsec.lib

在windows 10 和 windows 7上汇编时出错:

***********

ASCII build

***********

----------------------------------------

WARNING Duplicate include file winextra.inc

----------------------------------------

\masm32\include\wdnsec.inc(1511)  : error A2111: conflicting parameter definition

\masm32\include\wdnsec.inc(1511) : error A2112: PROC and prototype calling corventions conflict

\masm32\include\wdmsec.inc(1513) : error A2111: conflicting parameter definition

\masm32\include\wdmsec.inc(1513) : error A2112: PROC and prototype callig conventions conflict

\masm32\include\wdmsec.inc(1516) : error A2111: conflicting parameter definition

\Masm32\include\wdmsec.inc(1516) : error A2112: PROC and prototype callig conventions conflict

Assembly Error

请按任意键继续. . .

image.png

三)ntdll

include    \masm32\include\ntdll.inc    ;RtlIpv6AddressToStringA

includelib \masm32\lib\ntdll.lib

在windows 10 和 windows 7上可以顺利完成汇编、连接和运行。

image.png

在Windows 7中,对网络连接关连进程信息获取和显示得要比Windows 10中完善。

五、跳过头文件,自己GetModuleHandle 和 GetProcAddress 后调用

微软网站也提到:

An application could also use the  GetModuleHandle and  GetProcAddress functions to retrieve the function pointer from the Ntdll.dll and call this function.

应用程序还可以使用 GetModuleHandle 和 GetProcAddress 函数从 Ntdll 检索函数指针.dll并调用此函数。

相关的代码的代码如下:

;ssssssssssssssssssssssssssssssssssssssssssssssssssss
;proto
;ssssssssssssssssssssssssssssssssssssssssssssssssssss
 
_RtlIpv6AddressToString    TYPEDEF proto :DWORD, :DWORD
 
lpfnRtlIpv6AddressToString TYPEDEF ptr _RtlIpv6AddressToString
 
 
;ssssssssssssssssssssssssssssssssssssssssssssssssssss
.data
;ssssssssssssssssssssssssssssssssssssssssssssssssssss
 
g_szNtDll db "Ntdll.dll", 0 ;20230828 Added
g_szRtlIpv6AddressToString db "RtlIpv6AddressToStringA", 0  ;20230828 Added
g_lpfnRtlIpv6AddressToString  lpfnRtlIpv6AddressToString  NULL  ;20230828 Added
 
 
;ssssssssssssssssssssssssssssssssssssssssssssssssssss
.code
;ssssssssssssssssssssssssssssssssssssssssssssssssssss
  ;……其它代码
 
   invoke  GetModuleHandle, offset g_szNtDll
   .if eax !=NULL
       invoke GetProcAddress, eax, OFFSET g_szRtlIpv6AddressToString
       .if eax!=NULL
           mov g_lpfnRtlIpv6AddressToString, eax
       .endif
   .endif
 
  ;……其它代码
 
 
        ; Get Local Addr ip
        ;mov    esi, pTable
        ;invoke RtlIpv6AddressToString, addr (MIB_TCP6ROW_OWNER_MODULE ptr [esi]).ucLocalAddr, offset g_szBuf128a     
 
        .if g_lpfnRtlIpv6AddressToString != NULL ;20230828 Added
            mov    esi, pTable        
            invoke g_lpfnRtlIpv6AddressToString, addr (MIB_TCP6ROW_OWNER_MODULE ptr [esi]).ucLocalAddr, offset g_szBuf128a
        .else
            mov byte ptr g_szBuf128a, 0
        .endif
 
  ;……其它代码
 
 
        ; Get remote Addr IP
        ;mov    esi, pTable
        ;invoke RtlIpv6AddressToString, addr (MIB_TCP6ROW_OWNER_MODULE ptr [esi]).ucLocalAddr, offset g_szBuf128b  
 
        .if g_lpfnRtlIpv6AddressToString != NULL
            mov    esi, pTable        
            invoke g_lpfnRtlIpv6AddressToString, addr (MIB_TCP6ROW_OWNER_MODULE ptr [esi]).ucRemoteAddr, offset g_szBuf128b
 
        .else
            mov byte ptr g_szBuf128b, 0
        .endif 
 

六、参考资料

RtlIpv6AddressToString

七、其它问题

RtlIpv6AddressToString函数支持的最低客户端是 Windows Vista,支持的最低服务器 Windows Server 2008,在Windows XP上用不了。

相关文章
|
3月前
|
Windows
[原创]用MASM32编程获取windows类型
[原创]用MASM32编程获取windows类型
|
3月前
|
JavaScript 前端开发 API
MASM32编程通过WMI获取Windows计划任务
MASM32编程通过WMI获取Windows计划任务
|
2月前
|
IDE API 定位技术
Python--API编程:IP地址翻译成实际的物理地址
Python--API编程:IP地址翻译成实际的物理地址
63 0
|
3月前
|
存储 程序员 API
【收藏】非API函数检测操作系统类型
【收藏】非API函数检测操作系统类型
|
3月前
|
API Windows
MASM32编程获取Windows当前桌面主题名
MASM32编程获取Windows当前桌面主题名
|
4月前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
310 0
|
25天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
28天前
|
监控 安全 网络安全
使用EventLog Analyzer日志分析工具监测 Windows Server 安全威胁
Windows服务器面临多重威胁,包括勒索软件、DoS攻击、内部威胁、恶意软件感染、网络钓鱼、暴力破解、漏洞利用、Web应用攻击及配置错误等。这些威胁严重威胁服务器安全与业务连续性。EventLog Analyzer通过日志管理和威胁分析,有效检测并应对上述威胁,提升服务器安全性,确保服务稳定运行。
|
1月前
|
监控 安全 网络安全
Windows Server管理:配置与管理技巧
Windows Server管理:配置与管理技巧
71 3
|
1月前
|
存储 安全 网络安全
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。