таблица импорта

Тема в разделе "WASM.WIN32", создана пользователем nMaxwell, 23 мар 2011.

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    nMaxwell
    По другому никак, повторять уже надоело.
     
  2. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    про форварды не знал, спасибо, но все-таки переформировать таблицу импорта как то можно
     
  3. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Отсутствием желания в первую очередь подкованным нехваткой свободного времени, если для вас формат таблицы импорт PE файла сложна, исходня из ваших ответах мне, то вам следует ее изучить так же, как и автору.

    Все последующие ответы желательно писать в ЛС, дабы не разводить флуд.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    да, в современном бешеном темпе жизни очень тяжело найти пол часа, чтобы написать программу пересобирающую таблицу импорта... как я вас понимаю...
     
  5. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    Sunzer
    помоги а не унижай, в этом и есть смысл этого форума
     
  6. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    смысл форума не в том чтобы разжевывать вам открытый формат исполняемых файлов и разжеванный в куче статей сто лет назад. Вам же сказали методы, а писать вы должны сами.
     
  7. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Естественно не учитываются различные исключительные ситуации.

    Код (Text):
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <windows.h>
    4.  
    5. const char DLL_Name_Target[] = "kernel32.dll";
    6. const char DLL_Name_New[] = "kernel33.dll";
    7. const char API_Name_Target[] = "ExitProcess";
    8.  
    9. struct struct_Section
    10. {
    11.  char Name[8];
    12.  DWORD VirtualSize;
    13.  DWORD VirtualAddress;
    14.  DWORD PhysicalSize;
    15.  DWORD PhysicalOffset;
    16.  DWORD PointerToRelocations;
    17.  DWORD PointerToLinenumbers;
    18.  WORD NumberOfRelocations;
    19.  WORD NumberOfLinenumbers;
    20.  DWORD Characteristics;
    21. } *pSection;
    22.  
    23. struct struct_IMAGE_IMPORT_DESCRIPTOR
    24. {
    25.  DWORD OriginalFirstThunk;
    26.  DWORD TimeDateStamp;
    27.  DWORD ForwarderChain;
    28.  DWORD DllNameOffset;
    29.  DWORD FirstThunk;
    30. } *pIID, *orig_pIID;
    31.  
    32. WORD SectionNum;
    33.  
    34. DWORD RVA2RAW(DWORD RVA)
    35. {
    36.  for(int i=0;i<SectionNum;i++) if(RVA >= pSection[i].VirtualAddress && RVA <= pSection[i].VirtualAddress + pSection[i].VirtualSize)
    37.  {
    38.   return pSection[i].PhysicalOffset + (RVA - pSection[i].VirtualAddress);
    39.  }
    40.  
    41.  return 0;
    42. }
    43.  
    44. DWORD AlignValue(DWORD Value, DWORD Alignment)
    45. {
    46.   return (Value % Alignment != 0) ? Value += Alignment - (Value % Alignment) : Value;
    47. }
    48.  
    49. int main(int argc, char *argv[])
    50. {
    51.  DWORD i, FileSize, PEHeaderOffset, ImportTableAddr, pAPI, orig_ImportTableAddr;
    52.  WORD SizeOfOptionalHeaders;
    53.  struct struct_Section NewSection;
    54.  struct struct_IMAGE_IMPORT_DESCRIPTOR NewIID;
    55.  byte *File;
    56.  FILE* FHandle;
    57.  bool Exists = false;
    58.  
    59.  if(argc < 2) return -1;
    60.  
    61.  FHandle = fopen(argv[1], "rb+");
    62.  if(FHandle == NULL) return -1;
    63.  
    64.  fseek(FHandle, 0, SEEK_END);
    65.  FileSize = ftell(FHandle);
    66.  fseek(FHandle, 0, SEEK_SET);
    67.  File = (byte*) malloc(FileSize);
    68.  fread(File, 1, FileSize, FHandle);
    69.  
    70.  PEHeaderOffset         = *(PDWORD) &File[0x3C];
    71.  SectionNum             = *(PWORD)  &File[PEHeaderOffset+0x06];
    72.  SizeOfOptionalHeaders  = *(PWORD)  &File[PEHeaderOffset+0x14];
    73.  ImportTableAddr        = *(PDWORD) &File[PEHeaderOffset+0x80];
    74.  
    75.  pSection = (struct struct_Section*) malloc(sizeof(struct struct_Section)*SectionNum);
    76.  for(i=0;i<SectionNum;i++) memcpy(&pSection[i], &File[PEHeaderOffset+SizeOfOptionalHeaders+0x18+i*sizeof(struct struct_Section)], sizeof(struct struct_Section));
    77.  
    78.  ImportTableAddr = RVA2RAW(ImportTableAddr);
    79.  
    80.  if(ImportTableAddr == 0) return -1;
    81.  
    82.  orig_pIID = pIID;
    83.  orig_ImportTableAddr = ImportTableAddr;
    84.  
    85.  pIID = (struct struct_IMAGE_IMPORT_DESCRIPTOR*) &File[ImportTableAddr];
    86.  while(pIID->DllNameOffset != 0)
    87.  {
    88.     if(strcmpi((char*) &File[RVA2RAW(pIID->DllNameOffset)], DLL_Name_Target) == 0)
    89.     {
    90.         pAPI = RVA2RAW(pIID->FirstThunk);
    91.         while(*(PDWORD) &File[pAPI] != 0)
    92.         {
    93.             if(strcmpi((char*) &File[RVA2RAW(*(PDWORD) &File[pAPI])+2], API_Name_Target) == 0)
    94.             {
    95.                 Exists = true;
    96.                 break;
    97.             }
    98.             pAPI += 4;
    99.         }
    100.     }
    101.         else
    102.     {
    103.         ImportTableAddr += sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR);
    104.         pIID = (struct struct_IMAGE_IMPORT_DESCRIPTOR*) &File[ImportTableAddr];
    105.     }
    106.     if(Exists) break;
    107.  }
    108.  
    109.  if(!Exists) return -1;
    110.  
    111.  /* Создаем новую секцию */
    112.  *(PWORD)  &File[PEHeaderOffset+0x06] = SectionNum+1;
    113.  
    114.  File = (byte*) realloc(File, FileSize+0x1000);
    115.  FileSize += 0x1000;
    116.  
    117.  strcpy(NewSection.Name, ".NewImp");
    118.  NewSection.VirtualSize             = 0x1000;
    119.  NewSection.VirtualAddress          = AlignValue(pSection[SectionNum-1].VirtualAddress + pSection[SectionNum-1].VirtualSize, 0x1000);
    120.  NewSection.PhysicalSize            = 0x1000;
    121.  NewSection.PhysicalOffset          = pSection[SectionNum-1].PhysicalOffset + pSection[SectionNum-1].PhysicalSize;
    122.  NewSection.PointerToRelocations    = 0;
    123.  NewSection.PointerToLinenumbers    = 0;
    124.  NewSection.NumberOfRelocations     = 0;
    125.  NewSection.NumberOfLinenumbers     = 0;
    126.  NewSection.Characteristics         = 0x40000040;
    127.  memcpy(&File[PEHeaderOffset+SizeOfOptionalHeaders+0x18+sizeof(struct struct_Section)*SectionNum], &NewSection, sizeof(struct struct_Section));
    128.  
    129.  /* Новый адрес таблицы импорта */
    130.  *(PDWORD) &File[PEHeaderOffset+0x80] = NewSection.VirtualAddress;
    131.  *(PDWORD) &File[PEHeaderOffset+0x50] = NewSection.VirtualAddress + NewSection.VirtualSize;
    132.  
    133.  /* Пересобираем таблицу импорта */
    134.  i = 0;
    135.  pIID = (struct struct_IMAGE_IMPORT_DESCRIPTOR*) &File[orig_ImportTableAddr];
    136.  while(pIID->DllNameOffset != 0)
    137.  {
    138.     memcpy(&File[NewSection.PhysicalOffset+sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i], &File[orig_ImportTableAddr], sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR));
    139.     orig_ImportTableAddr += sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR);
    140.     pIID = (struct struct_IMAGE_IMPORT_DESCRIPTOR*) &File[orig_ImportTableAddr];
    141.     i++;
    142.  }
    143.  
    144.  i+=2;
    145.  
    146.  /* Формируем новый IMAGE_IMPORT_DESCRIPTOR */
    147.  NewIID.OriginalFirstThunk  = 0x00000000;
    148.  NewIID.TimeDateStamp       = 0x00000000;
    149.  NewIID.ForwarderChain      = 0x00000000;
    150.  NewIID.DllNameOffset       = NewSection.VirtualAddress + 8 + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i;
    151.  NewIID.FirstThunk          = NewSection.VirtualAddress + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i;
    152.  
    153.  /* Записываем новое имя DLL и API */
    154.  strcpy((char*) &File[NewSection.PhysicalOffset + 8 + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i], DLL_Name_New);
    155.  strcpy((char*) &File[NewSection.PhysicalOffset + 8 + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i+strlen(DLL_Name_New)+3], API_Name_Target);
    156.  
    157.  *(PDWORD) &File[NewSection.PhysicalOffset + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i] = NewSection.VirtualAddress + 8
    158.                                                                                                 +sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i
    159.                                                                                                 +strlen(DLL_Name_New) + 1;
    160.  
    161.  /* Записываем новый IMAGE_IMPORT_DESCRIPTOR */
    162.  memcpy(&File[NewSection.PhysicalOffset+sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*(i-2)], &NewIID, sizeof(NewIID));
    163.  
    164.  fseek(FHandle, 0, SEEK_SET);
    165.  fwrite(File, 1, FileSize, FHandle);
    166.  fclose(FHandle);
    167. }
     
  8. 737061

    737061 New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    74
    nMaxwell
    о! а вот и начальник форума!
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Sunzer
    Что это? Оно ломает программы нафик. ^)
     
  10. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Давайте файл который не обрабатывается.

    Нет файла - нет проблемы.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Sunzer
    Попробовал 3 программы, ломает все. Какая нафик проблема. ^) Неработающее поделие.
     
  12. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Хоть одну можно увидеть, или это приватный дельфе вирус?)
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Да какой там вирус. ^)
     
  14. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    А что конкретно ломает-то? То что kernel33.dll не может найти загрузчик?)))

    [​IMG]
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Sunzer
    Не смешите ^)
     
  16. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Что-то серьезней? Какой диагноз? Из вас не так просто слово вытащить.
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Sunzer
    Вы сами то положили её? Или вы не понимаете как пользоваться своей собственной программой?
     
  18. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Кого положил? Библиотеку? Зачем, "kernel33.dll" это случайное имя которое предложил ТС, ясен пень что нет такой dll.
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Не знаю какой ещё за пень, но я положил переименованную kernel32.dll в каталог.
    [​IMG]
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В импорте ахтунг. ^)