再谈进程与端口的映射

端口检测工具:Fport.exe 端口检测工具,主要用于检测本地计算机网络端口号是有哪些应用程序打开的! 立即下载

再谈进程与端口的映射


创建时间:2002-02-05
文章属性:原创
文章来源: www.whitecell.org
文章提交: ILSY (masteruser_at_263.net)

Author  : ilsy
Email   : ilsy@whitecell.org
HomePage: http://www.whitecell.org

日  期:2002-02-06
类  别:安全
关键字:进程 PDE PTE 分页 内核对象 线性地址 物理地址


    关于进程与端口映射的文章已经有很多了,我把我对fport的分析也写出来,让大家知道fport是如何工作的.
fport.exe是由foundstone team出品的免费软件,可以列出系统中所有开放的端口都是由那些进程打开的.而下
面所描述的方法是基于fport v1.33的,如果和你机器上的fport有出入,请检查fport版本.

    首先,它检测当前用户是否拥有管理员权限(通过读取当前进程的令牌可知当前用户是否具有管理权限,请参考
相关历程),如果没有,打印一句提示后退出,然后设置当前进程的令牌,接着,用ZwOpenSection函数打开内核对象
/Device/PhysicalMemory,这个对象用于对系统物理内存的访问.ZwOpenSection函数的原型如下:

NTSYSAPI
NTSTSTUS
NTAPI
ZwOpenSection(
    Out PHANDLE sectionHandle;
    IN ACCESS_MASK DesiredAccess;
    IN POBJECT_ATTRIBUTES ObjectAttributes
    };
(见ntddk.h)

第一个参数得到函数执行成功后的句柄
第二个参数DesiredAccess为一个常数,可以是下列值:
    #define SECTION_QUERY       0x0001
    #define SECTION_MAP_WRITE   0x0002
    #define SECTION_MAP_READ    0x0004
    #define SECTION_MAP_EXECUTE 0x0008
    #define SECTION_EXTEND_SIZE 0x0010

    #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|/
                            SECTION_MAP_WRITE |      /
                            SECTION_MAP_READ |       /
                            SECTION_MAP_EXECUTE |    /
                            SECTION_EXTEND_SIZE)
    (见ntddk.h)
第三个参数是一个结构,包含要打开的对象类型等信息,结构定义如下:
    typedef struct _OBJECT_ATTRIBUTES {
        ULONG Length;
        HANDLE RootDirectory;
        PUNICODE_STRING ObjectName;
        ULONG Attributes;
        PVOID SecurityDescriptor;        // Points to type SECURITY_DESCRIPTOR
        PVOID SecurityQualityOfService;  // Points to type SECURITY_QUALITY_OF_SERVICE
    } OBJECT_ATTRIBUTES;
    typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
    (见ntdef.h)
对于这个结构的初始化用一个宏完成:
    #define InitializeObjectAttributes( p, n, a, r, s ) { /
        (p)->Length = sizeof( OBJECT_ATTRIBUTES );          /
        (p)->RootDirectory = r;                             /
        (p)->Attributes = a;                                /
        (p)->ObjectName = n;                                /
        (p)->SecurityDescriptor = s;                        /
        (p)->SecurityQualityOfService = NULL;               /
        }
    (见ntdef.h)
那么,打开内核对象/Device/PhysicalMemory的语句如下:
WCHAR    PhysmemName[] =        L"//Device//PhysicalMemory";
void *  pMapPhysicalMemory;
HANDLE  pHandle;

bool    OpenPhysicalMemory()
{
    NTSTATUS    status;
    UNICODE_STRING    physmemString;
    OBJECT_ATTRIBUTES attributes;
    RtlInitUnicodeString( &physmemString, PhysmemName ); //初始化Unicode字符串,函数原型见ntddk.h    
    InitializeObjectAttributes( &attributes, &physmemString,
                     OBJ_CASE_INSENSITIVE, NULL, NULL ); //初始化OBJECT_ATTRIBUTES结构
    status = ZwOpenSection(pHandle, SECTION_MAP_READ, &attributes ); //打开内核对象/Device/PhysicalMemory,获得句柄
    if( !NT_SUCCESS( status ))
        return false;
    pMapPhysicalMemory=MapViewOfFile(pHandle,FILE_MAP_READ,
                           0,0x30000,0x1000);
    //从内存地址0x30000开始映射0x1000个字节
    if( GetLastError()!=0)
        return false;                     
    return true;
}

    为什么要从0x30000开始映射呢,是这样,我们知道,在Windows NT/2000下,系统分为内核模式和用户模式,也就是我们
所说的Ring0和Ring3,在Windows NT/2000下,我们所能够看到的进程都运行在Ring3下,一般情况下,系统进程(也就是System
进程)的页目录(PDE)所在物理地址地址为0x30000,或者说,系统中最小的页目录所在的物理地址为0x30000.而页目录(PDE)由
1024项组成,每项均指向一页表(PTE),每一页表也由1024个页组成,而每页的大小为4K,1024*4=4096(0x1000),所以,上面从物
理地址0x30000开始映射了0x1000个字节.(具体描述见WebCrazy的文章<<小议Windows NT/2000的分页机制>>)

    程序打开打开内核对象/Device/PhysicalMemory后,继续用函数ZwOpenFile打开内核对象/Device/Tcp和Device/Udp,ZwOpenFile
函数的原型如下:
NTSYSAPI
NTSTATUS
NTAPI
ZwOpenFile(
    OUT PHANDLE FileHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN ULONG ShareAccess,
    IN ULONG OpenOptions
    );
(见ntddk.h)

第一个参数返回打开对象的句柄
第二个参数DesiredAccess为一个常数,可以是下列值:
    #define FILE_READ_DATA            ( 0x0001 )    // file & pipe
    #define FILE_LIST_DIRECTORY       ( 0x0001 )    // directory
    #define FILE_WRITE_DATA           ( 0x0002 )    // file & pipe
    #define FILE_ADD_FILE             ( 0x0002 )    // directory
    #define FILE_APPEND_DATA          ( 0x0004 )    // file
    #define FILE_ADD_SUBDIRECTORY     ( 0x0004 )    // directory
    #define FILE_CREATE_PIPE_INSTANCE ( 0x0004 )    // named pipe
    #define FILE_READ_EA              ( 0x0008 )    // file & directory
    #define FILE_WRITE_EA             ( 0x0010 )    // file & directory
    #define FILE_EXECUTE              ( 0x0020 )    // file
    #define FILE_TRAVERSE             ( 0x0020 )    // directory
    #define FILE_DELETE_CHILD         ( 0x0040 )    // directory
    #define FILE_READ_ATTRIBUTES      ( 0x0080 )    // all
    #define FILE_WRITE_ATTRIBUTES     ( 0x0100 )    // all
    #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
    #define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ     |/
                                       FILE_READ_DATA           |/
                                       FILE_READ_ATTRIBUTES     |/
                                       FILE_READ_EA             |/
                                       SYNCHRONIZE)
    #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |/
                                       FILE_WRITE_DATA          |/
                                       FILE_WRITE_ATTRIBUTES    |/
                                       FILE_WRITE_EA            |/
                                       FILE_APPEND_DATA         |/
                                       SYNCHRONIZE)
    #define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE  |/
                                       FILE_READ_ATTRIBUTES     |/
                                       FILE_EXECUTE             |/
                                       SYNCHRONIZE)
        (见ntdef.h)
第三个参数是一个结构,包含要打开的对象类型等信息,结构定义见上面所述
第四个参数返回打开对象的属性,是一个结构,定义如下:
    typedef struct _IO_STATUS_BLOCK {
        union {
            NTSTATUS Status;
            PVOID Pointer;
        };

        ULONG_PTR Information;
    } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

    #if defined(_WIN64)
    typedef struct _IO_STATUS_BLOCK32 {
        NTSTATUS Status;
        ULONG Information;
    } IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
    #endif
    (见ntddk.h)
第五个参数ShareAccess是一个常数,可以是下列值:
    #define FILE_SHARE_READ                 0x00000001  // winnt
    #define FILE_SHARE_WRITE                0x00000002  // winnt
    #define FILE_SHARE_DELETE               0x00000004  // winnt
    (见ntddk.h)
第六个参数OpenOptions也是一个常数,可以是下列的值:
    #define FILE_DIRECTORY_FILE                     0x00000001
    #define FILE_WRITE_THROUGH                      0x00000002
    #define FILE_SEQUENTIAL_ONLY                    0x00000004
    #define FILE_NO_INTERMEDIATE_BUFFERING          0x00000008
    #define FILE_SYNCHRONOUS_IO_ALERT               0x00000010
    #define FILE_SYNCHRONOUS_IO_NONALERT            0x00000020
    #define FILE_NON_DIRECTORY_FILE                 0x00000040
    #define FILE_CREATE_TREE_CONNECTION             0x00000080
    #define FILE_COMPLETE_IF_OPLOCKED               0x00000100
    #define FILE_NO_EA_KNOWLEDGE                    0x00000200
    #define FILE_OPEN_FOR_RECOVERY                  0x00000400
    #define FILE_RANDOM_ACCESS                      0x00000800
    #define FILE_DELETE_ON_CLOSE                    0x00001000
    #define FILE_OPEN_BY_FILE_ID                    0x00002000
    #define FILE_OPEN_FOR_BACKUP_INTENT             0x00004000
    #define FILE_NO_COMPRESSION                     0x00008000
    #define FILE_RESERVE_OPFILTER                   0x00100000
    #define FILE_OPEN_REPARSE_POINT                 0x00200000
    #define FILE_OPEN_NO_RECALL                     0x00400000
    #define FILE_OPEN_FOR_FREE_SPACE_QUERY          0x00800000
    #define FILE_COPY_STRUCTURED_STORAGE            0x00000041
    #define FILE_STRUCTURED_STORAGE                 0x00000441
    #define FILE_VALID_OPTION_FLAGS                 0x00ffffff
    #define FILE_VALID_PIPE_OPTION_FLAGS            0x00000032
    #define FILE_VALID_MAILSLOT_OPTION_FLAGS        0x00000032
    #define FILE_VALID_SET_FLAGS                    0x00000036
    (见ntddk.h)
        
那么,打开内核对象/Device/Tcp和/Device/Udp的语句如下:    
WCHAR physmemNameTcp[]=L"//Device//TCP";
WCHAR physmemNameUdp[]=L"//Device//UDP";
HANDLE pTcpHandle;
HANDLE pUdpHandle;

HANDLE OpenDeviceTcpUdp(WCHAR * deviceName)
{
    NTSTATUS    status;
    UNICODE_STRING    physmemString;
    OBJECT_ATTRIBUTES attributes;
    IO_STATUS_BLOCK iosb;
    HANDLE pDeviceHandle;

    RtlInitUnicodeString(&physmemString, deviceName);    
    if(GetLastError()!=0)
        return NULL;
    InitializeObjectAttributes( &attributes,&physmemString,
                            OBJ_CASE_INSENSITIVE,0, NULL );
    status = ZwOpenFile ( &pDeviceHandle,0x100000, &attributes, &iosb, 3,0);
    if( !NT_SUCCESS( status ))
        return NULL;
}

    接着,程序用ZwQuerySystemInformation函数获得系统当前所以进程的所建立的句柄及其相关信息,函数的原型如下:
NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemInformation(
    IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
    IN OUT PVOID SystemInformation,
    IN ULONG SystemInformationLength,
    OUT PULONG ReturnLength OPTIONAL
    };
(这个函数结构Microsoft没有公开,参见Gary Nebbett<<Windows NT/2000 Native API Reference>>)

第一个参数是一个枚举常数,设置要查询的系统信息类型,ZwQuerySystemInformation支持54个系统信息的查询,我们要用到的
是它的第16号功能,进行SystemHandleInformation查询.
SYSTEM_HANDLE_INFORMATION结构定义如下:
    typedef struct _SYSTEM_HANDLE_INFORMATION{
        ULONG ProcessID;        //进程的标识ID
        UCHAR ObjectTypeNumber;        //对象类型
        UCHAR Flags;             //0x01 = PROTECT_FROM_CLOSE,0x02 = INHERIT
        USHORT Handle;             //对象句柄的数值
        PVOID  Object;            //对象句柄所指的内核对象地址
        ACCESS_MASK GrantedAccess;      //创建句柄时所准许的对象的访问权
    }SYSTEM_HANDLE_INFORMATION, * PSYSTEM_HANDLE_INFORMATION;
    (这个函数结构Microsoft没有公开,参见Gary Nebbett<<Windows NT/2000 Native API Reference>>)
第二个参数输出查询的结果
第三个参数设置缓冲区的长度
第四个参数返回函数正确执行需要的缓冲区的大小
代码如下:
#define SystemHandleInformation 16
PULONG GetHandleList()
{
    ULONG cbBuffer = 0x1000;    //先设定一个较小的缓冲空间
    PULONG pBuffer = new ULONG[cbBuffer]; //分配内存
    NTSTATUS Status;

    do
        {
        Status = ZwQuerySystemInformation(
                    SystemHandleInformation,
                    pBuffer, cbBuffer * sizeof * pBuffer, NULL);

        if (Status == STATUS_INFO_LENGTH_MISMATCH)
        {
            //如果返回的错误信息为缓冲区长度不够,那么重新分配内存
            delete [] pBuffer;
            pBuffer = new ULONG[cbBuffer *= 2];
        }
        else if (!NT_SUCCESS(Status))
        {
            //如果是其他错误信息,返回
            delete [] pBuffer;
            return false;
        }
        }
        while (Status == STATUS_INFO_LENGTH_MISMATCH);
    return pBuffer;
}

因为如果一个进程打开了端口,那么它肯定会建立类型为/Device/Tcp和/Device/Udp的内核对象,所以,我们在当前进程中打开
上述的两个内核对象,在打开的同时保存了打开的句柄,这样,我们可以在上面获得的句柄列表中的当前进程中查找对象句柄的
数值和我们保存的两个打开的内核对象的句柄数值相同的句柄,并得到其句柄所指向的内核对象的地址.代码如下:
DWORD TcpHandle;
DWORD UdpHandle;
DWORD GetTcpUdpObject(PULONG pBuffer,HANDLE pHandle,DWORD ProcessId)
{
    DWORD objTYPE1,objTYPE2,HandleObject;

    PSYSTEM_HANDLE_INFORMATION pProcesses = (PSYSTEM_HANDLE_INFORMATION)(pBuffer+1);
  
    for (i=0;i< * pBuffer;i++)
    {
        if ((pProcesses[i].ProcessID) == ProcessId)
        {
            objTYPE1 = (DWORD)hDeviceTcpUdp;
            objTYPE2 = (DWORD)pProcesses[i].Handle;
            if(objTYPE1==objTYPE2)
            {
                HandleObject = (DWORD)pProcesses.Object;
                return HandleObject;
        }
    }
    return 0;
}

这个内核对象地址是一个线性地址,我们需要把这个地址转换为物理地址,并得到一些相关的数据.在fport中,换算是这样进行的:
(具体描述见WebCrazy的文章<<小议Windows NT/2000的分页机制>>)
void * NewmapPhy;

void GetPTE(DWORD objAddress)
{
    DWORD physmemBuff;
    DWORD newAddress1,newAddress2,newAddress3,newAddress4;
    DWORD * newAddress;

    physmemBuff = (DWORD)pMapPhysicalMemory;
    newAddress1 = physmemBuff+(objAddress>>0x16)*4;
    newAddress = (DWORD *)newAddress1;
    newAddress1 = * newAddress;
    newAddress2 = objAddress & 0x3FF000;
    newAddress3 = newAddress1 & 0x0FFFFF000;
    newAddress4 = newAddress2 + newAddress3;
    NewmapPhy = MapViewOfFile(ghPhysicalMemory,FILE_MAP_READ,0,newAddress4,0x1000);
    //重新映射物理内存,得到当前线性地址所指向的PTE的物理地址内容
}

然后在根据内核对象的线性地址得到这个地址所指向的物理页,得到体现当前内核对象内容的页,其结构如下:
typedef struct {
    ULONG Present;
    ULONG WriteTable;
    ULONG User;
    ULONG WriteThru;
    ULONG NoCache;
    ULONG Accessed;
    ULONG Dirty;
    ULONG PageSize;
    ULONG Global;
    ULONG Available;
    ULONG Pfn;
} PTE, *PPTE;
(注:我不能保证这个结构的正确性,但我们只会用到其中的两个值,对程序来说,这个结构是可以工作的,^_^)
代码如下:
ULONG CurrWriteTable;
ULONG NoCache;

void GetMustPar(DWORD objAddress)
{
    DWORD CurrAddress;
    CurrAddress = objAddress & 0xFFF;
    PPTE pte = (PPTE)(VOID *)((DWORD)NewmapPhy+CurrAddress);
    CurrWriteTable = pte->WriteTable;
    CurrNoCache = Pte->NoCache;
}

好了,我们现在想要得到的都已经得到了,下面需要做的是遍历进程,用每一个进程中的每一个句柄(呵呵,不是每一个句柄,
在Windows NT下,/Device/Tcp和/Device/Udp的句柄类型值为0x16,在Windows 2000下这个值为0x1A)的核心地址用上面所描
述的办法得到其PTE内容,得到其WriteTable值,如果与内核对象/Device/Tcp和/Device/Udp相等,那么这个句柄就有可能打开
了一个端口,再对这个句柄进行确认,就可以了.确认的代码如下:
typedef struct _TDI_CONNECTION_INFO {
    ULONG          State;
    ULONG          Event;
    ULONG          TransmittedTsdus;
    ULONG          ReceivedTsdus;
    ULONG          TransmissionErrors;
    ULONG          ReceiveErrors;
    LARGE_INTEGER  Throughput;
    LARGE_INTEGER  Delay;
    ULONG          SendBufferSize;
    ULONG          ReceiveBufferSize;
    BOOLEAN        Unreliable;
} TDI_CONNECTION_INFO, *PTDI_CONNECTION_INFO;

typedef struct _TDI_CONNECTION_INFORMATION {
    LONG   UserDataLength;
    PVOID  UserData;
    LONG   OptionsLength;
    PVOID  Options;
    LONG   RemoteAddressLength;
    PVOID  RemoteAddress;
} TDI_CONNECTION_INFORMATION, *PTDI_CONNECTION_INFORMATION;
(以上结构见tdi.h)

void GetOpenPort(DWORD dwProcessesID,USHORT Handle,int NoCache)
//dwProcessesID为进程标识ID
//Handle为进程打开的句柄,并且经过比较为/Device/Tcp或/Device/Udp类型
//NoCache为PTE结构中的一个值
{
    HANDLE hProc,DupHandle=NULL;
    HANDLE hEven=NULL;
        OVERLAPPED overlap;
    u_short openport;
    int i=0;
    char procName[256]={0};
    int  portflag=0;

    overlap.Internal = 0;
    overlap.InternalHigh = 0;
    overlap.Offset = 0;
    overlap.OffsetHigh = 0;
    hEven=CreateEvent(0,1,0,0);
    overlap.hEvent = hEven;

    hProc = OpenProcess(PROCESS_DUP_HANDLE,
                        0,
                        dwProcessesID);
    if(hProc)
    {
        DuplicateHandle(hProc,
                        (HANDLE)Handle,
                        GetCurrentProcess(),
                        &DupHandle,
                        0,
                        FALSE,
                        2);
        CloseHandle( hProc );
        if(DupHandle)
        {
            TDI_CONNECTION_INFO    TdiConnInfo={0};
            TDI_CONNECTION_INFORMATION TdiConnInformation={0};
            DWORD dwRetu=0;    

            if(NoCache==0x2)
            {
                TdiConnInformation.RemoteAddressLength= 4;
                if(DeviceIoControl(DupHandle,0x210012,
                            &TdiConnInformation,sizeof(TdiConnInformation),
                            &TdiConnInfo,sizeof(TdiConnInfo),
                            0,&overlap))
                //进行TDI查询,得到连接的相关信息
                {
                    openport = ntohs((u_short)TdiConnInfo.ReceivedTsdus);
                    procname = GetProcName(dwProcessesID);  //得到进程标识ID的进程名称
                    printf("PID = %4d ProcessName = %15s PORT = %4d/n",dwProcessesID,procName,openport);
                }
            }
            if(NoCache==0x1)
            {
                TdiConnInformation.RemoteAddressLength= 3;
                if(DeviceIoControl(DupHandle,0x210012,
                            &TdiConnInformation,sizeof(TdiConnInformation),
                            &TdiConnInfo,sizeof(TdiConnInfo),
                            0,&overlap))
                //进行TDI查询,得到连接的相关信息
                {
                    openport = ntohs((u_short)TdiConnInfo.ReceivedTsdus);
                    procname = GetProcName(dwProcessesID);  //得到进程标识ID的进程名称
                    printf("PID = %4d ProcessName = %15s PORT = %4d/n",dwProcessesID,procName,openport);
                }
            }
        }
    }
    CloseHandle(hEven);
    CloseHandle(DupHandle);
}

以上是我对fport.exe的分析及其实现代码,演示程序可以从whitecell.org下载,如果你发现有问题,请通知我,^_^ 
fport.exe查看本地使用的端口及程序 fport.exe用于查看本地已使用的端口及哪个程序正在使用! 立即下载

相关推荐

易语言-易语言API调用TCP/UDP查看IP地址IP端口和进程ID的例子

本例子讲解API调用GetExtendedTcpTable和GetExtendedUdpTable实现查看本地连接的TCP和UDP的IP地址IP端口和所占用的进程ID,用途广泛,懂的人自然懂,不多解释。 GetExtendedTcpTable与 GetTcpTable GetTcpTable2 AllocateAndGetTcpExTableFromStack 写法和读法基本一致。 而InternalGetUdpTableWithOwnerPid和AllocateAndGetUdpExTableFromStack不支持查询连接外网的IP 发现只有GetExtendedUdpTable能读外网IP地址但读法还和TCP的不一样,而用网截支持库又太麻烦还容易报毒。

windows vc++通过tcp、udp端口号获取对应进程的id和名称

1、process_net_info.h头文件 #pragma once #include <Windows.h> #include <iostream> #include <vector> enum TcpOrUdp { TcpType, UdpType }; //=====================================================================================// //Nam

qq_37243144的博客 1272

易语言AllocateAndGetUdpTCPExTableFromStack

AllocateAndGetUdpTCPExTableFromStack系统结构:GetProcessHeap,AllocateAndGetTcpExTableFromStack,AllocateAndGetUdpExTableFromStack,======窗口程序集1||||------__启动窗口_创建完毕||||======调用的Dll||||---[dll]------GetProces

(转载)再谈进程与端口的映射

再谈进程与端口的映射创建时间:2002-02-05文章属性:原创文章来源:www.whitecell.org文章提交:ILSY (masteruser_at_263.net)Author  : ilsy Email   : ilsy@whitecell.org HomePage: http://www.whitecell.org 日  期:2002-02-06类  别:安全 关键字:进程 PDE

Kendiv's Box 2752

2023电视专用!安卓电子相册APP避坑指南(附开源代码)

本文针对2023年智能电视用户,提供安卓电子相册APP的避坑指南与实战教程。文章详细解析了电视端相册应用的常见广告与兼容性陷阱,并指导用户如何安全获取、部署纯净的APK应用,通过核心设置实现无广告的个性化图片轮播体验,最终打造专属的家庭回忆墙。

weixin_29012677的博客 494

Wireshark、Fiddler、Charles 三款抓包工具的本质差异与选型指南

抓包工具是网络调试与接口分析的基础能力,其核心在于理解OSI模型分层原理——不同工具工作在不同协议层级,解决不同维度问题。Wireshark面向网络层(L2/L3),可捕获原始数据帧与TCP握手细节,适用于DNS异常、丢包重传等底层问题定位;Fiddler和Charles则工作在应用层(L7),作为HTTP(S)代理实现HTTPS解密、请求改写与弱网模拟,是API调试与移动端测试的首选。技术价值体现在:精准匹配问题域(如证书固定需Fiddler脚本绕过,iOS调试依赖Charles证书信任链),避免‘用显微

weixin_28831341的博客 253

windows7不支持AllocateAndGetTcpExTableFromStack

<br />今天发现iphlpapi.dll 在windows7下已经放弃支持AllocateAndGetTcpExTableFromStack,AllocateAndGetUdpExTableFromStack<br />没用办法只能重新修改程序进行重新编译<br />只能改用 GetExtendedTcpTable 。<br />具体参考:<br />http://msdn.microsoft.com/en-us/library/aa365928(VS.85).aspx

十年磨一剑,霜刃未曾试! 6079

【DSP】【工程实战】从零构建C6678多核工程:CCS环境配置与启动模式详解

本文详细介绍了在CCS开发环境中从零构建TMS320C6678多核DSP工程的完整流程。内容涵盖KeyStone架构解析、工程创建、基础代码编写、链接命令文件配置、仿真器调试,并重点深入讲解了包括I2C EEPROM在内的多种一级启动模式原理与配置方法,为开发者提供了一套清晰、可复用的实战指南。

weixin_29164185的博客 418

根据端口查找占用进程——API方法

使用API方式获取端口占用进程ID……

TU2的专栏 8872

开源大模型推理GPU资源评估以及优化

随着大模型的火热很多项目中都使用到了开源大模型,这时候准确评估大模型的GPU资源非常重要,主要有下面几个方面:GPU是昂贵的资源。高估内存需求可能导致在硬件上的不必要支出,而低估则可能导致系统故障或性能下降。:适当的内存管理确保模型高效运行,能够更快地响应用户并处理更多并发请求。:随着需求的增长,理解内存需求对于在不牺牲性能或产生高昂成本的情况下扩展服务至关重要。尽管其重要性显而易见,但计算用于服务大型语言模型(LLM)的GPU内存并不简单。

优快云DN的博客 3116

蓝桥杯历年真题分类汇总(史上最全版本,一定不要错过)

天再高又怎样,踮起脚尖就更接近阳光。 满满的 题型总结​ 历年真题​ 视频讲解​ 比赛技巧 题型总结 2021 2020 2019 2018 2017 2016 2015 2014 2013 ...

m0_58367586的博客 11万+

如何找出哪个进程正在侦听 Windows 上的 TCP 或 UDP 端口? [关闭]

关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为 Stack Overflow 的主题。 5个月前关闭。社区在 5 个月前审查了是否重新打开此问题并将其关闭:原始关闭原因未解决 改进此问题如何找出哪个进程正在侦听 Windows 上的 TCP 或 UDP 端口?

HuntsBot的博客 1931

ESP32与DS18B20温度传感器的数据采集与告警系统

并且,通过自定义的微信告警功能,我们可以及时收到温度超过阈值的告警消息。随着物联网的快速发展,传感器在各种应用场景中发挥着重要的作用。本文将介绍如何使用ESP32微控制器与DS18B20温度传感器结合,通过串口输出和Web服务器实现温度数据的采集和监控,并使用自定义微信告警功能。上传完成后,打开串口监视器,您将看到ESP32连接到Wi-Fi网络,并开始监测温度。在您的计算机或移动设备上,打开一个Web浏览器,并输入ESP32的IP地址。在浏览器中输入ESP32的IP地址后,您将看到显示当前温度的页面。

loop_class349的博客 2243

再谈进程与端口的映射》之狗尾续貂篇

作 者:hhhkkk [hhkkk@126.com]拜读了ILSY 的大作《再谈进程与端口的映射》后,觉得很不错,用vc在电脑上调试,发现有些地方能取得信息 有些地方不能更加怪的是,我的win2k上本来可以取得的,后来居然不行了。而active ports却是那样稳定,有鬼不成 靠 ,偶不信搬出OllyDdg经过调试对照发现,程序不能正常显示就是函数的OpenPhysicalMemory导致不能取

执着我一生[F.S.T] 1670

第3.4章 机器人第三方库实战总结(四):G2O优化库从入门到实战(附SLAM实例代码)

自定义边同样是满足复杂应用需求的重要手段。自定义边时,需要明确边所连接的顶点类型以及边所表示的误差项的计算方式。假设我们要定义一条边,用于约束两个上述自定义顶点之间的相对位姿和传感器偏移量关系。我们可以这样定义边类:public:// 计算误差// 计算雅可比矩阵// 读盘和存盘函数,这里暂不实现。

行知SLAM 358

【深度学习新浪潮】Nano Banana(Gemini 2.5 Flash Image)技术解析与开发者实操指南

重新定义了 AI 图像生成的产业标准。它不仅是“平民化的视觉工厂”,更是推动内容生产从“创意试错”转向“精准制造”的关键工具。未来,随着视频生成能力的加入(谷歌计划支持“文字指令 - 动态场景 - 多平台适配”全流程),Nano Banana 有望进一步颠覆影视、广告等领域的创作范式。:批量生成多场景图,模特姿态自然,服装褶皱和材质细节高度一致,节省 90% 拍摄成本。模型的非正式代号,是一款革命性的 AI 图像生成与编辑工具,主打。:生成细节丰富的厨师特写,光影自然,皮肤纹理和刀具反光逼真。

专注:太空算力、AI infra、异构调度、大模型成本工程 889

(转载)《再谈进程与端口的映射》之狗尾续貂篇

《再谈进程与端口的映射》之狗尾续貂篇发布日期:2004-05-08文摘内容: 文摘出处:http://www.xfocus.net/articles/200405/695.html创建时间:2004-05-01文章属性:原创文章提交:hhhkkk (hac01_at_163.com)《再谈进程与端口的映射》之狗尾续貂篇日  期:2004-5-1作  者:hhhkkk  [hhkkk@126

Kendiv's Box 2258

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《再谈进程与端口的映射》之狗尾续貂篇

《再谈进程与端口的映射》之狗尾续貂篇创建时间:2004-05-01文章属性:原创文章提交:hhhkkk (hac01_at_163.com)《再谈进程与端口的映射》之狗尾续貂篇日  期:2004-5-1作  者:hhhkkk  [hhkkk@126.com]拜读了ILSY 的大作《再谈进程与端口的映射》后,觉得很不错,用vc在电脑上调试,发现有些地方能取得信息 有些地方不能更加怪的是,我的wi

606

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 突破防火墙的防护
下一篇: 《再谈进程与端口的映射》之狗尾续貂篇
Pregunta
博客等级 码龄23年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值