| ²é¿´: 573 | »Ø¸´: 4 | |||
| µ±Ç°Ö÷ÌâÒѾ´æµµ¡£ | |||
sdlj8051½ð³æ (ÖøÃûдÊÖ)
|
[½»Á÷]
PE֪ʶѧϰ[תÌù]
|
||
|
PE ÎļþµÄ֪ʶÊÇ»ù±¾µÄ֪ʶ.ÍøÉÏÓкܶàÕâ·½ÃæµÄ×ÊÁÏ.È»¶øÏµÍ³½²½âµÄÈ´²»¶à.ÎÒ²»ÊÇÕâ·½ÃæµÄר¼Ò,È´Ï£ÍûÄÜÅ×שÒýÓñ,µÃµ½Õâ·½ÃæµÄһЩָµã. ¼ÆËã»úÕâÃÅ¿ÆÑ§ÊÇʵ¼ùÐÔºÜÇ¿µÄÒ»ÃÅѧÎÊ,Èç¹ûÏëÔúÔúʵʵµÄѧ»áµã¶«Î÷,»¹ÊÇÒªÇ××Ô¶¯ÊÖÊÔÒ»ÊÔ. ÔÚ¼ÌÐøÏòÏ¿´Ö®Ç°,ÎÒ¼Ù¶¨Äã»á»ù±¾µÄCÓïÑԺͼòµ¥µÄʹÓÃVC6.0,ÒÔϵÄÀý×Ó¶¼ÓÃÓõ½ÕâЩ.³ý´ËÖ®Íâ,²»ÔÙ×öÈκμÙÉè. ¹ØÓÚpeµÄһЩ½á¹¹¿ÉÒÔÔÚwinnt.hÕâ¸öÍ·ÎļþÀïÕÒµ½. ÉùÃ÷Ò»ÏÂ:ÕâÀïËùÓеĽṹ¼°³£Á¿¶¨Òå¶¼ÊÇ»ùÓÚintelµÄx86 CPUµÄ,ÔÚÆäËûµÄϵͳÉÏ¿ÉÄÜÓÐËù²»Í¬,ÄãÓ¦¸ÃÈ¥²é¿´ÏàÓ¦µÄ×ÊÁÏ.¹ØÓÚÕâµãÒÔºó²»ÔÙÉùÃ÷. Ê×ÏÈÔÚpeÎļþµÄ¿ªÊ¼ÊÇÕâÑùÒ»¸ö½á¹¹(ΪÁË·½±ãÔĶÁ,ÎÒ¼ÓÉÏÁË×Ö½ÚÆ«ÒÆ): typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header 00h WORD e_magic; // Magic number **DOSÍ·±ê¼Ç 02h WORD e_cblp; // Bytes on last page of file 04h WORD e_cp; // Pages in file 06h WORD e_crlc; // Relocations 08h WORD e_cparhdr; // Size of header in paragraphs 0ah WORD e_minalloc; // Minimum extra paragraphs needed 0ch WORD e_maxalloc; // Maximum extra paragraphs needed 0eh WORD e_ss; // Initial (relative) SS value 10h WORD e_sp; // Initial SP value 12h WORD e_csum; // Checksum 14h WORD e_ip; // Initial IP value 16h WORD e_cs; // Initial (relative) CS value 18h WORD e_lfarlc; // File address of relocation table 1ah WORD e_ovno; // Overlay number 1ch WORD e_res[4]; // Reserved words 24h WORD e_oemid; // OEM identifier (for e_oeminfo) 26h WORD e_oeminfo; // OEM information; e_oemid specific 28h WORD e_res2[10]; // Reserved words 3ch LONG e_lfanew; // File address of new exe header **Ö¸ÏòPEÍ·²¿ } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; ¡¡¡¡Õâ¸ö½á¹¹¾ÍÊÇDOS MZÍ·,ÊÇΪÁËÏòϼæÈݵÄ.µ±ÔÚDOSÏÂÔËÐÐwindows³ÌÐò²»ÖÁÓÚ³ö´í. ¡¡¡¡ÎÒÃÇÖ»¹ØÐÄÁ½¸öÓò:e_magic ºÍe_lfanew. e_magic µÄÖµÓ¦¸ÃµÈÓÚ0x5A4D,ÏñÏÂÃæ¶¨ÒåÕâÑùµÄ: #define IMAGE_DOS_SIGNATURE 0x5A4D // MZ e_lfanewÊÇÒ»¸öÖ¸Õë,Ö¸ÏòPEÎļþÍ·ÔÚPEÎļþÖÐµÄÆ«ÒÆ. PEÎļþÍ·ÊÇÕâÑùÒ»¸ö½á¹¹,Ëü°üº¬ÁËÐí¶àPE×°ÔØÆ÷ÒªÓõ½µÄÓò. typedef struct _IMAGE_NT_HEADERS { DWORD Signature; **PEÎļþ±êʶ IMAGE_FILE_HEADER FileHeader; **Ó³ÏñÎļþÍ· IMAGE_OPTIONAL_HEADER32 OptionalHeader; **Ó³Ïñ¿Éѡͷ } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; SignatureµÄ¶¨ÒåÈçÏÂ: #define IMAGE_NT_SIGNATURE 0x00004550 // PE00 ºÃÁË,ÈÃÎÒÃÇʵ¼Ê×öµãÊÂ.д¸öС³ÌÐò²é¿´Ò»ÏÂPEÎļþµÄÕâЩÐÅÏ¢,²¢ÅжÏÒ»¸öPEÎļþÊÇ·ñÓÐЧ. ´úÂëÈçÏÂ,Äã¿ÉÒÔÔÚVCÖн¨Ò»¸ö¿ØÖÆÌ¨³ÌÐò,È»ºó°ÑÕâ¶Î´úÂ뿽½øÈ¥(ÎÒ½¨ÒéÄãÊÖ¹¤ÊäÈë.ʲô?Äã²»Ô¸Òâ?¹þ¹þ,ÎÒ¿ÉÊÇÒ»¸öÒ»¸ö×ÖĸÇýøÈ¥µÄ,Äã±ÈÎÒ»¹ÀÁ )#include "stdafx.h" #include "windows.h" #include "stdio.h" int main(int argc, char* argv[]) { FILE *p; IMAGE_DOS_HEADER mydosheader; unsigned long sig; p = fopen("test1.exe","r+b" ;if(p == NULL)return -1; fread(&mydosheader,sizeof(mydosheader),1,p); fseek(p,mydosheader.e_lfanew,SEEK_SET); fread(&sig,4,1,p); fclose(p); printf("IMAGE_DOS_HEADER dump:\n" ;printf("e_magic : %04x\n",mydosheader.e_magic); printf("e_cblp : %04x\n",mydosheader.e_cblp); printf("e_cp : %04x\n",mydosheader.e_cp); printf("e_crlc : %04x\n",mydosheader.e_crlc); printf("e_cparhdr : %04x\n",mydosheader.e_cparhdr); printf("e_minalloc: %04x\n",mydosheader.e_minalloc); printf("e_maxalloc: %04x\n",mydosheader.e_maxalloc); printf("e_ss : %04x\n",mydosheader.e_ss); printf("e_sp : %04x\n",mydosheader.e_sp); printf("e_csum : %04x\n",mydosheader.e_csum); printf("e_ip : %04x\n",mydosheader.e_ip); printf("e_cs : %04x\n",mydosheader.e_cs); printf("e_lfarlc : %04x\n",mydosheader.e_lfarlc); printf("e_ovno : %04x\n",mydosheader.e_ovno); printf("e_res[0] : %04x\n",mydosheader.e_res[0]); printf("e_oemid : %04x\n",mydosheader.e_oemid); printf("e_oeminfo : %04x\n",mydosheader.e_oeminfo); printf("res2[0] : %04x\n",mydosheader.e_res2[0]); printf("lfanew : %08x\n",mydosheader.e_lfanew); if((mydosheader.e_magic ==IMAGE_DOS_SIGNATURE) && (sig == IMAGE_NT_SIGNATURE)) printf("ÓÐЧµÄPEÎļþ\n" ;else printf("ÎÞЧµÄPEÎļþ\n" ;return 0; } PE֪ʶѧϰ£¨¶þ£© ÎÒÃÇÁ˽âÁËpeÍ·²¿µÄdos²¿Êײ¿·Ö,ÎÒÃÇÖªµÀÔÚÕâ¸ö½á¹¹Àïe_magicºÍe_lfanewÕâÁ½¸öÓò¶ÔÎÒÃÇÀ´ËµºÜÖØÒª.ͬʱÎÒÃÇÒ²Ìáµ½ÁËe_lfanewÓòÖ¸ÏòIMAGE_NT_HEADERS32½á¹¹ÔÚpeÎļþµÄÆ«ÒÆ. ²¹³äÉùÃ÷Ò»ÏÂ:ÕâÀïµÄ֪ʶÊÇÊÊÓÃÓÚ32λ×ֵĻúÆ÷ÉϵÄ. ÏÂÃæÎÒÃǽÓ×Å¿´IMAGE_NT_HEADERS32½á¹¹,Õâ¸ö²¿·ÖÔÚpeÎļþµÄѧϰÀïÖÁ¹ØÖØÒª. IMAGE_NT_HEADERS32µÄ½á¹¹¶¨ÒåÈçÏÂ: typedef struct _IMAGE_NT_HEADERS { DWORD Signature; **PEÎļþ±êʶ "PE",0,0 IMAGE_FILE_HEADER FileHeader; **Ó³ÏñÎļþÍ· IMAGE_OPTIONAL_HEADER32 OptionalHeader; **Ó³Ïñ¿Éѡͷ } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; ÕâÆäÖÐÓÖ°üº¬ÁËÁ½¸ö½á¹¹.ÎÒÃÇÒ»µãÒ»µãµÄÍùÏ¿´. IMAGE_FILE_HEADERÕâ¸ö½á¹¹µÄ¶¨ÒåÈçÏÂ: typedef struct _IMAGE_FILE_HEADER { 00h WORD Machine; **ÔËÐÐÆ½Ì¨ 02h WORD NumberOfSections; **Çø¿éÊýÄ¿ 06h DWORD TimeDateStamp; **ÎļþÈÕÆÚʱ¼ä´Á 0Ah DWORD PointerToSymbolTable; **Ö¸Ïò·ûºÅ±í 0Eh DWORD NumberOfSymbols; **·ûºÅ±íÖеķûºÅÊýÁ¿ 12h WORD SizeOfOptionalHeader; **Ó³Ïñ¿Éѡͷ½á¹¹µÄ´óС 14h WORD Characteristics; **ÎļþÌØÕ÷Öµ } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; ÎÒÃÇ¿´Ò»ÏÂÕ⼸¸öÓò: 1) MachineÓò˵Ã÷Õâ¸öpeÎļþÔÚʲôCPUÉÏÔËÐÐ,¾ßÌåÈçÏÂ: #define IMAGE_FILE_MACHINE_UNKNOWN 0 #define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386. #define IMAGE_FILE_MACHINE_R3000 0x0162 // MIPS little-endian, 0x160 big-endian #define IMAGE_FILE_MACHINE_R4000 0x0166 // MIPS little-endian #define IMAGE_FILE_MACHINE_R10000 0x0168 // MIPS little-endian #define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 // MIPS little-endian WCE v2 #define IMAGE_FILE_MACHINE_ALPHA 0x0184 // Alpha_AXP #define IMAGE_FILE_MACHINE_POWERPC 0x01F0 // IBM PowerPC Little-Endian #define IMAGE_FILE_MACHINE_SH3 0x01a2 // SH3 little-endian #define IMAGE_FILE_MACHINE_SH3E 0x01a4 // SH3E little-endian #define IMAGE_FILE_MACHINE_SH4 0x01a6 // SH4 little-endian #define IMAGE_FILE_MACHINE_ARM 0x01c0 // ARM Little-Endian #define IMAGE_FILE_MACHINE_THUMB 0x01c2 #define IMAGE_FILE_MACHINE_IA64 0x0200 // Intel 64 #define IMAGE_FILE_MACHINE_MIPS16 0x0266 // MIPS #define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 // MIPS #define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 // MIPS #define IMAGE_FILE_MACHINE_ALPHA64 0x0284 // ALPHA64 #define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64 2) NumberOfSections peÎļþÖÐÇø¿éµÄÊýÁ¿,¹ØÓÚÇø¿éÏÂÃæ»¹Òª½²µ½,ÕâÀïÏÈÓиöÓ¡Ïó¾Í¿ÉÒÔÁË. 3)TimeDateStamp ÎļþÈÕÆÚʱ¼ä´Á,Ö¸Õâ¸öpeÎļþÉú³ÉµÄʱ¼ä,ËüµÄÖµÊÇ´Ó1969Äê12ÔÂ31ÈÕ16:00:00ÒÔÀ´µÄÃëÊý. 4)PointerToSymbolTable Coffµ÷ÊÔ·ûºÅ±íµÄÆ«ÒÆµØÖ·. 5)NumberOfSymbols Coff·ûºÅ±íÖзûºÅµÄ¸öÊý. Õâ¸öÓòºÍǰ¸öÓòÔÚrelease°æ±¾µÄ³ÌÐòÀïÊÇ0. 6)SizeOfOptionalHeader IMAGE_OPTIONAL_HEADER32½á¹¹µÄ´óС(¼´¶àÉÙ×Ö½Ú).ÎÒÃǽÓמÍÒªÌáµ½Õâ¸ö½á¹¹ÁË.ÊÂʵÉÏ,peÎļþµÄ´ó²¿·ÖÖØÒªµÄÓò¶¼ÔÚIMAGE_OPTIONAL_HEADER½á¹¹Àï. 7)Characteristics Õâ¸öÓòÃèÊöpeÎļþµÄһЩÊôÐÔÐÅÏ¢,±ÈÈçÊÇ·ñ¿ÉÖ´ÐÐ,ÊÇ·ñÊÇÒ»¸ö¶¯Ì¬Á¬½Ó¿âµÈ.¾ßÌ嶨ÒåÈçÏÂ: #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // ÖØ¶¨Î»ÐÅÏ¢±»ÒƳý #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // Îļþ¿ÉÖ´ÐÐ #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Ðкű»ÒƳý #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // ·ûºÅ±»ÒƳý #define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 // Agressively trim working set #define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // ³ÌÐòÄÜ´¦Àí´óÓÚ2GµÄµØÖ· #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed. #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32λ»úÆ÷ #define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // .dbgÎļþµÄµ÷ÊÔÐÅÏ¢±»ÒƳý #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 // Èç¹ûÔÚÒÆ¶¯½éÖÊÖÐ,¿½µ½½»»»ÎļþÖÐÔËÐÐ #define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 // Èç¹ûÔÚÍøÂçÖÐ,¿½µ½½»»»ÎļþÖÐÔËÐÐ #define IMAGE_FILE_SYSTEM 0x1000 // ϵͳÎļþ #define IMAGE_FILE_DLL 0x2000 // ÎļþÊÇÒ»¸ödll #define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 // ÎļþÖ»ÄÜÔËÐÐÔÚµ¥´¦ÀíÆ÷ÉÏ #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed. Ò»¸öpeÎļþµÄÌØÕ÷Öµ¾ÍÊÇÕâЩÊôÐÔÖµ¼ÓÔÚÒ»ÆðµÄ. Ï£ÍûÕâЩûÓÐÈÃÄãÍ·ÔÎ,ÆäʵÄÚÈݲ»¶à,Ö»ÊÇÒ»¸öIMAGE_FILE_HEADER½á¹¹,¶øÕâ¸ö½á¹¹°üº¬7¸öÓò¶øÒÑ. ÈÃÎÒÃÇÏÈÊìϤÕâ¸ö½á¹¹,ÎÒÃDZà¸ö³ÌÐòÀ´ÏÔʾÕâЩÐÅÏ¢. #include "stdafx.h" #include "windows.h" #include "stdio.h" #include "conio.h" int main(int argc, char* argv[]) { FILE *p; LONG e_lfanew; //Ö¸ÏòIMAGE_NT_HEADERS32½á¹¹ÔÚÎļþÖÐµÄÆ«ÒÆ IMAGE_FILE_HEADER myfileheader; p = fopen("test1.exe","r+b" ;if(p == NULL)return -1; fseek(p,0x3c,SEEK_SET); fread(&e_lfanew,4,1,p); fseek(p,e_lfanew+4,SEEK_SET); //Ö¸ÏòIMAGE_FILE_HEADER½á¹¹µÄÆ«ÒÆ fread(&myfileheader,sizeof(myfileheader),1,p); printf("IMAGE_FILE_HEADER½á¹¹:\n" ;printf("Machine : %04X\n",myfileheader.Machine); printf("NumberOfSections : %04X\n",myfileheader.NumberOfSections); printf("TimeDateStamp : %08X\n",myfileheader.TimeDateStamp); printf("PointerToSymbolTable : %08X\n",myfileheader.PointerToSymbolTable); printf("NumberOfSymbols : %08X\n",myfileheader.NumberOfSymbols); printf("SizeOfOptionalHeader : %04X\n",myfileheader.SizeOfOptionalHeader); printf("Characteristics : %04X\n",myfileheader.Characteristics); getch(); return 0; } ´Ë³ÌÐòÔÚwin98 + vc6.0 »·¾³Ï±àÒëͨ¹ý. ¡¡ [ Last edited by sdlj8051 on 2006-10-6 at 12:49 ] |
» ²ÂÄãϲ»¶
»ù½ðÉ걨
ÒѾÓÐ5È˻ظ´
»ù½ðίզÁË£¿2026ÄêµÄÖ¸ÄÏ»¹Ã»ÓгöÀ´£¿
ÒѾÓÐ7È˻ظ´
¹ú×ÔÈ»ÉêÇëÃæÉÏÄ£°å×îÐÂ2026°æ³öÁËÂð£¿
ÒѾÓÐ17È˻ظ´
ÄÉÃ×Á£×ÓÁ£¾¶µÄ²âÁ¿
ÒѾÓÐ8È˻ظ´
ÒÉ»ó£¿
ÒѾÓÐ5È˻ظ´
¼ÆËã»ú¡¢0854µç×ÓÐÅÏ¢£¨085401-058412£©µ÷¼Á
ÒѾÓÐ5È˻ظ´
Materials Today ChemistryÉó¸åÖÜÆÚ
ÒѾÓÐ5È˻ظ´
äåµÄ·´Ó¦ÒºÍÑÉ«
ÒѾÓÐ7È˻ظ´
ÍÆ¼öÒ»±¾Êé
ÒѾÓÐ12È˻ظ´
³£Ä격ʿÕÐÊÕ(˫һÁ÷£¬¹¤¿Æ)
ÒѾÓÐ4È˻ظ´
sdlj8051
½ð³æ (ÖøÃûдÊÖ)
- Ó¦Öú: 0 (Ó×¶ùÔ°)
- ¹ó±ö: 0.1
- ½ð±Ò: 1149.8
- ºì»¨: 3
- Ìû×Ó: 2254
- ÔÚÏß: 18.1Сʱ
- ³æºÅ: 71297
- ×¢²á: 2005-05-30
- רҵ: µç·Óëϵͳ
|
pe֪ʶѧϰ£¨Èý£© ǰÁ½¸öÌù×ÓÎÒÃÇÒѾ½éÉÜÁËpeÎļþµÄÁ½¸ö½á¹¹,Ï£Íû»¹Ã»ÓÐÈÃÄã¿´ÔÎ.ÏÂÃæÎÒ°ÑpeÎļþµÄ½á¹¹ÁгöÀ´,ÈÃÎÒÃÇÓиöÈ«¾ÖµÄÓ¡Ïó. _______________________________ | IMAGE_DOS_HEADER | <-- Dos²¿Ê× ------------------------------- | 'PE',0,0 | <-- PEÎļþ±êÖ¾ ------------------------------- | IMAGE_FILE_HEADER | <-- Ó³ÏñÎļþÍ· ------------------------------- | IMAGE_OPTIONAL_HEADER32 | <-- Ó³Ïñ¿Éѡͷ ------------------------------- | Section Table | <-- ½Ú±í ------------------------------- | .text | <-- ´úÂëÇø¶Î ------------------------------- | .data | <-- Êý¾ÝÇø¶Î ------------------------------- | .idata | <-- ÊäÈë±í ------------------------------- | .edata | <-- Êä³ö±í ------------------------------- | .reloc | <-- ÖØ¶¨Î»±íÇø¶Î ------------------------------- | .... | ------------------------------- | µ÷ÊÔÐÅÏ¢ | ------------------------------- ºÃÁË,ÎÒÃǽÓ×Å¿´¿´IMAGE_OPTIONAL_HEADER32½á¹¹.Õâ¸ö½á¹¹µÄÓò±È½Ï¶à,µ«ÊǺͺóÃæÒª½²µ½µÄ½Ú±íÒ»Ñù,·Ç³£ÖØÒª.Ï£ÍûÄãÄܹ»ÓÃÐÄÌå»á,²¢¶¯ÊÖʵ¼ùÒ»ÏÂ. IMAGE_OPTIONAL_HEADER32µÄ½á¹¹¶¨ÒåÈçÏÂ: typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // 00h WORD Magic; //»ÃÊý,32λpeÎļþ×ÜΪ010bh 02h BYTE MajorLinkerVersion; //Á¬½ÓÆ÷Ö÷°æ±¾ºÅ 03h BYTE MinorLinkerVersion; //Á¬½ÓÆ÷¸±°æ±¾ºÅ 04h DWORD SizeOfCode; //´úÂë¶Î×Ü´óС 08h DWORD SizeOfInitializedData; //Òѳõʼ»¯Êý¾Ý¶Î×Ü´óС 0ch DWORD SizeOfUninitializedData; //δ³õʼ»¯Êý¾Ý¶Î×Ü´óС 10h DWORD AddressOfEntryPoint; //³ÌÐòÖ´ÐÐÈë¿ÚµØÖ·(RVA) 14h DWORD BaseOfCode; //´úÂë¶ÎÆðʼµØÖ·(RVA) 18h DWORD BaseOfData; //Êý¾Ý¶ÎÆðʼµØÖ·(RVA) // // NT additional fields. // 1ch DWORD ImageBase; //³ÌÐòĬÈϵÄ×°ÈëÆðʼµØÖ· 20h DWORD SectionAlignment; //ÄÚ´æÖÐÇø¿éµÄ¶ÔÆëµ¥Î» 24h DWORD FileAlignment; //ÎļþÖÐÇø¿éµÄ¶ÔÆëµ¥Î» 28h WORD MajorOperatingSystemVersion; //ËùÐè²Ù×÷ϵͳÖ÷°æ±¾ºÅ 2ah WORD MinorOperatingSystemVersion; //ËùÐè²Ù×÷ϵͳ¸±°æ±¾ºÅ 2ch WORD MajorImageVersion; //×Ô¶¨ÒåÖ÷°æ±¾ºÅ 2eh WORD MinorImageVersion; //×Ô¶¨Ò帱°æ±¾ºÅ 30h WORD MajorSubsystemVersion; //ËùÐè×ÓϵͳÖ÷°æ±¾ºÅ 32h WORD MinorSubsystemVersion; //ËùÐè×Óϵͳ¸±°æ±¾ºÅ 34h DWORD Win32VersionValue; //×ÜÊÇ0 38h DWORD SizeOfImage; //peÎļþÔÚÄÚ´æÖеÄÓ³Ïñ×Ü´óС 3ch DWORD SizeOfHeaders; //´ÓpeÎļþ¿ªÊ¼µ½½Ú±í(°üº¬½Ú±í)µÄ×Ü´óС 40h DWORD CheckSum; //peÎļþCRCУÑéºÍ 44h WORD Subsystem; //Óû§½çÃæÊ¹ÓõÄ×ÓϵͳÀàÐÍ 46h WORD DllCharacteristics; //Ϊ0 48h DWORD SizeOfStackReserve; //ΪÏ̵߳ÄÕ»³õʼ±£ÁôµÄÐéÄâÄÚ´æµÄĬÈÏÖµ 4ch DWORD SizeOfStackCommit; //ΪÏ̵߳ÄÕ»³õʼÌá½»µÄÐéÄâÄÚ´æµÄ´óС 50h DWORD SizeOfHeapReserve; //Ϊ½ø³ÌµÄ¶Ñ±£ÁôµÄÐéÄâÄÚ´æµÄ´óС 54h DWORD SizeOfHeapCommit; //Ϊ½ø³ÌµÄ¶Ñ³õʼÌá½»µÄÐéÄâÄÚ´æµÄ´óС 58h DWORD LoaderFlags; //Ϊ0 5ch DWORD NumberOfRvaAndSizes; //Êý¾ÝĿ¼½á¹¹Êý×éµÄÏîÊý,×ÜΪ 00000010h 60h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; //Êý¾ÝĿ¼½á¹¹Êý×é } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; ÏÂÃæÔÙ¾ßÌå½âÊÍһϸ÷¸öÓòµÄº¬Òå.²»ÒªÏÐÂÞàÂ,ºóÃæÕâЩ֪ʶʵÔÚÊÇÌ«ÖØÒªÁË. 1)Magic »ÃÊý,32λpeÎļþ×ÜΪ010bh Õâ¸ö³£ÊýµÄ¶¨ÒåÈçÏÂ: #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 2)MajorLinkerVersion Á¬½Ó³ÌÐòµÄÖ÷°æ±¾ºÅ Èçvc6.0µÄΪ06h 3)MinorLinkerVersion Á¬½Ó³ÌÐòµÄ´Î°æ±¾ºÅ Èçvc6.0µÄΪ00h 4)SizeOfCode peÎļþ´úÂë¶ÎµÄ´óС.ÊÇFileAlignmentµÄÕûÊý±¶. 5)SizeOfInitializedData ËùÓк¬Òѳõʼ»¯Êý¾ÝµÄ¿éµÄ´óС,Ò»°ãÔÚ.data¶ÎÖÐ. 6)SizeOfUninitializedData ËùÓк¬Î´³õʼ»¯Êý¾ÝµÄ¿éµÄ´óС,Ò»°ãÔÚ.bss¶ÎÖÐ. 7)AddressOfEntryPoint ³ÌÐò¿ªÊ¼Ö´ÐеĵØÖ·,ÕâÊÇÒ»¸öRVA(Ïà¶ÔÐéÄâµØÖ·).¶ÔÓÚexeÎļþ,ÕâÀïÊÇÆô¶¯´úÂë;¶ÔÓÚdllÎļþ,ÕâÀïÊÇlibMain()µÄµØÖ·. ÔÚÍÑ¿ÇʱµÚÒ»¼þʾÍÊÇÕÒÈë¿Úµã,Ö¸µÄ¾ÍÊÇÕâ¸öÖµ. 8)BaseOfCode ´úÂë¶Î»ùµØÖ·,΢ÈíµÄÁ¬½Ó³ÌÐòÉú³ÉµÄ³ÌÐòÒ»°ã°ÑÕâ¸öÖµÖÃΪ1000h, 9)BaseOfData Êý¾Ý¶Î»ùµØÖ· 10)ImageBase peÎļþĬÈϵÄ×°ÈëµØÖ·.windows9xÖÐexeÎļþΪ400000h,dllÎļþΪ10000000h. 11)SectionAlignment ÄÚ´æÖÐÇø¿éµÄ¶ÔÆëµ¥Î».Çø¿é×ÜÊÇ¶ÔÆëµ½Õâ¸öÖµµÄÕûÊý±¶.x86µÄ32λϵͳÉÏĬÈÏֵλ1000h 12)FileAlignment peÎļþÖÐÇø¿éµÄ¶ÔÆëµ¥Î».peÎļþÖÐĬÈÏֵΪ 200h. 13)MajorOperatingSystemVersion 14)MinorOperatingSystemVersion ÉÏÃæÁ½¸öÓòÊÇÖ¸ÔËÐÐÕâ¸öpeÎļþËùÐèµÄ²Ù×÷ϵͳµÄ×îµÍ°æ±¾ºÅ.windows95/98ºÍwindows nt 4.0 µÄÄÚ²¿°æ±¾ºÅ¶¼ÊÇ 4.0 ,¶øwindows2000µÄÄÚ²¿°æ±¾ºÅÊÇ5.0 15)MajorImageVersion 16)MinorImageVersion ÉÏÃæÁ½¸öÓòÊÇÖ¸Óû§×Ô¶¨ÒåµÄpeÎļþµÄ°æ±¾ºÅ.¿ÉÒÔͨ¹ýÁ¬½Ó³ÌÐòÀ´ÉèÖÃ,Èç: LINK /VERSION:2.0 MyApp.objÒ»°ãÔÚÉý¼¶Ê±Ê¹ÓÃ. 17)MajorSubsystemVersion 18)MinorSubsystemVersion ÉÏÃæÁ½¸öÓòÊÇÖ¸ÔËÐÐÕâ¸öpeÎļþËùÒªÇóµÄ×ÓϵͳµÄ°æ±¾ºÅ. 19)Win32VersionValue ×ÜÊÇ0 20)SizeOfImage peÎļþ×°ÈëÄÚ´æºóÓ³ÏñµÄ×Ü´óС.Èç¹ûSectionAlignmentÓòºÍFileAlignmentÓòÏàµÈ,ÄÇôÕâ¸öÖµÒ²ÊÇpeÎļþÔÚÓ²ÅÌÉϵĴóС. 21)SizeOfHeaders ´ÓÎļþ¿ªÊ¼µ½½Ú±í(°üº¬½Ú±í)µÄ×Ü´óС.ÆäºóÊǸ÷¸öÇø¶ÎµÄÊý¾Ý. 22)CheckSum peÎļþµÄCRCУÑéºÍ. 23)Subsystem peÎļþµÄÓû§½çÃæÊ¹ÓõÄ×ÓϵͳÀàÐÍ.¶¨ÒåÈçÏÂ: #define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem. #define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem. #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem. #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem. #define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem. #define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image runs in the Posix character subsystem. #define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // image is a native Win9x driver. #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Image runs in the Windows CE subsystem. 24)DllCharacteristics ×ÜΪ0 25)SizeOfStackReserve ΪÏ̵߳ÄÕ»³õʼ±£ÁôµÄÐéÄâÄÚ´æµÄ´óС,ĬÈÏΪ00100000h.Èç¹ûÔÚµ÷ÓÃCreateThreadº¯Êýʱָ¶¨¶ÑÕ»µÄ´óСΪ0,±»´´½¨µÄÏ̵߳ĶÑÕ»µÄ³õʼ´óС¾ÍÓëÕâ¸öÖµÏàͬ. 26)SizeOfStackCommit ΪÏ̵߳ÄÕ»³õʼÌá½»µÄÐéÄâÄÚ´æµÄ´óС.΢ÈíµÄÁ¬½Ó³ÌÐò°ÑÕâ¸öÖµÖÃΪ 1000h. 27)SizeOfHeapReserve Ϊ½ø³ÌµÄ¶Ñ±£ÁôµÄÐéÄâÄÚ´æµÄ´óС.ĬÈÏֵΪ 00100000h. 28)SizeOfHeapCommit Ϊ½ø³ÌµÄ¶Ñ³õʼÌá½»µÄÐéÄâÄÚ´æµÄ´óС.΢ÈíµÄÁ¬½Ó³ÌÐò°ÑÕâ¸öÖµÖÃΪ1000h. 29)LoaderFlags ͨ³£Îª0 30)NumberOfRvaAndSizes Êý¾ÝĿ¼½á¹¹Êý×éµÄÏîÊý,×ÜΪ 00000010h Õâ¸öÖµ¶¨ÒåÈçÏÂ: #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 31)IMAGE_DATA_DIRECTORY DataDirectory[0x10] Êý¾ÝĿ¼½á¹¹Êý×é IMAGE_DATA_DIRECTORY½á¹¹¶¨ÒåÈçÏÂ: typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; Ïà¶ÔÐéÄâµØÖ· DWORD Size; ´óС } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; Õâ¸ö½á¹¹°üº¬ÁËpeÎļþÖÐÖØÒª²¿·ÖµÄRVAµØÖ·ºÍ´óС.Õâ¸öÊý×éʹ²Ù×÷ϵͳµÄ¼ÓÔØ³ÌÐòÄܹ»¿ìËÙ¶¨Î»Ìض¨µÄÇø¶Î.¾ßÌ嶨ÒåÈçÏÂ: #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory // IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage) #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor |
2Â¥2006-08-26 09:31:31
sdlj8051
½ð³æ (ÖøÃûдÊÖ)
- Ó¦Öú: 0 (Ó×¶ùÔ°)
- ¹ó±ö: 0.1
- ½ð±Ò: 1149.8
- ºì»¨: 3
- Ìû×Ó: 2254
- ÔÚÏß: 18.1Сʱ
- ³æºÅ: 71297
- ×¢²á: 2005-05-30
- רҵ: µç·Óëϵͳ
|
pe֪ʶѧϰ£¨ËÄ£© ÏÂÃæÎÒÃÇҪѧϰµÄ¿ÉÒÔ˵ÊÇpeÎļþµÄºËÐÄÄÚÈÝÁË.¼´¿é±í(section table)ºÍ¸÷ÖÖ¿é(Çø¶Î)µÄ½á¹¹.ÕâЩÄÚÈݱȽ϶àÇÒ³¤.Òò´ËÎÒ»á°ÑдÍêµÄÏÈ·¢³öÀ´,È»ºóÔÚÂýÂýµÄÐøÍê.Ï£ÍûÄãÓÐÄÍÐÄ¿´ÏÂÈ¥.ѧϰÓÐʱÊǺܿÝÔïµÄ.Òò´ËÔÚÊʵ±µÄʱºòÎÒÒ²»á¸ø³öµãÓ¦ÓõÄʵÀý. Äã¿ÉÄÜ»¹¼ÇµÃ,Çø¿éµÄÊýÁ¿ÔÚIMAGE_FILE_HEADER½á¹¹µÄNumberOfSectionsÓò¶¨Òå.ºÃÁË,ÎÒÃÇ¿´¿´ºÍÇø¿éÃÜÇÐÏà¹ØµÄ¿é±íµÄ½á¹¹¶¨Òå. ¿é±í½á¹¹µÄ¶¨ÒåÈçÏÂ: #define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { 00h BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //¿éÃû,8¸ö×Ö½Ú³¤ 08h union { DWORD PhysicalAddress; //objÎļþÖÐ,Çø¶ÎµÄʵ¼ÊµØÖ· DWORD VirtualSize; //exeºÍdllÎļþÖÐÇø¶ÎÔÚÎļþÖÐ¶ÔÆëǰµÄ´óС } Misc; 0ch DWORD VirtualAddress; //¿éµÄRVA(Ïà¶ÔÐéÄâµØÖ·) 10h DWORD SizeOfRawData; //ÔÚÎļþÖÐ¶ÔÆëºóµÄ´óС 14h DWORD PointerToRawData; //ÔÚÎļþÖÐµÄÆ«ÒÆ 18h DWORD PointerToRelocations; //ÖØ¶¨Î»µÄÆ«ÒÆ(objÎļþÖÐʹÓÃ) 1ch DWORD PointerToLinenumbers; //ÐкűíµÄÆ«ÒÆ(µ÷ÊÔÓÃ) 1eh WORD NumberOfRelocations; //ÖØ¶¨Î»ÏîÊýÄ¿(objÎļþÖÐʹÓÃ) 20h WORD NumberOfLinenumbers; //ÐкűíÖÐÐкŵÄÊýÄ¿ 24h DWORD Characteristics; //¿éÊôÐÔ } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; ¿é±í½á¹¹ÃèÊöÁËÇø¶ÎµÄÒ»Ð©ÖØÒªµÄÊôÐÔ,ÏÂÃæ¾ßÌå½âÊÍһϸ÷¸öÓòµÄº¬Òå. 1)Name[8] 8¸ö×Ö½ÚµÄÇø¶ÎÃû,²»×ã8¸öºóÃæÓÃ0²¹Æë. 2)VirtualSize ÔÚexeºÍdllÎļþÖÐÕâ¸öÓò°üº¬µÄÊÇÇø¶Î»¹Ã»Óа´FileAlignmentÓò¶ÔÆëǰµÄ´óС.Èç¹ûÕâ¸ö½á¹¹ÃèÊöµÄÊÇ´úÂë¶Î,ÄÇôÕâ¸öÓòµÄÖµ¾ÍÊÇʵ¼ÊµÄ´úÂëÁ¿µÄ´óС.ÔÚpeÎļþµÄdiyʱ,Õâ¸öÓòºÜÓÐÓÃ.ËüÖ¸³öÁËÇø¶ÎÖÐÓжàÉÙûÓÐʹÓõĿռä.ÎÒÃÇ¿ÉÒÔÔÚûÓÐʹÓõĿռäÀï²åÈë×Ô¼ºµÄ´úÂë.ºÃ¶à²¡¶¾Ò²ÊǰѴúÂë²åÈëÊ£ÓàµÄ¿Õ¼äÀï.(ºÇºÇ,²»ÒªÑ§»µ.) 3)VirtualAddress ÔÚexeÎļþÖÐ,Õâ¸öÓòÊÇpeÎļþÓ³Éäµ½ÐéÄâÄÚ´æºó¸ÃÇø¶ÎµÄRVAµØÖ·.Õâ¸öÖµ¼ÓÉÏ»ùµØÖ·(IMAGE_OPTIONAL_HEADER32.ImageBase)ºó,¾ÍµÃµ½Á˸ÃÇø¶ÎÔÚÄÚ´æÖеÄʵ¼ÊÆðʼµØÖ·. 4)SizeOfRawData Õâ¸öÓòÊÇËüÃèÊöµÄÇø¶Î°´IMAGE_OPTIONAL_HEADER32.FileAlignmentÓò¶ÔÆëºóÔÚÎļþÖеĴóС.Èç¹ûFileAlignmentΪ 0200h,VirtualSizeΪ035Ah,ÔòÕâ¸öֵΪ 0400h. 5)PointerToRawData ËüÃèÊöµÄÇø¶ÎµÄÆðʼµØÖ·ÔÚpeÎļþÖÐµÄÆ«ÒÆ. 6)PointerToRelocations 7)PointerToLinenumbers 8)NumberOfRelocations 9)NumberOfLinenumbers ÉÏÃæÕâËĸöÓòÔÚ·¢Ðа汾µÄ³ÌÐòÀï¶¼ÊÇ0. 10)Characteristics ¸ÃÇø¶ÎµÄÊôÐÔÐÅÏ¢.ÓÃÓÚ±íʾÕâ¸öÇø¶ÎÊÇ´úÂë¡¢Êý¾Ý¡¢¿É¶Á¡¢¿ÉдµÈµÈ. Õâ¸öÓò¶¨ÒåÈçÏÂ(ÖØÒªµÄÒѾ×öÁËÖÐÎÄ×¢ÊÍ)£º // IMAGE_SCN_TYPE_REG 0x00000000 // Reserved. // IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved. // IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved. // IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved. #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved. // IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved. #define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code. //Çø¶Î°üº¬´úÂë #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data. //Çø¶Î°üº¬Òѳõʼ»¯Êý¾Ý #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data. //Çø¶Î°üº¬Î´³õʼ»¯Êý¾Ý #define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved. #define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments // or some other type of information. // IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved. #define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image. #define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat. // 0x00002000 // Reserved. // IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000 #define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 // Reset speculative exceptions handling bits // in the TLB entries for this section. #define IMAGE_SCN_GPREL 0x00008000 // Section content can be accessed relative to GP #define IMAGE_SCN_MEM_FARDATA 0x00008000 // IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000 #define IMAGE_SCN_MEM_PURGEABLE 0x00020000 #define IMAGE_SCN_MEM_16BIT 0x00020000 #define IMAGE_SCN_MEM_LOCKED 0x00040000 #define IMAGE_SCN_MEM_PRELOAD 0x00080000 #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 // #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 // #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 // #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 // #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified. #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 // #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 // #define IMAGE_SCN_ALIGN_128BYTES 0x00800000 // #define IMAGE_SCN_ALIGN_256BYTES 0x00900000 // #define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 // #define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 // #define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 // #define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 // #define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 // // Unused 0x00F00000 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // Section contains extended relocations. #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded. //¸ÃÇø¶Î¿É¶ªÆú #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable. #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable. #define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable. //¸ÃÇø¶Î¿É¹²Ïí #define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable. //¸ÃÇø¶Î¿ÉÖ´ÐÐ #define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable. //¸ÃÇø¶Î¿É¶Á #define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable. //¸ÃÇø¶Î¿Éд ÏÂÃæÎÒÃÇ¿´Ò»ÏÂpeÎļþÀï³£ÓõÄÒ»ÏÂÇø¶Î: 1).text code ÕâÀïÒ»°ã·ÅµÄÊÇ´úÂë. 2).data ÕâÀïÒ»°ã·ÅµÄÊÇÒѳõʼ»¯µÄÊý¾Ý. 3).idata ÕâÀïÒ»°ã·ÅµÄÊÇÊäÈë±í.Õâ¸öºóÃæ»¹ÒªÏêϸ½². 4).rsrc ÕâÀïÒ»°ã·ÅµÄÊÇ×ÊÔ´. 5).reloc ÕâÀïÒ»°ã·ÅµÄÊÇ»ùµØÖ·Öض¨Î»±í. 6).edata ÕâÀïÒ»°ã·ÅµÄÊÇÊä³ö±í. 7).tls ÕâÀïÒ»°ãÊÇÏֲ߳̾¿´æ´¢Êý¾Ý. 8).bbs ÕâÀïÒ»°ã·ÅµÄÊÇδ³õʼ»¯µÄÊý¾Ý. |
3Â¥2006-08-26 09:32:24
sdlj8051
½ð³æ (ÖøÃûдÊÖ)
- Ó¦Öú: 0 (Ó×¶ùÔ°)
- ¹ó±ö: 0.1
- ½ð±Ò: 1149.8
- ºì»¨: 3
- Ìû×Ó: 2254
- ÔÚÏß: 18.1Сʱ
- ³æºÅ: 71297
- ×¢²á: 2005-05-30
- רҵ: µç·Óëϵͳ
|
pe֪ʶѧϰ(Îå) ´ÓÕâÌù¿ªÊ¼,ÎÒ½éÉܼ¸¸ö³£ÓõÄÇø¶Î:ÊäÈë±í,Êä³ö±íºÍÖØ¶¨Î»±í. ÎÒÃÇÖªµÀ,³ÌÐòµ÷ÓÃÍⲿµÄdllº¯Êýͨ³£¶¼ÊÇÏÂÃæÕâÖÖÐÎʽ: call my_label ... my_label: jmp dword ptr [xxxxxxxx] ¶ÔÒ»¸ödllÖеĺ¯ÊýµÄµ÷ÓÃ×ÜÊÇͨ¹ýÒ»¸öµØÖ·¼ä½ÓµÄµ÷ÓõÄ.ÕâЩµØÖ·¾Í·ÅÔÚÊäÈë±íÀï. ÊäÈë±í(Import Table),¼ò¶øÑÔÖ®,¾ÍÊÇÃèÊö¸ÃpeÎļþ´ÓÄö¶¯Ì¬Á¬½Ó¿âµ¼ÈëÁËʲôº¯ÊýµÄÒ»×é½á¹¹Êý×é.ÔÚÕâÀïÎÒÏ£ÍûÄÜÓÃ×î¼ò½àµÄÓïÑÔÈÃÄãÃ÷°×ʲôÊÇÊäÈë±í.ÊäÈë±íµÄ×é³É²¢²»¸´ÔÓ,Ö»Óõ½Èý¸ö½á¹¹.ËüÃÇÊÇ:IMAGE_IMPORT_DESCRIPTOR£¬IMAGE_THUNK_DATA£¬IMAGE_IMPORT_BY_NAME. ÎÒÃÇÏÈ¿´Ò»Ï¿òͼ. IMAGE_IMPORT_DESCRIPTOR |--------------------| |-------------------------| OriginalFirstThunk | | |--------------------| | | TimeDateStamp | | |--------------------| | | ForwarderChain | | |--------------------| | | Name |----> "USER32.DLL" | |--------------------| | | FirstThunk |---------------------------| | |--------------------| | | | | Hint-name table IMAGE_IMPORT_BY_NAME import address table(IAT) | | |------------------| |--------------------| |------------------| | |-> | IMAGE_THUNK_DATA |-->| 44 | "GetMessage" |<--| IMAGE_THUNK_DATA |<---| |------------------| |----|---------------| |------------------| | IMAGE_THUNK_DATA |-->| 72 | "LoadIcon" |<--| IMAGE_THUNK_DATA | |------------------| |----|---------------| |------------------| | ...... |-->| .. | ...... |<--| ...... | |------------------| |----|---------------| |------------------| | NULL | | NULL | |------------------| |------------------| µ±È»,ÕâÊÇÃèÊö´ÓÒ»¸ödllÖÐÒýÈ뺯ÊýµÄÇéÐÎ.´Ó¼¸¸ödllÖÐÒýÈ뺯Êý,ÄÇô¾ÍÓм¸¸öÕâÑùµÄ½á¹¹.ͬʱ,ÕâÒ²ÊÇ´ÅÅÌÎļþÉϵĽṹ.×°ÈëÄÚ´æºóFirstThunkÖ¸ÏòµÄ½á¹¹Êý×é»á±»ÐÞ¸Ä.¿ÉÒÔ¿´ÏÂÃæµÄͼ. ÎÒÃÇÏÈÀ´ÊìϤһÏÂÕâÈý¸ö½á¹¹µÄ¶¨Òå: typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; // 0 for terminating null import descriptor DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA) }; DWORD TimeDateStamp; // 0 if not bound, // -1 if bound, and real date\time stamp // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND) // O.W. date/time stamp of DLL bound to (Old BIND) DWORD ForwarderChain; // -1 if no forwarders DWORD Name; DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses) } IMAGE_IMPORT_DESCRIPTOR; typedef struct _IMAGE_THUNK_DATA32 { union { PBYTE ForwarderString; PDWORD Function; DWORD Ordinal; PIMAGE_IMPORT_BY_NAME AddressOfData; } u1; } IMAGE_THUNK_DATA32; typedef struct _IMAGE_IMPORT_BY_NAME { WORD Hint; //Ö¸³öº¯ÊýÔÚËùÔÚµÄdllµÄÊä³ö±íÖеÄÐòºÅ BYTE Name[1]; //Ö¸³öÒªÊäÈëµÄº¯ÊýµÄº¯ÊýÃû } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; ÏÂÃæÎÒÃǽ²½âÒ»ÏÂIMAGE_IMPORT_DESCRIPTOR½á¹¹µÄ¸÷¸öÓòµÄº¬Òå: 1)union { DWORD Characteristics; DWORD OriginalFirstThunk; }; Õâ¸öÁªºÏÖ¸ÏòÒ»¸ö IMAGE_THUNK_DATA ÀàÐ͵ĽṹÊý×é.Õâ¸öÁªºÏ²»ÊǺÜÖØÒª,¿ÉÒÔΪ0. 2)TimeDateStamp ¸ÃdllµÄʱ¼äÈÕÆÚ´Á,Ò»°ãΪ0. 3)ForwarderChain ÕýÏòÁ¬½ÓË÷Òý.Ò»°ãΪ0. 4)Name dllÃû×ÖµÄRVA. 5)FirstThunk Õâ¸öÓòÒ²ÊÇÒ»¸öRVA,Ö¸ÏòÒ»¸öDWORDÊý×é,Êý×éÒÔNULL½áÊø.Êý×éÖеÄÿ¸öDWORDʵ¼ÊÉÏÊÇÒ»¸öIMAGE_THUNK_DATA½á¹¹µÄÁªºÏÌå¡£IMAGE_THUNK_DATAÁªºÏÌåͨ³£±»½âÊÍΪһ¸öÖ¸ÏòIMAGE_IMPORT_BY_NAME½á¹¹µÄRVA. ´ÓÉÏͼÎÒÃÇ¿ÉÒÔ¿´³öÓÐÁ½¸ö²¢ÐеÄÖ¸ÕëÊý×é¶¼Ö¸ÏòIMAGE_IMPORT_BY_NAME½á¹¹.ÊÂʵÉÏ,OriginalFirstThunkÖ¸ÏòµÄIMAGE_THUNK_DATA½á¹¹Êý×é´ÓÀ´²»±»ÐÞ¸Ä,¸ÃÊý×éÓÐʱҲ½ÐÌáʾÃû±í(Hint-name table),ÌáʾÃû±í×ÜÊÇÖ¸ÏòIMAGE_IMPORT_BY_NAME½á¹¹Êý×é.¶øFirstThunkÖ¸ÏòµÄIMAGE_THUNK_DATA½á¹¹Êý×éÔÚ¸ÃpeÎļþ±»¼ÓÔØÊ±,¼ÓÔØ³ÌÐò»áÐ޸ĸÃÊý×éµÄÄÚÈÝ.¼ÓÔØ³ÌÐòµü´úËÑË÷Êý×éµÄÿһ¸öÖ¸Õë,ÕÒµ½Ã¿Ò»¸öIMAGE_IMPORT_BY_NAME½á¹¹Ëù¶ÔÓ¦µÄÊäÈ뺯ÊýµÄµØÖ·,È»ºó¼ÓÔØ³ÌÐòÓÃÕÒµ½µÄµØÖ·ÐÞ¸ÄÏàÓ¦µÄIMAGE_THUNK_DATA½á¹¹. ÈçÇ°ÃæÌáµ½µÄ call my_label ... my_label: jmp dword ptr [xxxxxxxx] ÆäÖеÄxxxxxxxx¾ÍÊÇFirstThunkÖ¸ÏòµÄIMAGE_THUNK_DATAÊý×éÖеÄÒ»¸öµÄÖµ.ÒòΪFirstThunkËùÖ¸ÏòµÄÊý×éÔÚ¼ÓÔØºóÊÇËùÓÐÊäÈ뺯ÊýµÄµØÖ·,Òò´ËËü±»³ÆÎªÊäÈëµØÖ·±í(Import Address Table,IAT). peÎļþ¼ÓÔØºóÊäÈë±íµÄÇéÐÎÈçÏÂ: IMAGE_IMPORT_DESCRIPTOR |--------------------| |-------------------------| OriginalFirstThunk | | |--------------------| | | TimeDateStamp | | |--------------------| | | ForwarderChain | | |--------------------| | | Name |----> "USER32.DLL" | |--------------------| | | FirstThunk |---------------------------| | |--------------------| | | | | Hint-name table IMAGE_IMPORT_BY_NAME import address table(IAT) | | |------------------| |--------------------| |------------------| | |-> | IMAGE_THUNK_DATA |-->| 44 | "GetMessage" | |ptr of GetMessage |<---| |------------------| |----|---------------| |------------------| | IMAGE_THUNK_DATA |-->| 72 | "LoadIcon" | | ptr of LoadIcon | |------------------| |----|---------------| |------------------| | ...... |-->| .. | ...... | | ...... | |------------------| |----|---------------| |------------------| | NULL | | NULL | |------------------| |------------------| ÊäÈë±íÔÚpe֪ʶÀïÊÇ×îÖØÒªµÄÒ»²¿·Ö.Ï£ÍûÄãÄܹ»½áºÏÒ»ÏÂpe¹¤¾ßʵ¼ÊÀí½âÕⲿ·ÖµÄÄÚÈÝ. pe֪ʶѧϰ(Áù) ÓÐÊäÈë±í¾ÍÓÐÊä³ö±í,±¾Ìù¿ªÊ¼½éÉÜÊä³ö±í. ´ó²¿·Ödll¶¼»áÊä³öһЩº¯Êý.ÓÐЩpeÎļþÒ²»áÓÐÊä³ö±í.ͨ³£Êä³ö±í¶¼ÊÇ·ÅÔÚ.edataÇø¶ÎµÄ.Òò´Ë.edataÇø¶ÎµÄ×¢Òª³É·ÖÊǺ¯ÊýÃû±í,Èë¿ÚµãµØÖ·,Êä³öº¯ÊýµÄÐòºÅ. Êä³ö±íµÄ¿ªÊ¼²¿·ÖÊÇÒ»¸öIMAGE_EXPORT_DIRECTORY½á¹¹,Ö®ºó½ô½Ó×ÅÊÇÓɸýṹÖеÄij¸öÓòËùÖ¸ÏòµÄÊý¾Ý. IMAGE_EXPORT_DIRECTORY½á¹¹¶¨ÒåÈçÏÂ: typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; // RVA from base of image DWORD AddressOfNames; // RVA from base of image DWORD AddressOfNameOrdinals; // RVA from base of image } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; 1)Characteristics Õâ¸öÖµ×ÜΪ0. 2)TimeDateStamp º¬ÓÐÕâ¸öµ¼³ö±íµÄÎļþ±»Éú³ÉµÄʱ¼ä. 3)MajorVersion 4)MinorVersion °æ±¾ÐÅÏ¢.×ÜΪ0. 5)Name º¬ÓÐÕâ¸öµ¼³ö±íµÄpeÎļþµÄÃû×ÖµÄRVA. 6)Base Êä³öº¯ÊýÐòºÅµÄ¿ªÊ¼Öµ. 7)NumberOfFunctions Êý×é AddressOfFunctions ÖÐÔªËØµÄ¸öÊý.Õâ¸öÖµ¾ÍÊǵ¼³ö±íÖе¼³öº¯ÊýµÄ¸öÊý. 8)NumberOfNames ÒÔÃû×ÖÊä³öµÄº¯ÊýµÄ¸öÊý. 9)AddressOfFunctions ÕâÊÇÒ»¸öRVA,Ö¸ÏòÒ»¸öÓɺ¯ÊýµØÖ·×é³ÉµÄÊý×é.ÿһ¸öº¯ÊýµØÖ·ÊDZ¾Ä£¿éÖеÄÒ»¸öÊä³öº¯ÊýµÄÈë¿ÚµØÖ·. 10)AddressOfNames ÕâÊÇÒ»¸öRVA,Ö¸ÏòÒ»¸öÓÉ×Ö·û´®Ö¸Õë×é³ÉµÄÊý×é,ÿ¸ö×Ö·û´®ÊDZ¾Ä£¿éÖÐÒÔÃû×ÖÊä³öµÄÊä³öº¯ÊýµÄº¯ÊýÃû. 11)AddressOfNameOrdinals ÕâÊÇÒ»¸öRVA,Ö¸ÏòÒ»¸öwordÀàÐ͵ÄÊý×é,¸ÃwordÀàÐÍÊý×éÊDZ¾Ä£¿éÖÐËùÓÐÒÔÃû×ÖÊä³öµÄÊä³öº¯ÊýµÄÊä³öÐòºÅ. ¼ÙÉèÒ»¸ödllÓÐÈý¸öµ¼³öº¯Êý,·Ö±ðÈçÏÂ: ÐòºÅ º¯ÊýÃû 1 "myfun1" 2 3 "myfun2" ÆäÖÐÐòºÅΪ2µÄº¯ÊýÖ»ÄÜͨ¹ýÐòºÅµ¼³ö.ͼʾÈçÏÂ: IMAGE_EXPORT_DIRECTORY º¯ÊýµØÖ·±í |---------------------------| |------->|------------------| | Characteristics | | | 0x400042"myfun1" | |---------------------------| | |------------------| | ...... | | | 0x400085 | |---------------------------| | |------------------| | NumberOfFunctions = 3 | | | 0x400197"myfun2" | |---------------------------| | |------------------| | NumberOfNames = 2 | | |---------------------------| | º¯ÊýÃû±í | AddressOfFunctions |--| |----->|------------| |---------------------------| | | 0xXXXXXXXX |->"myfun1" | AddressOfNames |----| |------------| |---------------------------| | 0xXXXXXXXX |->"myfun2" | AddressOfNameOrdinals |----| |------------| |---------------------------| | | º¯ÊýÃû³ÆµØÖ·Ë÷Òý±í |----->|-----------| | 1 | |-----------| | 3 | |-----------| ÎÒÃÇÀ´¿´Ò»ÏÂpe¼ÓÔØ³ÌÐòµÄ¹¤×÷»úÖÆ.¼ÙÉèËüÖªµÀº¯ÊýÃû"myfun2",ÄÇô¼ÓÔØ³ÌÐò½«Ê×ÏȱéÀúº¯ÊýÃû±í,ÕÒµ½Æ¥ÅäµÄº¯ÊýÃû"myfun2".ÓÉÓÚ"myfun2"ÔÚº¯ÊýÃû±íÀïµÄË÷ÒýÊÇ2,ËùÒÔ¼ÓÔØº¯Êý½«ÔÚº¯ÊýÃû³ÆµØÖ·Ë÷Òý±íµÄµÚ¶þ¸öÔªËØÀïÈ¡µÃº¯ÊýÔÚº¯ÊýµØÖ·±íÀïµÄË÷Òý3,È»ºó¼ÓÔØ³ÌÐò¾Í»áÔÚº¯ÊýµØÖ·±íµÄµÚÈý¸öÔªËØÀïÈ¡µÃº¯ÊýµÄÈë¿ÚµØÖ·0x400197. Õâ¾ÍÊÇÒÔÃû³Æµ¼³öº¯ÊýµÄ¹ý³Ì. Èç¹ûÊÇÒÔÐòºÅµ¼³öº¯ÊýµØÖ·µÄ,Äǽ«¸ü¼òµ¥.¼ÓÔØ³ÌÐò½«Ö±½ÓÓÃÐòºÅÔÚº¯ÊýµØÖ·±íÀïÈ¡³öº¯ÊýµÄÈë¿ÚµØÖ·.¿ÉÒÔ¿´³ö,ÒÔÐòºÅµ¼³öº¯Êý±ÈÒÔÃû³Æµ¼³öº¯Êý¿ì,µ«ÒÔÐòºÅµ¼³öº¯ÊýµØÖ·»á´øÀ´Î¬»¤µÄÎÊÌâ.ÓÐЩapiº¯ÊýÔÚ²»Í¬µÄϵͳÉϵ¼³öÐòºÅ²¢²»Ïàͬ.ËùÒÔ΢Èí²»ÍÆ¼öʹÓÃÐòºÅÀ´µ¼³öº¯Êý. ÕâÀï½²µÄÊÇBaseΪ1ʱµÄÇéÐÎ,Èç¹ûBaseÓò´óÓÚ1,ÔòÔÚÈ¡µÃº¯ÊýÔÚº¯ÊýµØÖ·±íÖеÄË÷Òýºó,ÓÃÕâ¸öË÷ÒýÖµ¼õÈ¥Base¾Í¿ÉÒԵõ½º¯ÊýÔÚº¯ÊýµØÖ·±íÖÐµÄÆ«ÒÆÖµ. pe֪ʶѧϰ(Æß)--Íê ¡¡ ÕâÒ»Ìù½éÉÜÒ»ÏÂpeÎļþÖеÄÖØ¶¨Î»±í. ÖØ¶¨Î»µÄ¸ÅÄî²»ÄÑÀí½â.¼òµ¥µÄ˵,¾ÍÊÇÒòΪ³ÌÐò±»Á¬½ÓºóһЩ±äÁ¿»òÕߺ¯Êýµ÷ÓûòÌø×ªÖ¸ÁîʹÓÃÁ˾ø¶ÔµØÖ·,µ±×°ÔسÌÐò²»ÄܰÑpeÓ³Ïñ×°µ½Ô¤¶¨µÄµØÖ·(ImageBase)ʱ,ÄÇôÕâЩ¾ø¶ÔµØÖ·¾ÍÐèÒªµ÷Õû.·ñÔò³ÌÐò½«·ÃÎʵ½´íÎóµÄµØÖ·. exeÎļþÒ»°ã²»ÐèÒªÖØ¶¨Î»,ÒòΪÿ¸öexeÎļþÓ³Ïñ¶¼ÓÐ×Ô¼º¶ÀÁ¢µÄµØÖ·¿Õ¼ä,Ëü×ÜÄܱ»Ó³Éäµ½Ô¤¶¨µÄµØÖ·.¶ødllÎļþÒ»°ãÊÇÓ³Éäµ½exeÎļþµÄµØÖ·¿Õ¼äµÄ.µ±¶à¸ödllÎļþµÄÔ¤¶¨µØÖ··¢Éú³åͻʱ,¾Í²»Äܱ£Ö¤»á±»Ó³Éäµ½Ô¤¶¨µÄµØÖ·ÁË.ËùÒÔdllÎļþÒ»°ã¶¼ÐèÒªÖØ¶¨Î»µÄ. ÄÇÃ´ÖØ¶¨Î»ÊÇÔõÑùʵÏÖµÄÄØ? ÔÚpeÎļþÀïÓÃÕâÑùÒ»¸ö½á¹¹À´ÃèÊöÒ»¸öÖØ¶¨Î»Êý¾ÝÏî: typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD TypeOffset[1]; } IMAGE_BASE_RELOCATION; 1)VirtualAddress Õâ¸öÓò°üº¬Õâ¸öÖØ¶¨Î»Êý¾ÝÏîµÄÆðʼRVAÖµ,½ô¸úÔڽṹºóÃæµÄÆ«ÒÆÖµÒª¼ÓÉÏÕâ¸öÖµ²ÅÊÇÒ»¸öÕæÕýµÄÐèÒªÖØ¶¨Î»µÄÊý¾ÝµÄRVAÖµ. Èç¹ûÕâ¸öÓòΪ0,Ôò´ú±íһϵÁÐÖØ¶¨Î»Êý¾ÝÏîµÄ½áÊø. 2)SizeOfBlock ÖØ¶¨Î»Êý¾ÝÏîµÄ´óС. 3)TypeOffset[1] ÕâÊÇÒ»¸öWORDÀàÐ͵ÄÊý×é.Êý×éµÄÔªËØ¸öÊýÓÉ(SizeOfBlock - 8 ) \ 2 µÃµ½.ÿ¸öÔªËØµÄµÍ12λ´ú±íÒ»¸öÆ«ÒÆÖµ,¸ÃÆ«ÒÆÖµ¼ÓÉÏVirtualAddress¾ÍÊÇÐèÒªÐÞÕýµÄÊý¾ÝµÄRVAÖµ.¶ø¸ß4λ´ú±í¸ÃÆ«ÒÆÖµµÄÀàÐÍ.¸ÃÀàÐͶ¨ÒåÈçÏÂ: #define IMAGE_REL_BASED_ABSOLUTE 0 #define IMAGE_REL_BASED_HIGH 1 #define IMAGE_REL_BASED_LOW 2 #define IMAGE_REL_BASED_HIGHLOW 3 #define IMAGE_REL_BASED_HIGHADJ 4 #define IMAGE_REL_BASED_MIPS_JMPADDR 5 #define IMAGE_REL_BASED_SECTION 6 #define IMAGE_REL_BASED_REL32 7 #define IMAGE_REL_BASED_MIPS_JMPADDR16 9 #define IMAGE_REL_BASED_IA64_IMM64 9 #define IMAGE_REL_BASED_DIR64 10 #define IMAGE_REL_BASED_HIGH3ADJ 11 ÆäÖкÍintelµÄcpuÓйصÄÖ»ÓÐÁ½ÖÖÀàÐÍ.ÆäËûµÄ¶¼ÓÃÓÚi386ÒÔÍâµÄcpu. 0 (IMAGE_REL_BASED_ABSOLUTE):´ú±í¸ÃÆ«ÒÆÖµÎÞÒâÒå.Ö»ÊÇΪÁËʹËùÓÐÖØ¶¨Î»Êý¾ÝÏîµÄ´óСλDWORDµÄÕûÊý±¶. 3 (IMAGE_REL_BASED_HIGHLOW): °Ñ¸ÃÆ«ÒÆÖµ¼ÓÉÏ VirtualAddress¾ÍÊÇÒªÐÞÕýµÄÊý¾ÝµÄRVAÖµ. ÓÉÓÚWORDÖÐÖ»ÓеÍ12λ±íÊ¾Æ«ÒÆÖµ,Òò´ËÒ»¸öÖØ¶¨Î»ÏîÖ»ÄÜÐÞÕýÒ»Ò³µÄÊý¾Ý(4k).Èç¹ûÐèÒªÖØ¶¨Î»µÄÊý¾Ý³¬¹ý4k,ÄÇôһ¸öpeÎļþÀï¾ÍÓжà¸öÖØ¶¨Î»Ïî. ¼ÓÔØ³ÌÐòÐÞÕý¹ý³ÌÈçÏÂ:¼ÙÉèIMAGE_OPTIONAL_HEADER.ImageBaseµÄֵΪ0x400000,¶øÊµ¼ÊpeÓ³Ïñ±»¼ÓÔØµÄµØÖ·Îª0x500000,ʵ¼Ê¼ÓÔØµÄµØÖ·±ÈÔ¤¶¨µÄ¸ß0x100000,ÄÇôÐèÒªÐÞÕýµÄÊý¾Ý¶¼»á±»¼ÓÉÏ0x100000. ÕâÀïËù˵µÄÐèÒªÐÞÕýµÄÊý¾ÝÊÇÖ¸Ç°ÃæÌáµ½µÄ±äÁ¿µÄ¾ø¶ÔµØÖ·ºÍµ÷ÓûòÌø×ªÖ¸ÁîÀﺬÓеľø¶ÔµØÖ·. µ½ÕâÀïpe֪ʶѧϰ¾Í¸æÒ»¶ÎÂäÁË.Ï£ÍûÕâЩÌû×ÓÄܰïÖúÄãÁ˽âpeÎļþµÄ´ó¸Å֪ʶ.¸üϸ½ÚµÄ֪ʶ¿ÉÒÔµ½msdnÀï²éÕÒ.ÎÒµÄˮƽÓÐÏÞ,´íÎóÖ®´¦»¹ÍûÄãÄܹ»¸øÓèÖ¸Õý.ÎÒ½«²»Ê¤¸Ð¼¤. |
4Â¥2006-08-26 09:32:35
¿É¿ÉÎ÷Àï
ľ³æÖ®Íõ (ÎÄѧ̩¶·)
çÞÌåÕß˵
- Ó¦Öú: 170 (¸ßÖÐÉú)
- ¹ó±ö: 0.271
- ½ð±Ò: 71619.6
- É¢½ð: 1291
- ºì»¨: 150
- ɳ·¢: 35
- Ìû×Ó: 58413
- ÔÚÏß: 2274.6Сʱ
- ³æºÅ: 244935
- ×¢²á: 2006-04-22
- ÐÔ±ð: MM
- רҵ: ÌìÌåÖлù±¾ÎïÀí¹ý³ÌµÄÀíÂÛ

5Â¥2006-08-26 20:15:53











)
;
»Ø¸´´ËÂ¥