Добавление своей dll в таблицу испорта

Тема в разделе "WASM.BEGINNERS", создана пользователем Luke, 10 сен 2009.

  1. Luke

    Luke New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2009
    Сообщения:
    11
    Доброе время суток. Мне нужно добавить свою dll в таблицу импорта, погуглил, прочел
    http://bugtraq.ru/library/programming/harddll.html
    http://www.insidepro.com/kk/019/019r.shtml
    http://www.wasm.ru/article.php?article=1002006
    Вот что я сделал:
    Код (Text):
    1.     // --- [ File headers ] ------
    2.     IMAGE_DOS_HEADER            *MZHead;
    3.     IMAGE_NT_HEADERS            *PEHead;
    4.     IMAGE_OPTIONAL_HEADER       *OptionalHead;
    5.     IMAGE_SECTION_HEADER        *Section;
    6.     IMAGE_IMPORT_DESCRIPTOR     *ImportDescriptor;
    7.  
    8.     HANDLE hFile, hMap;
    9.     LPVOID lpFile, lpImport, lpImportTable, lpImportEnd, lpMaxFree, lpPrevPtr, lpNextPtr;
    10.     DWORD dwMapSize, dwImportRVA, i, dwSectNum, dwNewImportTableSize, dwDllCount;
    11.     char    lpszFileName[20], lpszDllName[] = {"InStream.dll"};
    12.  
    13.  
    14.     strcpy(lpszFileName, "drozz.exe");
    15.     //Opening file
    16.     hFile = CreateFile(lpszFileName, GENERIC_ALL, 0, NULL, OPEN_EXISTING, 0, NULL);
    17.     if (hFile == INVALID_HANDLE_VALUE)
    18.         RiseError("Can't open file");
    19.     //Creating file mapping
    20.     hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
    21.     if (hMap == NULL)
    22.         RiseError("Can't map file");
    23.  
    24.     lpFile = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, GetFileSize(hFile, NULL));
    25.     CloseHandle(hFile);
    26.  
    27.     MZHead = (IMAGE_DOS_HEADER *)lpFile;
    28.     PEHead = (IMAGE_NT_HEADERS *)((DWORD)lpFile + (DWORD)MZHead->e_lfanew);
    29.     OptionalHead = &PEHead->OptionalHeader;//(DWORD)pe_opt_head = (DWORD)pe_head + sizeof(IMAGE_FILE_HEADER);
    30.     dwImportRVA = OptionalHead->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
    31.     Section = (IMAGE_SECTION_HEADER *)((DWORD)OptionalHead + sizeof(IMAGE_OPTIONAL_HEADER));
    32.     for (i = 0, dwSectNum = 0; i < PEHead->FileHeader.NumberOfSections; i++)
    33.     {
    34.         if (dwImportRVA < Section->VirtualAddress)
    35.         {
    36.             Section--;
    37.             dwSectNum = i - 1;
    38.             break;
    39.         }
    40.         Section++;
    41.     }
    42.     lpImport = (LPVOID)((DWORD)lpFile + Section->PointerToRawData);
    43.     lpImportTable = (LPVOID)(dwImportRVA - Section->VirtualAddress);
    44.     lpImportTable = (LPVOID)((DWORD)lpImport + (DWORD)lpImportTable);
    45.     ImportDescriptor = (IMAGE_IMPORT_DESCRIPTOR *)lpImportTable;
    46.     dwDllCount = 0;
    47.     while ((ImportDescriptor + dwDllCount)->Name != NULL)
    48.         dwDllCount++;//, ImportDescriptor++;//, RiseError((LPCSTR)(ImportDescriptor->Name - Section->VirtualAddress + (DWORD)lpImport)), ;
    49.     dwNewImportTableSize = sizeof(IMAGE_IMPORT_DESCRIPTOR) * (dwDllCount + 2);
    50.     dwNewImportTableSize += lstrlenA(lpszDllName) + 1;
    51.  
    52.     lpImportEnd = (LPVOID)((DWORD)(Section + 1)->PointerToRawData + (DWORD)lpFile - 1);
    53.     lpMaxFree = NULL;
    54.  
    55.     while (lpImportEnd >= lpImport)
    56.     {
    57.         if (*(BYTE *)lpImportEnd == 0x00)
    58.         {
    59.             lpPrevPtr = lpImportEnd;
    60.             while (*(BYTE *)lpImportEnd == 0x00)
    61.                 lpImportEnd = (LPVOID)((DWORD)lpImportEnd - 1);
    62.  
    63.         }
    64.         if (((DWORD)lpPrevPtr - (DWORD)lpImportEnd) > (DWORD)lpMaxFree)
    65.         {
    66.             lpMaxFree = (LPVOID)((DWORD)lpPrevPtr - (DWORD)lpImportEnd);
    67.             lpNextPtr = (LPVOID)((DWORD)lpImportEnd + 1);
    68.         }
    69.         lpImportEnd = (LPVOID)((DWORD)lpImportEnd - 1);
    70.     }
    71.     lpNextPtr = (LPVOID)((DWORD)lpNextPtr + 1);
    72.     lpMaxFree = (LPVOID)((DWORD)lpMaxFree - 4);
    73.     if ((DWORD)lpMaxFree < dwNewImportTableSize)
    74.         RiseError("xXXXXXXXXXXX");
    75.     memcpy(lpNextPtr, lpImportTable, sizeof(IMAGE_IMPORT_DESCRIPTOR) * dwDllCount);
    76.     memcpy(lpImportTable, lpszDllName, strlen(lpszDllName));
    77.     LPDWORD Zero = (LPDWORD)(DWORD)lpImportTable + strlen(lpszDllName);
    78.     IMAGE_IMPORT_BY_NAME myname;
    79.     myname.Hint = 0x00;
    80.     myname.Name[0x00] = 0x00;
    81.     WORD hint = 0;
    82.     char lpszFuncName[] = {"ImStreamFoo"};
    83.     HR p;
    84.     p.ZDword = 0;
    85.     p.IAT = dwImportRVA + strlen(lpszFuncName) + sizeof(p);
    86.     p.IATEnd = 0;
    87.     DWORD IIBN_Table;
    88.     memcpy(Zero, &p, sizeof(p));
    89.     Zero = (LPDWORD)((DWORD)Zero + sizeof(p));
    90.     memcpy(Zero, &hint, sizeof(WORD));
    91.     Zero = (LPDWORD)((DWORD)Zero + sizeof(WORD));
    92.     memcpy(Zero, lpszFuncName, strlen(lpszFuncName) + 1);
    93.     Zero = (LPDWORD)((DWORD)Zero + 1 + strlen(lpszFuncName));
    94.     memcpy(Zero, &myname, sizeof(myname));
    95.    
    96.     IMAGE_IMPORT_DESCRIPTOR myDLL;
    97.     IIBN_Table = dwImportRVA + strlen(lpszDllName) + sizeof(DWORD);
    98.    
    99.  
    100.    myDLL.Characteristics = IIBN_Table;
    101.    myDLL.TimeDateStamp = NULL;
    102.    myDLL.ForwarderChain = NULL;                                  
    103.  
    104.    //Записываем адрес строки с именем файла нашей DLL
    105.    myDLL.Name = dwImportRVA;
    106.  
    107.   // //Указатель на таблицу FirstThunk
    108.    myDLL.FirstThunk = IIBN_Table;
    109.  
    110.   // //Записываем в новую таблицу импорта запись о нашей DLL
    111.    LPVOID OldFreePtr = lpNextPtr;
    112.    lpNextPtr = (LPVOID)((DWORD)lpNextPtr + sizeof(IMAGE_IMPORT_DESCRIPTOR) * dwDllCount);
    113.   memcpy(lpNextPtr, &myDLL, sizeof(IMAGE_IMPORT_DESCRIPTOR));
    114.  
    115.   // //Создаем "финальную" нулевую запись со всеми полями равными нулю
    116.    myDLL.Characteristics = NULL;
    117.    myDLL.TimeDateStamp = NULL;
    118.    myDLL.ForwarderChain = NULL;
    119.    myDLL.Name = NULL;
    120.    myDLL.FirstThunk = NULL;
    121. //  LPVOID OldFreePtr = FreePtr;
    122.  
    123.   // //И записываем её в конец новой таблицы импорта.
    124.    lpNextPtr = (LPVOID)((DWORD)lpNextPtr + sizeof(IMAGE_IMPORT_DESCRIPTOR) * dwDllCount);
    125.   memcpy(lpNextPtr, &myDLL, sizeof(IMAGE_IMPORT_DESCRIPTOR));
    126.  
    127.   // //3. Устанавливаем указатель на нашу таблицу импорта.
    128.   // // Вычисляем RVA нашей таблицы
    129.   DWORD NewImportTableRVA = (DWORD)OldFreePtr - (DWORD)lpImport + Section->VirtualAddress;
    130. OptionalHead->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = NewImportTableRVA;
    131.   OptionalHead->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = (dwDllCount + 1) * sizeof(IMAGE_IMPORT_DESCRIPTOR);
    132.  
    133.   UnmapViewOfFile(hMap);
    134.   CloseHandle(hMap);
    Но файл такой оказывается невалидным... Облазил весь гугл, буду рад если покажут пример...
     
  2. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    http://wasm.ru/baixado.php?mode=tool&id=242
    http://www.wasm.ru/baixado.php?mode=src&id=153
     
  3. Luke

    Luke New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2009
    Сообщения:
    11
    Вторая программа не рабочая...
    И мне нужна не программа, а код.=) Благодарю=)
     
  4. Luke

    Luke New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2009
    Сообщения:
    11
    Или может кто то посоветут способ внедрения в процесс длл без ехе файла и ключа APP_Init?
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Luke
    Не совсем понятно что нужно, инфект или инжект. Наверно первое. Тогда пропатчить экзешник, вфп кстати просто отключается, остаётся чексумму править или обнулить.
     
  6. shsh

    shsh Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    69
    инфект судя по всему нужен
     
  7. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ну, если это и впрямь инфект(что нам подсказывает логика), то слово "процесс" надо заменить на "файлес" ,)
    а разве указано что файлес системный?

    и да: Use the force, Luke!
     
  8. Luke

    Luke New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2009
    Сообщения:
    11
    Да, вы угадали, инфект=)
    Да, Clerk правильно угадал - нужен инфект в системный файл... Вся проблема в том, что я не знаю как пропатчить ехешник... Все делаю по статье, описание формата знаю, но что то не так..
    .

    p.S>Оффтопик=)
    Клерк, а каким способом вы предлагаете отключать WFP?=)
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Luke
    RPC-запрос, ну или стандартный модуль использовать.
     
  10. Luke

    Luke New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2009
    Сообщения:
    11
    м... Народ, так что по сабжу?=)
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    код кривой, вникать лень =)
     
  12. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ну а по сабжу ("Добавление своей dll в таблицу испорта") - так вообще у тебя никаких проблем - бинарь, ведь, портится! )