Pag-aaral ng format ng file ng PE (4): pag-import ng talahanayan

Pe File Format Learning



I-UPDATE:

  • Nai-update ang isang larawan sa pagtatapos ng artikulo, na natagpuan sa Internet, upang makatulong na maunawaan ang istraktura ng talahanayan ng pag-import

1.pangkahalatang ideya

Ang pag-import ng isang talahanayan ay isang mas mahalagang talahanayan sa reverse at pagtatasa ng virus. Kapag pinag-aaralan ang isang virus, dapat mong tingnan ang mga nilalaman ng talahanayan ng pag-import ng programa halos sa unang pagkakataon upang matukoy kung aling mga pagpapaandar ang ginagamit ng programa.



Ang talahanayan ng pag-import ay ang pangalawang elemento sa talahanayan ng katalogo ng data, na inilagay pagkatapos ng talahanayan ng pag-export.



2. I-import ang pagsusuri sa talahanayan

Tingnan natin ang istraktura ng talahanayan ng pag-import sa file ng PE:



struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics DWORD OriginalFirstThunk } DUMMYUNIONNAME DWORD TimeDateStamp DWORD ForwarderChain DWORD Name DWORD FirstThunk } IMAGE_IMPORT_DESCRIPTOR

Bago ang patlang ng paglalarawan, dapat pansinin na ang talahanayan ng pag-import ay isang array, ang bawat elemento ay ang istraktura sa itaas, ang haba ay 14h, at ang '0' ng 14h bytes ay ginagamit bilang pagtatapos ng array. Kung ang programa ay nag-import ng maraming mga module. , pagkatapos ang haba ng array na ito ay dapat na 14h * (n + 1).

Ang sumusunod ay isang paglalarawan ng mga patlang.



DWORD TimeDateStamp: Pangkalahatang walang laman, naaayon sa 0x00000000 sa nasa itaas na pigura

DWORD ForwarderChain: naaayon sa itaas na pigura na 0x00000000

Pangalan ng DWORD: I-import ang RVA ng pangalan ng module, naaayon sa 0x0000230c sa nasa itaas na pigura.

Mga Katangian ng DWORD: ay isang unyon na may OrginalFirstThunk, na naaayon sa itaas na pigura 0x0000227c

Ang DWORD OrginalFirstThunk: ay isang kasunduan na may Mga Katangian. Pangkalahatan, ang OrginalFirstThunk ay magkakabisa. Ito ang RVA ng hanay ng IMAGE_THUNK_DATA, na tumutugma sa 0x0000227c sa nasa itaas na pigura.

Tingnan natin ang istraktura ng IMAGE_THUNK_DATA.

struct _IMAGE_THUNK_DATA32{ union { DWORD ForwarderString DWORD Function the memory address of the function being input DWORD Ordinal The ordinal value of the API being entered DWORD AddressOfData The high bit is 0 to point to IMAGE_IMPORT_BY_NAME structure 2 }u1 }IMAGE_THUNK_DATA32

Alam namin na ang RVA na tumuturo sa IMAGE_THUNK_DATA ay 0x0000227c, at ang offset ay 107ch. Simula mula 107ch hanggang sa magtatapos sa 0x00000000 ay isang kumpletong hanay ng mga na-import na pag-andar, tulad ng ipinakita sa ibaba:

Ipapaliwanag namin ang mga patlang ng IMAGE_THUNK_DATA isa-isa.

ForwarderString: Ito ay wasto lamang kapag ang ForwarderChain sa IMAGE_IMPORT_DESCRIPTOR ay may halaga

Pag-andar: Ang aktwal na address ng memorya ng na-import na pag-andar, na wasto lamang kapag na-load ito sa memorya.

Ordinal: I-export ang serial number ng pagpapaandar. Pinapayagan ka ng talahanayan ng pag-export na i-export ang pagpapaandar gamit ang serial number. Ang talahanayan ng pag-import ay mayroon ding kaukulang mekanismo. Balido lamang kapag ang pinakamataas na bahagi ng IMAGE_THUNK_DATA ay 1.

AddressOfData: Kapag ang pinakamataas na bahagi ng IMAGE_THUNK_DATA ay 0, wasto na ituro ang isang hanay ng istraktura ng IMAGE_IMPORT_BY_NAME. Mayroon bang posibilidad na ang pinakamataas na bit ay 1, at ang pagpapaandar ay na-import bilang isang pangalan ng pag-andar? Alam namin na ang pinakamababang bilang na may maximum na bit na 1 ay 0x80000000 din. Ang posisyon na ito ay puwang ng system at ang programa ay hindi maa-access, kaya imposible.

Ang istraktura ng IMAGE_IMPORT_BY_NAME ay ang mga sumusunod:

struct _IMAGE_IMPORT_BY_NAME { WORD Hint BYTE Name[1] } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME

Pahiwatig: ipinapahiwatig ang pagkakasunud-sunod ng bilang ng pagpapaandar sa output table ng dll kung saan ito matatagpuan.

Pangalan: ipinapahiwatig ang pangalan ng pag-andar ng pagpapaandar na ipinasok

Susunod ay ang huling larangan ng IMAGE_IMPORT_DESCRIPTOR.

DWORD FirstThunk: Tumutugma sa 0x00002000 sa larawan na IMAGE_IMPORT_DESCRIPTOR. Itinuturo nito ang parehong lokasyon sa disk bilang OriginalFirstThunk, at tumuturo din sa hanay ng IMAGE_THUNK_DATA. Kung ang file ng PE ay na-load sa memorya, ang Function sa IMAGE_THUNK_DATA array na itinuro ng FirstThunk ay nag-iimbak ng address ng pag-andar sa totoong memorya. Ang OriginalFirstThunk ay tumuturo din sa hanay na IMAGE_THUNK_DATA, ngunit ang address ng pag-andar sa totoong memorya ay hindi nai-save, ngunit ang hanay ng IMAGE_IMPORT_BY_NAME. Ang RVA, nai-save ang pangalan ng file ng pag-andar ng pag-import.

3. Buod

1. Ang pangunahing punto ay upang makilala ang pagkakaiba sa pagitan ng OriginalFirstThunk at FirstThunk sa disk at sa memorya. Pareho ang pareho sa disk. Sa memorya, ang istraktura ng IMAGE_THUNK_DATA ng dating ay magkakabisa sa field na AddressOfData, kaya't tumuturo ito sa RVA ng hanay na IMAGE_IMPORT_BY_NAME, kaya kilala rin ito bilang INT, ang huli ay nagtataglay ng tunay na address ng na-import na pag-andar sa memorya, kaya't ay tinatawag na IAT.

2. Kinakailangan na linawin na ang talahanayan ng pag-import sa PE, iyon ay, ang istraktura ng IMAGE_IMPORT_DESCRIPTOR ay nasa isang array, nangangahulugan na maaaring maraming mga talahanayan ng pag-import sa isang file na PE, at mayroon lamang isang OriginalFirstThunk at FirstThunk sa bawat talahanayan ng pag-import , ngunit tinuturo nila ang IMAGE_THUNK_DATA ay isang array. Ang bilang ng mga elemento sa array ay kumakatawan sa bilang ng mga pag-andar. Kung ang patlang ng AddressOfData sa IMAGE_THUNK_DATA ay wasto, tumuturo ito sa isang hanay ng IMAGE_IMPORT_BY_NAME. Ang bilang ng mga elemento sa array na ito ay maaaring magkakaiba sa na sa IMAGE_THUNK_DATA sapagkat mayroong Ang pangalan ay walang pangalan.

3. Ang huli ng array ay dapat na puno ng 0, ang haba ay ang laki ng elemento ng array, at ang string ay nagtatapos sa 00.