假设有进程aaa.exe,此进程正在和网络上某个主机进行通信,请问程何获得aaa.exe访问的那台主机的IP地址?诚心求助,如果有好的源码,可以再+100分。

解决方案 »

  1.   

    有看过这种文章,它是搞反汇编fport.exe程序写的。
      

  2.   

    进程与端口的映射Author  : ilsy 
    Email   : [email protected] 
    HomePage: http://www.whitecell.org 关于进程与端口映射的文章已经有很多了,我把我对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;
    }
      

  3.   

    贴不了了,看看。http://www.xfocus.net/articles/200202/344.html先找出进和的端口,然后搞netstat去找出对应的IP。
      

  4.   

    啊啊啊?好像没这么复杂,我知道通过HOOKAPI和Winsock2可以拦截指定进程的IP包,但是我不知道如何从获得的16进制的IP包数据中挑出通信的IP地址,希望高手们帮忙。
      

  5.   

    请问,如果我已知进程aaa.exe的端口为8088,可是如何在程序中通过netstat.exe来获得对应的IP地址呢?
      

  6.   

    其实兄弟们别笑话我,尽管现在我在学C#,但我一沾C++我就晕,看不太懂.有没有Delphi版的?