当前位置:主页   - 电脑 - 程序设计 - C/C++
xp下用户程序空间分配(4):加载主程序
来源:网络   作者:快乐虾   更新时间:2011-08-11
收藏此页】    【字号    】    【打印】    【关闭

  这个是主程序,它的模块信息:

  名称

  基址

  大小

  入口点

  f:embedetoolsDebugbinbash.exe

  00400000

  0006f000

  0045bb30

  对应的内存块:

  基址

  分配基址

  分配保护

  大小

  状态

  保护

  类型

  00400000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00001000

  00001000

  MEM_COMMIT

  00000002

  PAGE_READONLY

  01000000

  MEM_IMAGE

  00401000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  0005c000

  00001000

  MEM_COMMIT

  00000020

  PAGE_EXECUTE_READ

  01000000

  MEM_IMAGE

  0045d000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00007000

  00001000

  MEM_COMMIT

  00000002

  PAGE_READONLY

  01000000

  MEM_IMAGE

  00464000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00001000

  00001000

  MEM_COMMIT

  00000008

  PAGE_WRITECOPY

  01000000

  MEM_IMAGE

  00465000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00003000

  00001000

  MEM_COMMIT

  00000004

  PAGE_READWRITE

  01000000

  MEM_IMAGE

  00468000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00007000

  00001000

  MEM_COMMIT

  00000002

  PAGE_READONLY

  01000000

  MEM_IMAGE

  0046f000

  00000000

  00000000

  00001000

  00010000

  MEM_FREE

  00000001

  PAGE_NOACCESS

  00000000

  这些块的类型都是MEM_IMAGE,且分配时的保护标志都是PAGE_EXECUTE_WRITECOPY,MSDN这样解释这个标志位:

  Enables execute, read, and write access to the committed region of image file code pages. The pages are shared read-on-write and copy-on-write.

  这几个内存块的分配基址都是一样的,猜测windows是为整个文件申请了一块大的空间,然后将文件里面的section分别写入到不同的区域里面去。

  用下面的命令行将所有的信息dump出来。

  dumpbin /all bash.exe

  再把它们和内存里的数据进行比较。

  1.1    文件头

  先看从原始文件中dump出来的文件头:

FILE HEADER VALUES
             14C machine (x86)
               5 number of sections
        4A910052 time date stamp Sun Aug 23 16:39:46 2009
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             102 characteristics
                   Executable
                   32 bit word machine

  一共有5个section,但是上面有6个块,怎么就对应不上呢,想来0x0040 0000这个块应该是文件头信息:

0x00400000  4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00  MZ..............
0x00400010  b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00  ........@.......
0x00400020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x00400030  00 00 00 00 00 00 00 00 00 00 00 00 e0 00 00 00  ................
0x00400040  0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68  ........!..L.!Th
0x00400050  69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f  is program canno
0x00400060  74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20  t be run in DOS
0x00400070  6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00  mode....$.......
0x00400080  b0 80 2d 3c f4 e1 43 6f f4 e1 43 6f f4 e1 43 6f  .€-<..Co..Co..Co
0x00400090  49 ae d5 6f f9 e1 43 6f ea b3 d6 6f ff e1 43 6f  I..o..Co...o..Co
0x004000A0  ea b3 c7 6f f3 e1 43 6f ea b3 d0 6f f0 e1 43 6f  ...o..Co...o..Co
0x004000B0  f4 e1 42 6f 5f e1 43 6f d3 27 38 6f f3 e1 43 6f  ..Bo_.Co.'8o..Co
0x004000C0  ea b3 c0 6f 88 e1 43 6f ea b3 d2 6f f5 e1 43 6f  ...o..Co...o..Co
0x004000D0  52 69 63 68 f4 e1 43 6f 00 00 00 00 00 00 00 00  Rich..Co........
0x004000E0  50 45 00 00 4c 01 05 00 49 a8 94 4a 00 00 00 00  PE..L...I..J....
0x004000F0  00 00 00 00 e0 00 02 01 0b 01 09 00 00 be 05 00  ................
0x00400100  00 e2 00 00 00 00 00 00 30 bb 05 00 00 10 00 00  ........0.......
0x00400110  00 d0 05 00 00 00 40 00 00 10 00 00 00 02 00 00  ......@.........
0x00400120  05 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00  ................
0x00400130  00 f0 06 00 00 04 00 00 60 40 07 00 03 00 40 81  ........`@....@.
0x00400140  00 00 10 00 00 10 00 00 00 00 10 00 00 10 00 00  ................
0x00400150  00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00  ................

  这些内存数据和原始文件头里面的数据是完全相同的。

  在c运行库里提供了一个叫__ImageBase的全局变量,存放这个变量的地址就在0x0040 0000,下面给出这个结构体成员的一些值:

  e_magic

  0x5a4d

  unsigned short

  e_cblp

  0x0090

  unsigned short

  e_cp

  0x0003

  unsigned short

  e_crlc

  0x0000

  unsigned short

  e_cparhdr

  0x0004

  unsigned short

  e_minalloc

  0x0000

  unsigned short

  e_maxalloc

  0xffff

  unsigned short

  e_ss

  0x0000

  unsigned short

  e_sp

  0x00b8

  unsigned short

  e_csum

  0x0000

  unsigned short

  e_ip

  0x0000

  unsigned short

  e_cs

  0x0000

  unsigned short

  e_lfarlc

  0x0040

  unsigned short

  e_ovno

  0x0000

  unsigned short

  e_res

  0x0040001c ""

  unsigned short [4]

  e_oemid

  0x0000

  unsigned short

  e_oeminfo

  0x0000

  unsigned short

  e_res2

  0x00400028 ""

  unsigned short [10]

  e_lfanew

  0x000000e0

  long

  注意系统对这个区域的保护:

  00400000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00001000

  00001000

  MEM_COMMIT

  00000002

  PAGE_READONLY

  01000000

  MEM_IMAGE

  这个区域将是只读的。

  根据PE文件的规定,在0x3c这个偏移量的位置(也就是__ImageBase.e_lfanew这个成员)指明了IMAGE_FILE_HEAD的偏移量。我们直接用一个IMAGE_FILE_HEAD指针指向这个位置,就可以看到IMAGE_FILE_HEAD的值了:

  Machine

  0x014c

  unsigned short

  NumberOfSections

  0x0005

  unsigned short

  TimeDateStamp

  0x4a94cfc5

  unsigned long

  PointerToSymbolTable

  0x00000000

  unsigned long

  NumberOfSymbols

  0x00000000

  unsigned long

  SizeOfOptionalHeader

  0x00e0

  unsigned short

  Characteristics

  0x0102

  unsigned short

  再按照这个结构体得到的SizeOfOptionalHeader,我们将得以遍历所有的section head。

  紧接着IMAGE_FILE_HEAD之后的是一个叫IMAGE_OPTIONAL_HEAD的结构体,我们直接用一个指针指向这个位置并得到实际的值:

  Magic

  0x010b

  unsigned short

  MajorLinkerVersion

  0x09 '

  '

  MinorLinkerVersion

  0x00

  unsigned char

  SizeOfCode

  0x0005be00

  unsigned long

  SizeOfInitializedData

  0x0000e200

  unsigned long

  SizeOfUninitializedData

  0x00000000

  unsigned long

  AddressOfEntryPoint

  0x0005bb60

  unsigned long

  BaseOfCode

  0x00001000

  unsigned long

  BaseOfData

  0x0005d000

  unsigned long

  ImageBase

  0x00400000

  unsigned long

  SectionAlignment

  0x00001000

  unsigned long

  FileAlignment

  0x00000200

  unsigned long

  MajorOperatingSystemVersion

  0x0005

  unsigned short

  MinorOperatingSystemVersion

  0x0000

  unsigned short

  MajorImageVersion

  0x0000

  unsigned short

  MinorImageVersion

  0x0000

  unsigned short

  MajorSubsystemVersion

  0x0005

  unsigned short

  MinorSubsystemVersion

  0x0000

  unsigned short

  Win32VersionValue

  0x00000000

  unsigned long

  SizeOfImage

  0x0006f000

  unsigned long

  SizeOfHeaders

  0x00000400

  unsigned long

  CheckSum

  0x00077b4f

  unsigned long

  Subsystem

  0x0003

  unsigned short

  DllCharacteristics

  0x8140

  unsigned short

  SizeOfStackReserve

  0x00100000

  unsigned long

  SizeOfStackCommit

  0x00001000

  unsigned long

  SizeOfHeapReserve

  0x00100000

  unsigned long

  SizeOfHeapCommit

  0x00001000

  unsigned long

  LoaderFlags

  0x00000000

  unsigned long

  NumberOfRvaAndSizes

  0x00000010

  unsigned long

  DataDirectory

  0x00400158 {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY [16]

  [0x0]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  [0x1]

  {VirtualAddress=0x00063354 Size=0x00000078 }

  _IMAGE_DATA_DIRECTORY

  [0x2]

  {VirtualAddress=0x00068000 Size=0x000002b4 }

  _IMAGE_DATA_DIRECTORY

  [0x3]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  [0x4]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  [0x5]

  {VirtualAddress=0x00069000 Size=0x00005844 }

  _IMAGE_DATA_DIRECTORY

  [0x6]

  {VirtualAddress=0x0005d2e0 Size=0x0000001c }

  _IMAGE_DATA_DIRECTORY

  [0x7]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  [0x8]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  [0x9]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  [0xa]

  {VirtualAddress=0x00062ee0 Size=0x00000040 }

  _IMAGE_DATA_DIRECTORY

  [0xb]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  [0xc]

  {VirtualAddress=0x0005d000 Size=0x000002c0 }

  _IMAGE_DATA_DIRECTORY

  [0xd]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  [0xe]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  [0xf]

  {VirtualAddress=0x00000000 Size=0x00000000 }

  _IMAGE_DATA_DIRECTORY

  把它和从文件里面DUMP出来的数据比较,可以发现它们是一致的:

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            9.00 linker version
           5BE00 size of code
            E200 size of initialized data
               0 size of uninitialized data
           5BB60 entry point (0045BB60) _mainCRTStartup
            1000 base of code
           5D000 base of data
          400000 image base (00400000 to 0046EFFF)
            1000 section alignment
             200 file alignment
            5.00 operating system version
            0.00 image version
            5.00 subsystem version
               0 Win32 version
           6F000 size of image
             400 size of headers
           6F1FE checksum
               3 subsystem (Windows CUI)
            8140 DLL characteristics
                   Dynamic base
                   NX compatible
                   Terminal Server Aware
          100000 size of stack reserve
            1000 size of stack commit
          100000 size of heap reserve
            1000 size of heap commit
               0 loader flags
              10 number of directories
               0 [       0] RVA [size] of Export Directory
           63354 [      78] RVA [size] of Import Directory
           68000 [     2B4] RVA [size] of Resource Directory
               0 [       0] RVA [size] of Exception Directory
               0 [       0] RVA [size] of Certificates Directory
           69000 [    5844] RVA [size] of Base Relocation Directory
           5D2E0 [      1C] RVA [size] of Debug Directory
               0 [       0] RVA [size] of Architecture Directory
               0 [       0] RVA [size] of Global Pointer Directory
               0 [       0] RVA [size] of Thread Storage Directory
           62EE0 [      40] RVA [size] of Load Configuration Directory
               0 [       0] RVA [size] of Bound Import Directory
           5D000 [     2C0] RVA [size] of Import Address Table Directory
               0 [       0] RVA [size] of Delay Import Directory
               0 [       0] RVA [size] of COM Descriptor Directory
               0 [       0] RVA [size] of Reserved Directory

  1.2    代码段

  先看看从bash.exe里面dump出来的信息:

SECTION HEADER #1
   .text name
   5BC4E virtual size
    1000 virtual address (00401000 to 0045CC4D)
   5BE00 size of raw data
     400 file pointer to raw data (00000400 to 0005C1FF)
       0 file pointer to relocation table
       0 file pointer to line numbers       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         Execute Read

  它请求的地址是0x0040 1000,看看在内存里的section head:

  Name

  0x004001d8 ".text"

  unsigned char [8]

  Misc

  {PhysicalAddress=0x0005bc4e VirtualSize=0x0005bc4e }

  _IMAGE_SECTION_HEADER::<unnamed-type-Misc>

  VirtualAddress

  0x00001000

  unsigned long

  SizeOfRawData

  0x0005be00

  unsigned long

  PointerToRawData

  0x00000400

  unsigned long

  PointerToRelocations

  0x00000000

  unsigned long

  PointerToLinenumbers

  0x00000000

  unsigned long

  NumberOfRelocations

  0x0000

  unsigned short

  NumberOfLinenumbers

  0x0000

  unsigned short

  Characteristics

  0x60000020

  unsigned long

  下面是windows为这个段分配的内存块:

  基址

  分配基址

  分配保护

  大小

  状态

  保护

  类型

  00401000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  0005c000

  00001000

  MEM_COMMIT

  00000020

  PAGE_EXECUTE_READ

  01000000

  MEM_IMAGE

  显然windows是满足文件的请求了。

  再比较dump出来的代码段的原始数据和内存里的数据:

0x00401000  55 8b ec 81 ec d4 00 00 00 53 56 57 8d bd 2c ff  U........SVW..,.
0x00401010  ff ff b9 35 00 00 00 b8 cc cc cc cc f3 ab 8b 45  ...5...........E
0x00401020  14 83 e0 01 89 45 f8 8b 45 08 0f be 08 83 f9 3d  .....E..E......=

  可以发现它们的内容是一致的。

  在vs2008里面可以看到这段代码反汇编的结果:

int
binary_test (op, arg1, arg2, flags)
     char *op, *arg1, *arg2;
     int flags;
{
00401000 55               push        ebp 
00401001 8B EC            mov         ebp,esp
00401003 81 EC D4 00 00 00 sub         esp,0D4h
00401009 53               push        ebx 
0040100A 56               push        esi 
0040100B 57               push        edi 
0040100C 8D BD 2C FF FF FF lea         edi,[ebp-0D4h]
00401012 B9 35 00 00 00   mov         ecx,35h
00401017 B8 CC CC CC CC   mov         eax,0CCCCCCCCh
0040101C F3 AB            rep stos    dword ptr es:[edi]
  int patmatch;
………………

  由此可见windows应该是把这个段的内容原封不动地读进来了,执行时PC指针将指向这块内存的数据。

  1.3    只读数据段

  这是exe里面的第二个段,看看它的section head:

  .rdata name
    6FD0 virtual size
   5D000 virtual address (0045D000 to 00463FCF)
    7000 size of raw data
   5C200 file pointer to raw data (0005C200 to 000631FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

  再看内存里面的section head:

  Name

  0x00400200 ".rdata"

  unsigned char [8]

  Misc

  {PhysicalAddress=0x00006fd0 VirtualSize=0x00006fd0 }

  _IMAGE_SECTION_HEADER::<unnamed-type-Misc>

  VirtualAddress

  0x0005d000

  unsigned long

  SizeOfRawData

  0x00007000

  unsigned long

  PointerToRawData

  0x0005c200

  unsigned long

  PointerToRelocations

  0x00000000

  unsigned long

  PointerToLinenumbers

  0x00000000

  unsigned long

  NumberOfRelocations

  0x0000

  unsigned short

  NumberOfLinenumbers

  0x0000

  unsigned short

  Characteristics

  0x40000040

  unsigned long

  再看windows为这个段分配的内存:

  基址

  分配基址

  分配保护

  大小

  状态

  保护

  类型

  0045d000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00007000

  00001000

  MEM_COMMIT

  00000002

  PAGE_READONLY

  01000000

  MEM_IMAGE

  同样,满足了文件的要求。

  这个只读数据段的绝大部分数据与文件中读出的一致,但是对于导入表之类的数据,在加载到内存之后将由windows动态更改。

  1.4    数据段

  先看看从文件中dump出来的section head:

SECTION HEADER #3
   .data name
    352C virtual size
   64000 virtual address (00464000 to 0046752B)
    1400 size of raw data
   63200 file pointer to raw data (00063200 to 000645FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         Read Write

  再看看内存里面的section head:

  Name

  0x00400228 ".data"

  unsigned char [8]

  Misc

  {PhysicalAddress=0x0000352c VirtualSize=0x0000352c }

  _IMAGE_SECTION_HEADER::<unnamed-type-Misc>

  VirtualAddress

  0x00064000

  unsigned long

  SizeOfRawData

  0x00001400

  unsigned long

  PointerToRawData

  0x00063200

  unsigned long

  PointerToRelocations

  0x00000000

  unsigned long

  PointerToLinenumbers

  0x00000000

  unsigned long

  NumberOfRelocations

  0x0000

  unsigned short

  NumberOfLinenumbers

  0x0000

  unsigned short

  Characteristics

  0xc0000040

  unsigned long

  下面是windows为其分配的空间:

  基址

  分配基址

  分配保护

  大小

  状态

  保护

  类型

  00464000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00001000

  00001000

  MEM_COMMIT

  00000008

  PAGE_WRITECOPY

  01000000

  MEM_IMAGE

  00465000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00003000

  00001000

  MEM_COMMIT

  00000004

  PAGE_READWRITE

  01000000

  MEM_IMAGE

  从这里可以看到,实际上这个段的内存是分为两部分的,第一个部分用于存放Relocation table,第二个部分才是程序里的全局变量。因为第二个部分是允许在程序中修改的,因此它的保护标志设置成了PAGE_READWRITE。

  随便在程序里面找个全局变量,看一下地址,的确是落在这个范围的,呵呵。前几天还使劲在想怎么取得数据段的首地址,得来全不费工夫!用VirtualQuery足矣!

  1.5    .rsrc

  先看看从bash.exe里面dump出来的section head:

SECTION HEADER #4
   .rsrc name
     2B4 virtual size
   68000 virtual address (00468000 to 004682B3)
     400 size of raw data
   64600 file pointer to raw data (00064600 to 000649FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

  再看看内存里面的section head:

  Name

  0x00400250 ".rsrc"

  unsigned char [8]

  Misc

  {PhysicalAddress=0x000002b4 VirtualSize=0x000002b4 }

  _IMAGE_SECTION_HEADER::<unnamed-type-Misc>

  VirtualAddress

  0x00068000

  unsigned long

  SizeOfRawData

  0x00000400

  unsigned long

  PointerToRawData

  0x00064600

  unsigned long

  PointerToRelocations

  0x00000000

  unsigned long

  PointerToLinenumbers

  0x00000000

  unsigned long

  NumberOfRelocations

  0x0000

  unsigned short

  NumberOfLinenumbers

  0x0000

  unsigned short

  Characteristics

  0x40000040

  unsigned long

  下面是windows为其分配的空间:

  基址

  分配基址

  分配保护

  大小

  状态

  保护

  类型

</p>

  00468000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00007000

  00001000

  MEM_COMMIT

  00000002

  PAGE_READONLY

  01000000

  MEM_IMAGE

  这一块的内容和从文件中读取的内容完全一致。

  1.6    .reloc

  先看看从文件中dump出来的头:

SECTION HEADER #5
  .reloc name
    58D0 virtual size
   69000 virtual address (00469000 to 0046E8CF)
    5A00 size of raw data
   64A00 file pointer to raw data (00064A00 to 0006A3FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
42000040 flags
         Initialized Data
         Discardable
         Read Only

  再看看内存里面的section head:

  Name

  0x00400278 ".reloc"

  unsigned char [8]

  Misc

  {PhysicalAddress=0x000058d0 VirtualSize=0x000058d0 }

  _IMAGE_SECTION_HEADER::<unnamed-type-Misc>

  VirtualAddress

  0x00069000

  unsigned long

  SizeOfRawData

  0x00005a00

  unsigned long

  PointerToRawData

  0x00064a00

  unsigned long

  PointerToRelocations

  0x00000000

  unsigned long

  PointerToLinenumbers

  0x00000000

  unsigned long

  NumberOfRelocations

  0x0000

  unsigned short

  NumberOfLinenumbers

  0x0000

  unsigned short

  Characteristics

  0x42000040

  unsigned long

  但是windows并没有为这个段单独分配一块空间,而是和上一个段放在了同一个存储区域:

  基址

  分配基址

  分配保护

  大小

  状态

  保护

  类型

  00468000

  00400000

  00000080

  PAGE_EXECUTE_WRITECOPY

  00007000

  00001000

  MEM_COMMIT

  00000002

  PAGE_READONLY

  01000000

  MEM_IMAGE

  比较发现它在内存中的数据和从文件中读取出来的原始数据是一致的。Reloc的过程暂且不管,再看看其它的东西。

编缉推荐阅读以下文章

  • xp下用户程序空间分配(9):还剩下什么?
  • xp下用户程序空间分配(8):MEM_MAPPED
  • xp下用户程序空间分配(7):Heap
  • xp下用户程序空间分配(6):加载用户DLL
  • xp下用户程序空间分配(5):加载系统DLL
  • xp下用户程序空间分配(3):加载文件
  • xp下用户程序空间分配(2):栈
  • xp下用户程序空间分配(1):大致框架
其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明