Вопрос по шифрованию таблицы импорта

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by hiphop191817, 13 Jul 2009.

  1. hiphop191817

    hiphop191817 New Member

    Joined:
    25 Apr 2009
    Messages:
    26
    Likes Received:
    0
    Reputations:
    0
    Пишу свой криптор.В ходе работы возник вопрос-почему нельзя шифровать таблицу импорта так же как например таблицу данных или таблицу кода?

    Объясните кто-нибудь или киньте ссылки-как решить данную проблему.
     
  2. spider-intruder

    spider-intruder Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    700
    Likes Received:
    339
    Reputations:
    37
    А кто тебе сказал что нельзя? 0_o
     
  3. hiphop191817

    hiphop191817 New Member

    Joined:
    25 Apr 2009
    Messages:
    26
    Likes Received:
    0
    Reputations:
    0
    При запуске программы загрузчик ОС получает адреса используемых в программе функций и записывает их в массив адресов имен функций, на который ссылаются поля FirstThunk, и в котором до этого были RVA, ссылающиеся на имена соответствующих функций. После того, как этот массив заполнен адресами функций, он называется Таблицей Адресов Импорта (Import Address Table, сокращенно IAT).

    После того, как IAT заполнена адресами нужных функций, программа может начать работу.








    Исхожу из этого отрывка об описании таблицы импорта.Если таблица импорта будет зашифрована то тогда IAT не сможет заполниться реальными адресами функций, так как в "таблице просмотра импорта" находятся зашифрованные данные.Соответственно программа не загрузится.
     
  4. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    а что мешает криптору сделать свою таблицу импорта, зашифровать ИАТ программы и потом восстановить =)
     
  5. x0man

    x0man Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    33
    Likes Received:
    13
    Reputations:
    0
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    вообще IT шифровать нужно обязательно.
    А потом ты просто пишеш код который сам загрузит все данные.
    т.е. ручная обработка импорта и потом LoadLibrary и GetProcAddress
    КОгдато писал для криптера, то вышло гдето строк 100 на асме. мож меньше
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    если быть более подробным то делал примерно так (кусок кода из криптера моего)
    Надеюсь алгоритм будет понятен. Если знаеш ASM
    /me ехидно улыбнулся )

    Code:
       ESI = PE
    .............
     pushad
     mov edx,eax
     cmp [esi+80h],0
     je @_exit
     add eax,[esi+80h] //; IT
     mov esi,eax
    @_next1:
     cmp dword [esi+10h],0 //; если нет больше загружаемых библиотек
     jz @_exit
     push edx
     push ecx
     add edx,[esi+0Ch]
     push edx
     call [my_LoadLibrary] //; загрузить библиотеку
     pop ecx
     pop edx
     mov ebx,eax  //; сохранить в ebx module handle библиотеки
     mov edi,[esi+10h]  //; в EDI будет адрес на Addres_Table_RVA
     add edi,edx
     @_nextProc:
      cmp dword [edi],0 //; проверить текущий указатель на импортируемую функцию.
      jz @_nextDLL //; если больше нет импортируемых функций для текущей библиотеки
      push edx
      push ecx //; если есть IAT
      add edx,[edi]
      bt edx,31 //; проверка импорта по имени или ординалу
      jnc @_next3
    
      and edx,$0000ffff
    
      push edx //; если ординал
      jmp @_next4
     @_next3:
      inc edx  //; если имя
      inc edx
      push edx //; поместить в стек адрес имени функции
     @_next4:
    
      push ebx //; module handle
      call [my_GetProcAddress] //; получить адрес функции
      pop ecx
      pop edx
      mov [edi],eax //; сохранить адрес
     @_next2:
      inc ecx
      add edi,4 //; перейти на слудующий элемент.
      jmp @_nextProc
    @_nextDLL: //; больше нет элементов.
     add esi,14h //; сместить указатель на следующую библиотеку
     jmp @_next1
    @_exit:
     popad
    
    
     
  8. hiphop191817

    hiphop191817 New Member

    Joined:
    25 Apr 2009
    Messages:
    26
    Likes Received:
    0
    Reputations:
    0
    slesh, спасибо за пояснение.

    Это код на MASM или на чём? Просто немного непонятно что делают эти значики собаки в начале имён меток (@_nextProc: @_next4:) + что значит знак доллара в инструкции and edx,$0000ffff?
     
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Это ассемблерная вставка из дельфяной проги )
    А там $ - это типа HEX значение т.е. аналог буквы h в конце
    @ - там все метки начинаются с сабаки.
     
  10. x0man

    x0man Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    33
    Likes Received:
    13
    Reputations:
    0
    Если смотрешь в код ты асма
    И увидел там знак бакса
    Крикни в воздух с другом разом
    -Это млять же сцуко "ФАСыМ"!!!!!
    -----
    (C) х0ман) мухаха)

    P.S.
    (для тех кто не может понять, что это перед ним fasm или masm) ^^.

    про делфу потом напишу :D
     
    1 person likes this.
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вообще первоначально это был FASM
    затем просто адаптирован для Delphi