Listeaza modulele si functiile importate de un fisier executabil

Listeaza modulele si functiile importate de un fisier executabil

Postby opc0de » 02 Mar 2011, 19:16

  1. program iat;
  2.  
  3. uses Windows,classes,Dialogs,SysUtils;
  4.  
  5. {$APPTYPE CONSOLE}
  6. type
  7.   PImageImportDescriptor = ^TImageImportDescriptor;
  8.   TImageImportDescriptor = packed record
  9.     OriginalFirstThunk: DWORD;
  10.     TimeDateStamp: DWORD;
  11.     ForwarderChain: DWORD;
  12.     Name: DWORD;
  13.     FirstThunk: DWORD;
  14.   end;
  15.  
  16. type
  17.   PImportByName = ^TImportByName;
  18.   TImportByName = packed record
  19.     Hint:Word;
  20.     Name:array[0..255] of char;
  21.   end;
  22.  
  23.  PImageThunkData = ^TImageThunkData;
  24.  TImageThunkData = record
  25.     case Integer of
  26.       0: (ForwarderString: PByte);
  27.       1: (Function_: PDWORD);
  28.       2: (Ordinal: ULONG);
  29.       3: (AddressOfData: PImportByName);
  30.   end;
  31.  
  32. var
  33. module:array of byte;
  34. FS:TFileStream;
  35. i:Integer;
  36. dwIatPos,modul,dwStart,dwFunc:DWORD;
  37. IDH:TImageDosHeader;
  38. INH:TImageNtHeaders;
  39. ISH:PImageSectionHeader;
  40. IIT:PImageImportDescriptor;
  41. IBN:TImportByName;
  42. ITD:PImageThunkData;
  43.  
  44.  
  45.  
  46.  
  47. function RVAToOffset(dwRVA:DWORD; dwVA:DWORD; dwRaw:DWORD):DWORD;
  48. begin
  49.   Result := dwRVA - dwVA + dwRaw;
  50. end;
  51.  
  52. begin
  53.  
  54.   FS:=TFIleStream.Create(paramstr(1),fmOpenRead);
  55.     if Assigned(FS) then
  56.     begin
  57.     SetLength(module,FS.size+1);
  58.     FS.ReadBuffer(module[0],fs.size);
  59.     FS.Free;
  60.     end
  61.     else WriteLn('Error mapping file');
  62.  
  63.   CopyMemory(@IDH,@module[0],Sizeof(IDH));
  64.   CopyMemory(@INH,@module[IDH._lfanew],Sizeof(INH));
  65.      for i := 0 to INH.FileHeader.NumberOfSections - 1 do
  66.         begin
  67.           ISH := @module[IDH._lfanew + 248 + i * 40];
  68.           if (INH.OptionalHeader.DataDirectory[1].VirtualAddress >= ISH^.VirtualAddress) and (INH.OptionalHeader.DataDirectory[1].VirtualAddress < (ISH^.VirtualAddress + ISH.Misc.VirtualSize)) then
  69.           begin
  70.             dwIATPos := RVAToOffset(INH.OptionalHeader.DataDirectory[1].VirtualAddress, ISH^.VirtualAddress, ISH^.PointerToRawData);
  71.             Break;
  72.           end;
  73.         end;
  74.   if dwIATPos>0 then
  75. begin
  76.      IIT:=@module[dwIATPos];
  77. repeat
  78.      modul:=IIT^.Name;
  79.      modul:=RVAToOffset(modul,ISH^.VirtualAddress,ISH^.PointerToRawData);
  80.      WriteLn(Pchar(@module[modul]));
  81.      if IIT^.OriginalFirstThunk>0 then
  82.      dwStart:=RVAToOffset(IIT^.OriginalFirstThunk,ISH.VirtualAddress,ISH.PointerToRawData)
  83.      else
  84.      dwStart:=RVAToOffset(IIT^.FirstThunk,ISH.VirtualAddress,ISH.PointerToRawData);
  85.      dwFunc:=dwStart;
  86. ITD:=@module[dwFunc];
  87. Readln;
  88. repeat
  89. dwStart:=DWORD(ITD^.addressofdata);
  90. dwStart:=RVAToOffset(dwStart,ISH.VirtualAddress,ISH.PointerToRawData);
  91. CopyMemory(@IBN,@module[dwStart],SizeOf(IBN));
  92. WriteLn(IBN.Name);
  93. Inc(dwFunc,Sizeof(ITD));
  94. ITD:=@module[dwFunc];
  95. until DWORD(ITD^.AddressOfData)=0;
  96. Inc(dwIATPos,Sizeof(TImageImportDescriptor));
  97. IIT:=@module[dwIATPos+sizeof(TImageSectionHeader)];
  98. until IIT^.Name=0;
  99. ReadLn;
  100. end;
  101. end.
1p / 1 votes
User avatar
opc0de
Bit
 
Joined: 11 Feb 2011
Status: 2

Re: Listeaza modulele si functiile importate de un fisier executabil

Postby DarkByte » 02 Mar 2011, 19:50

Suna bine, da' nu mai am timp de verificat ce si cum. Ti-am modificat putin postul, restul comentariilor mele de la alternativa IsDebuggerPresent se cam aplica si aici.

Bafta !
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140


Return to Snippets

Who is online

Users browsing this forum: No registered users and 0 guests

cron