Работа с таблицей импорта

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
daFix
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 21.10.2005 (Пт) 21:41

Работа с таблицей импорта

Сообщение daFix » 05.09.2008 (Пт) 13:44

Кто нибудь генерил свою таблицу импорта? Написал анпакер, теперь вот долблюсь над таблицей импорта... Пока безуспешно(( Оригинальную таблицу импорта нахожу нормально, а сформировать в нормальный, понятный для компа вид пока ни как....
Есть у кого нибудь наработки по данной теме?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Работа с таблицей импорта

Сообщение Хакер » 05.09.2008 (Пт) 15:02

Я.

В чём проблема-то, вопрос в чём?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

daFix
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 21.10.2005 (Пт) 21:41

Re: Работа с таблицей импорта

Сообщение daFix » 05.09.2008 (Пт) 23:32

Исходники в привате?

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Re: Работа с таблицей импорта

Сообщение Demonx » 06.09.2008 (Сб) 3:11

давайте на чистоту, пишите в форум) некоторым может быть интересно)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Работа с таблицей импорта

Сообщение Хакер » 06.09.2008 (Сб) 9:10

daFix писал(а):Исходники в привате?

Не понял смысла фразы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

daFix
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 21.10.2005 (Пт) 21:41

Re: Работа с таблицей импорта

Сообщение daFix » 06.09.2008 (Сб) 13:34

Исходниками поделиться не можешь?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Работа с таблицей импорта

Сообщение Хакер » 06.09.2008 (Сб) 13:38

Я не могу дать исходники всего проекта. Он большой и закрытый.

Видел ли ты когда-нибудь, ну, скажем, creasect.c из исходников винды ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

daFix
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 21.10.2005 (Пт) 21:41

Re: Работа с таблицей импорта

Сообщение daFix » 06.09.2008 (Сб) 13:50

Это я понимаю... Можешь дать только модуль отвечающий за построение таблицы импорта? Или хотябы алгоритм

Неа, я только VB хорошо знаю, остальные поверхностно

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Работа с таблицей импорта

Сообщение Хакер » 06.09.2008 (Сб) 14:18

daFix писал(а):Неа, я только VB хорошо знаю, остальные поверхностно

А я то думал, что обитатели cracklab.ru знают все исходники винды наизусить.

Вобщем, если взять какой-нибудь один файл из вышеупомянутых исходников, то в отрыве от остальных файлов этот файл будет совершенно бесполезен для человека1: внутри будут непонятные функции, определённым образом вызывающие другие непонятные функции, которые в этом файле отсутсвуют.
человека1 — незнакомого со всеми остальными файлами.


И даже если дать человеку второй файл с другими непонятными функциями, то всё равно ничего не получится — эти другие непонятные функции будут вызывать ещё какие-то функции, которые будут в третьем модуле, который использует функции из четвёртого.


Ситуация с моими исходниками — примерно такая же. Для подтверждения слов кусочек исходников из этого же проекта:

Код: Выделить всё
   NodeNumericFPFormatCheckerSecondary = TknTransitionSetToNew(NodeNumericFPFormatCheckerPrimary, &scoPlusMinus);
   NodeNumericFPFormatLooper = TknTransitionSetToNew(NodeNumericFPFormatCheckerSecondary, &scoNumbers10);
   TknTransitionSetToSelf(NodeNumericFPFormatLooper, &scoNumbers10);
   TknTransitionExclToToken(NodeNumericFPFormatCheckerPrimary, T_UNDEFINED, TFLAGS_UNDEFINED_ON_FP_CHECK_1);
   TknTransitionExclToToken(NodeNumericFPFormatCheckerSecondary, T_UNDEFINED, TFLAGS_UNDEFINED_ON_FP_CHECK_2);
   TknTransitionExclToToken(NodeNumericFPFormatLooper, T_NUMERIC, TFLAGS_NUMERIC_EXPONENTIAL |
                                                                 TFLAGS_NUMERIC_BASE10);


Что тебе толку с этого кода, если ты не знаешь, что делают все эти функции, начинающиеся на TknTransition? А что означают все эти константы? И какой толк с этого?

Ну, допустим дам я тебе исходник TknTransitionToNew, там будет вот чего:

Код: Выделить всё
T_ROUTER_ENTRY* TknTransitionSetToNew(T_ROUTER_ENTRY* pn, PSYMBOLICCLASSOBJECT sc)
{
   if(TknInitialized && (pn->Automat == Tkn))
   {
      T_ROUTER_ENTRY *NewRouter = NULL;

      for(ULONG i = 0; i < TKN_COMMON_JAT_SIZE; i++)
      {
         if(GETSCOFLAG(sc, i))
         {
         //   DfaCleanRouterJATCell(pn, i);
            if(NewRouter == NULL)
            {
               NewRouter = (T_ROUTER_ENTRY*)DfaAddChildRouter(pn,
                                                             i,
                                                   FavTknLooper,
                                                   DFARTL_USE_FAV_CODE,
                                                   0,
                                                   TKN_COMMON_JAT_SIZE);
            }
            else
            {
               DfaBuildPathEdge(pn, NewRouter, i);
            }
         }
      }

      if(NewRouter != NULL)
      {
         //
         // Если в ходе работы был создан новый узел, и, возможно были созданы
         // дополнительные ветвки перехода к нему - возвращаем указатель
         // новый узел
         //

         return NewRouter;
      }
      else
      {
         //
         // Если новый роутер так и не был создан, значит символьный класс был
         // пустым, либо символы не пересекались с диапазоном JAT
         //
            
         return (T_ROUTER_ENTRY*)STATUS_ERROR_OUT_OF_JAT_SPACE;
      }
      
   }
   else
   {
      return (T_ROUTER_ENTRY*)STATUS_ERROR_NOT_INITIALIZED;
   }
}


И снова ты наткнёшься на DfaAddChildRouter, DfaBuildPathEdge и кучу констант, которых в этом модуле нет и о которых ты ничего не знаешь. И наличие щедро раставленных комментариев тебе тоже не поможет.


Так что, на будущее: просить у меня мои исходники редко бывает полезным :) .
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Re: Работа с таблицей импорта

Сообщение keks-n » 06.09.2008 (Сб) 18:31

daFix
Могу дать кусок кода своего загрузчика DLL, который обрабатывает таблицу импорта, подгружая нужные dll и прописывая адреса функций.
Изображение

daFix
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 21.10.2005 (Пт) 21:41

Re: Работа с таблицей импорта

Сообщение daFix » 06.09.2008 (Сб) 19:24

О! Вот хоть и на этом спасибо, очень поможет! :!:

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Re: Работа с таблицей импорта

Сообщение keks-n » 06.09.2008 (Сб) 21:03

Код: Выделить всё
#define CopyPtr(Dest,Src) *(DWORD*)&Dest=(DWORD)Src

Код: Выделить всё
//*************************Импорты*****************************
   IMAGE_IMPORT_DESCRIPTOR * CurImpLib;
   DWORD * CurImp;
   CopyPtr(CurImpLib,ImageBase+
      IPEHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
   while(CurImpLib->Name!=0)
   {
      HMODULE hDll=LoadLibraryA((LPCSTR)CurImpLib->Name+ImageBase);
      CopyPtr(CurImp,(ImageBase+((CurImpLib->TimeDateStamp==0)?CurImpLib->FirstThunk:
         CurImpLib->OriginalFirstThunk)));
      
      while (*CurImp!=0)
      {
         if (*CurImp & IMAGE_ORDINAL_FLAG32)
         {
            //По ординалу.
            *CurImp=(DWORD)GetProcAddress(hDll,(LPCSTR)(*CurImp & 0xffff));
         }
         else
         {
            LPSTR ProcName=(LPSTR)(*CurImp+ImageBase);
            *CurImp=GetProcAddress(hDll,ProcName);
         };
         CurImp++;
      };

      CurImpLib=&CurImpLib[1];
   };


Собственно, по ImageBase находится уже загруженный образ с распарсенными релоками.
Изображение

daFix
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 21.10.2005 (Пт) 21:41

Re: Работа с таблицей импорта

Сообщение daFix » 09.09.2008 (Вт) 23:32

Ну не VB конечно, но всё равно спасибо =)

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Работа с таблицей импорта

Сообщение Williams » 12.09.2008 (Пт) 16:15

daFix писал(а):Ну не VB конечно, но всё равно спасибо =)


Ес ты действительно занимаешься "лечением" п.о., то тебе должно быть все равно, на каком языке код :) А уж про языки высокого уровня говорить не приходится...
И вы думаете, что вас оставят в живых после прочтения этого поста?


Вернуться в Раздел для Профессионалов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList