• 从编写TcpStatC谈c++代码改写为masm32代码的两个需要注意的地方


    2012写的netViewG,因为该程序所调用的Windows API 函数在Windows 7以上系统不再支持,所以只能在Windows XP下运行,为了更新它,需要重新用新的Windows API来重写。

    首先参考了微软官网MIB_TCPTABLE (tcpmib.h) - Win32 apps | Microsoft Docshttps://docs.microsoft.com/en-us/windows/win32/api/tcpmib/ns-tcpmib-mib_tcptable上的公开的例子,把它用MASM32代码来实现为TcpStatC.asm,主要功能是显示当前的的 TCP 连接数量,以及每个连接的本地IP地址:端口、远程IP地址:端口和状态。

    文件信息如下:

    文件说明符 : K:\TcpStatC.exe
    属性 : A---
    数字签名:否
    PE文件:是
    创建时间 : 2022-7-31 0:6:2
    修改时间 : 2022-7-31 17:29:23
    大小 : 4096 字节 4.0 KB
    MD5 : 88bba78a2dcb50633fa9b61c408bcf8f
    SHA1: 91C6B6B531BE9A082641249910035C46B39D6D3B
    CRC32: 67fb983f

    运行效果如下:

    跟 netstat命令执行的结果是相似的:

    虽然都是定义数据结构和调用Windows API,但在转换过程中,由于MASM32的一些特性,有几处代码并不能转换,整理如下:

    一、结构体的转换

    以MIB_TCPROW为例,c++的定义如下:

    1. typedef struct _MIB_TCPROW {
    2. union {
    3. DWORD dwState;
    4. MIB_TCP_STATE State;
    5. };
    6. DWORD dwLocalAddr;
    7. DWORD dwLocalPort;
    8. DWORD dwRemoteAddr;
    9. DWORD dwRemotePort;
    10. } MIB_TCPROW, *PMIB_TCPR

    转换成MASM32代码的理论定义如下:

    1. MIB_TCPROW struct
    2. union
    3. dwState DWORD ?
    4. State MIB_TCP_STATE ?
    5. ends
    6. dwLocalAddr DWORD ?
    7. dwLocalPort DWORD ?
    8. dwRemoteAddr DWORD ?
    9. dwRemotePort DWORD ?
    10. MIB_TCPROW ends
    11. PMIB_TCPROW typedef ptr MIB_TCPROW

    但是用这个定义来对另外一个结构体MIB_TCPTABLE进行定义会出现问题。

    MIB_TCPTABLE结构体的c++定义代码为:

    1. typedef struct _MIB_TCPTABLE {
    2. DWORD dwNumEntries;
    3. MIB_TCPROW table[ANY_SIZE];
    4. } MIB_TCPTABLE, *PMIB_TCPTABLE;

    转换为MASM32定义代码为:

    1. MIB_TCPTABLE struct
    2. dwNumEntries DWORD ?
    3. table MIB_TCPROW ANY_SIZE dup(<?>)
    4. MIB_TCPTABLE ends

    由于MIB_TCPTABLE的成员table的类型是结构体MIB_TCPROW,在汇编过程中将会收到两个错误:

    TcpStatC.asm(94) : error A2138: invalid data initializer
    TcpStatC.asm(94) : error A2036: too many initial values for structure

    解决的办法是采用下面的代码来定义结构体MIB_TCPROW:

    1. MIB_TCPROW struct
    2. ;union
    3. dwState DWORD ?
    4. ;State MIB_TCP_STATE ?
    5. ;ends
    6. dwLocalAddr DWORD ?
    7. dwLocalPort DWORD ?
    8. dwRemoteAddr DWORD ?
    9. dwRemotePort DWORD ?
    10. MIB_TCPROW ends
    11. PMIB_TCPROW typedef ptr MIB_TCPROW

    因为我们在程序中实际上只访问了MIB_TCPROW结构体中的成员dwState,没有用到成员State。

    二、获取和输出本地和远程IP地址和端口,以本地IP地址和端口为例

    示例中的c++代码如下:

    1. IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwLocalAddr;
    2. strcpy_s(szLocalAddr, sizeof (szLocalAddr), inet_ntoa(IpAddr));
    3. printf("\tTCP[%d] Local Addr: %s\n", i, szLocalAddr);
    4. printf("\tTCP[%d] Local Port: %d \n", i,
    5. ntohs((u_short)pTcpTable->table[i].dwLocalPort));

    转换为MASM32代码中没有一对一转换,而是用了以下代码:

    1. GetIp proc ipaddr: dword, pIP: LPSTR
    2. local nipaddr: dword
    3. ;pushad
    4. invoke htonl, ipaddr
    5. mov ebx, eax
    6. mov ecx, eax
    7. mov edx, eax
    8. and eax, 0ffh
    9. shr ebx, 8
    10. and ebx, 0ffh
    11. shr ecx, 16
    12. and ecx, 0ffh
    13. shr edx, 24
    14. and edx, 0ffh
    15. invoke wsprintf, pIP, addr g_szFmtIP, edx, ecx, ebx, eax
    16. ;popad
    17. ret
    18. GetIp endp
    19. getPort proc
    20. ;invoke printEax
    21. invoke ntohs, eax
    22. movzx eax, ax
    23. ;invoke printEax
    24. ret
    25. getPort endp
    26. ……
    27. ; Get Local port
    28. mov eax, (MIB_TCPROW ptr [esi]).dwLocalPort
    29. invoke getPort
    30. mov dwPort, eax
    31. ; Get Local Addr ip
    32. ;mov esi, pTable
    33. invoke GetIp, (MIB_TCPROW ptr [esi]).dwLocalAddr, offset g_szBuf128a
    34. ; Print NO-TCP-LocalAddrIp:Port
    35. pop eax
    36. push eax
    37. inc eax
    38. invoke wsprintf, offset g_szBuf128b, offset g_szFmtNoTcpLocalAddrPort\
    39. , eax, offset g_szBuf128a, dwPort
    40. invoke StdOut, offset g_szBuf128b

  • 相关阅读:
    Linux之 4 种休眠模式
    通俗易懂,一文学会前端缓存
    大数据热点城市波动图案例【CSS3实现 + 原理分析 + 源码获取】
    Message Bus & Solace Deeper Dive
    基因组 DNA 分离丨Worthington核糖核酸酶A
    机器学习模型,超级全面总结!
    SOCKS55代理 VS Http代理,如何选择?
    JavaScript-桥接模式
    C++重新入门-string容器
    web前端——HTML+CSS实现九宫格
  • 原文地址:https://blog.csdn.net/Purpleendurer/article/details/126088263