подгрузка DLL из памяти в другой процесс

Тема в разделе "LANGS.C", создана пользователем addedie, 26 окт 2019.

  1. addedie

    addedie New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2019
    Сообщения:
    25
    есть вот такой кодес, и вот так я его пытаюсь грузануть но чето невникаю, запутался помогите а
    Код (C++):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #ifndef MIN
    4. #    define MIN(a,b) ((a)<(b)?(a):(b))
    5. #endif
    6.  
    7. typedef BOOL(WINAPI* DLLMAIN)(HINSTANCE, DWORD, LPVOID);
    8.  
    9. #pragma warning (push)
    10. #pragma warning (disable: 4311; disable: 4312; disable: 4018)
    11.  
    12. DWORD GetSectionProtection(DWORD sc)
    13. {
    14.     DWORD dwResult = 0;
    15.     if (sc & IMAGE_SCN_MEM_NOT_CACHED)
    16.         dwResult |= PAGE_NOCACHE;
    17.  
    18.     if (sc & IMAGE_SCN_MEM_EXECUTE)
    19.     {
    20.         if (sc & IMAGE_SCN_MEM_READ)
    21.         {
    22.             if (sc & IMAGE_SCN_MEM_WRITE)
    23.                 dwResult |= PAGE_EXECUTE_READWRITE;
    24.             else
    25.                 dwResult |= PAGE_EXECUTE_READ;
    26.         }
    27.         else
    28.         {
    29.             if (sc & IMAGE_SCN_MEM_WRITE)
    30.                 dwResult |= PAGE_EXECUTE_WRITECOPY;
    31.             else
    32.                 dwResult |= PAGE_EXECUTE;
    33.         }
    34.     }
    35.     else
    36.     {
    37.         if (sc & IMAGE_SCN_MEM_READ)
    38.         {
    39.             if (sc & IMAGE_SCN_MEM_WRITE)
    40.                 dwResult |= PAGE_READWRITE;
    41.             else
    42.                 dwResult |= PAGE_READONLY;
    43.         }
    44.         else
    45.         {
    46.             if (sc & IMAGE_SCN_MEM_WRITE)
    47.                 dwResult |= PAGE_WRITECOPY;
    48.             else
    49.                 dwResult |= PAGE_NOACCESS;
    50.         }
    51.     }
    52.  
    53.     return dwResult;
    54. }
    55.  
    56. inline BOOL IsImportByOrdinal(DWORD ImportDescriptor)
    57. {
    58.     return (ImportDescriptor & IMAGE_ORDINAL_FLAG32) != 0;
    59. }
    60.  
    61.  
    62. HMODULE MemLoadLibrary(PBYTE data)
    63. {
    64.     IMAGE_FILE_HEADER* pFileHeader = NULL;
    65.     IMAGE_OPTIONAL_HEADER* pOptionalHeader = NULL;
    66.     IMAGE_SECTION_HEADER* pSectionHeader = NULL;
    67.     IMAGE_IMPORT_DESCRIPTOR* pImportDscrtr = NULL;
    68.     USHORT                    e_lfanew = *((USHORT*)(data + 0x3c));
    69.     PCHAR                    ImageBase = NULL;
    70.     PCHAR                    SectionBase = NULL;
    71.  
    72.     DWORD dwSize, dwOldProt, ImageBaseDelta;
    73.     int i;
    74.  
    75.     pFileHeader = (IMAGE_FILE_HEADER*)(data + e_lfanew + 4);
    76.     pOptionalHeader = (IMAGE_OPTIONAL_HEADER*)(data + e_lfanew + 4 + sizeof(IMAGE_FILE_HEADER));
    77.     if (pOptionalHeader->Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
    78.         return NULL;
    79.  
    80.     //    Let's try to reserv memory
    81.     ImageBase = (PCHAR)VirtualAlloc(
    82.         (PVOID)pOptionalHeader->ImageBase,
    83.         pOptionalHeader->SizeOfImage,
    84.         MEM_RESERVE, PAGE_NOACCESS);
    85.  
    86.     if (ImageBase == NULL)
    87.     {
    88.         ImageBase = (PCHAR)VirtualAlloc(NULL,
    89.             pOptionalHeader->SizeOfImage,
    90.             MEM_RESERVE, PAGE_NOACCESS);
    91.         if (ImageBase == NULL)
    92.             return NULL;
    93.     }
    94.  
    95.     //    copy the header
    96.     SectionBase = (PCHAR)VirtualAlloc(ImageBase,
    97.         pOptionalHeader->SizeOfHeaders,
    98.         MEM_COMMIT, PAGE_READWRITE);
    99.     memcpy(SectionBase, data, pOptionalHeader->SizeOfHeaders);
    100.     //    Do headers read-only (to be on the safe side)
    101.     VirtualProtect(SectionBase, pOptionalHeader->SizeOfHeaders, PAGE_READONLY, &dwOldProt);
    102.  
    103.     //    find sections ...
    104.     pSectionHeader = (IMAGE_SECTION_HEADER*)(pOptionalHeader + 1);
    105.     for (i = 0; i < pFileHeader->NumberOfSections; i++)
    106.     {
    107.         SectionBase = (PCHAR)VirtualAlloc(
    108.             ImageBase + pSectionHeader[i].VirtualAddress,
    109.             pSectionHeader[i].Misc.VirtualSize,
    110.             MEM_COMMIT, PAGE_READWRITE);
    111.         if (SectionBase == NULL)
    112.         {
    113.             VirtualFree(ImageBase, 0, MEM_RELEASE);
    114.             return NULL;
    115.         }
    116.         //    ... and copy initialization data
    117.         SectionBase = ImageBase + pSectionHeader[i].VirtualAddress;
    118.         dwSize = MIN(pSectionHeader[i].SizeOfRawData, pSectionHeader[i].Misc.VirtualSize);
    119.         memcpy(SectionBase, data + pSectionHeader[i].PointerToRawData, dwSize);
    120.     }
    121.  
    122.     //    check addersses
    123.     ImageBaseDelta = (DWORD)ImageBase - pOptionalHeader->ImageBase;
    124.     if (ImageBaseDelta != 0 &&
    125.         pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress != 0
    126.         )
    127.     {
    128.         IMAGE_BASE_RELOCATION* pBaseReloc = (IMAGE_BASE_RELOCATION*)(ImageBase +
    129.             pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
    130.         IMAGE_BASE_RELOCATION* pBaseReloc0 = pBaseReloc;
    131.         WORD* wPointer = NULL;
    132.         DWORD dwModCount;
    133.         int i;
    134.  
    135.         while ((DWORD)pBaseReloc0 - (DWORD)pBaseReloc < pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size)
    136.         {
    137.             dwModCount = (pBaseReloc0->SizeOfBlock - sizeof(pBaseReloc)) / 2;
    138.             wPointer = (WORD*)(pBaseReloc + 1);
    139.             for (i = 0; i < dwModCount; i++, wPointer++)
    140.                 if ((*wPointer & 0xf000) != 0)
    141.                 {
    142.                     PDWORD pdw = (PDWORD)(ImageBase + pBaseReloc0->VirtualAddress + ((*wPointer) & 0xfff));
    143.                     (*pdw) += ImageBaseDelta;
    144.                 }
    145.             pBaseReloc = (IMAGE_BASE_RELOCATION*)wPointer;
    146.         }
    147.     }
    148.     else if (ImageBaseDelta != 0)
    149.     {
    150.         VirtualFree(ImageBase, 0, MEM_RELEASE);
    151.         return NULL;
    152.     }
    153.  
    154.     pImportDscrtr = (IMAGE_IMPORT_DESCRIPTOR*)(ImageBase +
    155.         pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
    156.  
    157.     for (; pImportDscrtr->Name != 0; pImportDscrtr++)
    158.     {
    159.         PCHAR pLibName = (PCHAR)(ImageBase + pImportDscrtr->Name);
    160.         PCHAR pImortName = NULL;
    161.         HMODULE hLibModule = LoadLibrary(pLibName);
    162.         DWORD* pImport = NULL,
    163.             * pAddress = NULL;
    164.         DWORD ProcAddress;
    165.  
    166.         pAddress = (DWORD*)(ImageBase + pImportDscrtr->/*Original*/FirstThunk);
    167.         if (pImportDscrtr->TimeDateStamp == 0)
    168.             pImport = (DWORD*)(ImageBase + pImportDscrtr->FirstThunk);
    169.         else
    170.             pImport = (DWORD*)(ImageBase + pImportDscrtr->OriginalFirstThunk);
    171.         for (i = 0; pImport[i] != 0; i++)
    172.         {
    173.             if (IsImportByOrdinal(pImport[i]))
    174.                 ProcAddress = (DWORD)GetProcAddress(hLibModule, (PCHAR)(pImport[i] & 0xFFFF));
    175.             else  // import by name
    176.             {
    177.                 pImortName = (PCHAR)(ImageBase + (pImport[i]) + 2);
    178.                 ProcAddress = (DWORD)GetProcAddress(hLibModule, pImortName);
    179.             }
    180.             pAddress[i] = ProcAddress;
    181.         }
    182.     }
    183.  
    184.     //    set section protection
    185.     for (i = 0; i < pFileHeader->NumberOfSections; i++)
    186.         VirtualProtect((PVOID)(ImageBase + pSectionHeader[i].VirtualAddress),
    187.             pSectionHeader[i].Misc.VirtualSize,
    188.             GetSectionProtection(pSectionHeader[i].Characteristics),
    189.             &dwOldProt);
    190.  
    191.     //    call DLLMain
    192.     if (pOptionalHeader->AddressOfEntryPoint != 0)
    193.     {
    194.         DLLMAIN dllMain = (DLLMAIN)(ImageBase + pOptionalHeader->AddressOfEntryPoint);
    195.         if (!dllMain((HMODULE)ImageBase, DLL_PROCESS_ATTACH, NULL))
    196.         {
    197.             VirtualFree(ImageBase, 0, MEM_RELEASE);
    198.             return NULL;
    199.         }
    200.     }
    201.  
    202.     return (HMODULE)ImageBase;
    203. }
    204.  
    205.  
    206. BOOL MemFreeLibrary(HMODULE hDll)
    207. {
    208.     PIMAGE_DOS_HEADER        pDosHeader = NULL;
    209.     PIMAGE_FILE_HEADER        pFileHeader = NULL;
    210.     PIMAGE_OPTIONAL_HEADER    pOptionalHeader = NULL;
    211.  
    212.     pDosHeader = (PIMAGE_DOS_HEADER)hDll;
    213.     pFileHeader = (PIMAGE_FILE_HEADER)(((PBYTE)hDll) + pDosHeader->e_lfanew + 4);
    214.     pOptionalHeader = (PIMAGE_OPTIONAL_HEADER)(pFileHeader + 1);
    215.  
    216.     //    Call to DllMain
    217.     if (pOptionalHeader->AddressOfEntryPoint != 0)
    218.     {
    219.         DLLMAIN dllMain = (DLLMAIN)((PBYTE)hDll + pOptionalHeader->AddressOfEntryPoint);
    220.         dllMain(hDll, DLL_PROCESS_DETACH, NULL);
    221.     }
    222.     //    free loaded librares  
    223.     PIMAGE_IMPORT_DESCRIPTOR pImportDscrtr = (IMAGE_IMPORT_DESCRIPTOR*)((PBYTE)hDll +
    224.         pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
    225.     for (; pImportDscrtr->Name != 0; pImportDscrtr++)
    226.     {
    227.         PCHAR pLibName = (PCHAR)((PBYTE)hDll + pImportDscrtr->Name);
    228.         HMODULE hLib = GetModuleHandle(pLibName);
    229.         FreeLibrary(hLib);
    230.     }
    231.  
    232.     return VirtualFree((PVOID)hDll, 0, MEM_RELEASE);
    233. }
    234.  
    235. FARPROC MemGetProcAddress(HMODULE hDll, LPCTSTR fname)
    236. {
    237.     PIMAGE_DOS_HEADER        pDosHeader = NULL;
    238.     PIMAGE_FILE_HEADER        pFileHeader = NULL;
    239.     PIMAGE_OPTIONAL_HEADER    pOptionalHeader = NULL;
    240.  
    241.     pDosHeader = (PIMAGE_DOS_HEADER)hDll;
    242.     pFileHeader = (PIMAGE_FILE_HEADER)(((PBYTE)hDll) + pDosHeader->e_lfanew + 4);
    243.     pOptionalHeader = (PIMAGE_OPTIONAL_HEADER)(pFileHeader + 1);
    244.  
    245.     DWORD dwExpRVA = pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
    246.     PBYTE pb = (PBYTE)hDll;
    247.     PIMAGE_EXPORT_DIRECTORY pExportDir = (PIMAGE_EXPORT_DIRECTORY)(pb + dwExpRVA);
    248.     PDWORD pNamesRVA = (PDWORD)(pb + pExportDir->AddressOfNames);
    249.     PDWORD pFuncRVA = (PDWORD)(pb + pExportDir->AddressOfFunctions);
    250.     PWORD ord = (PWORD)(pb + pExportDir->AddressOfNameOrdinals);
    251.  
    252.     DWORD dwFunc = pExportDir->NumberOfNames;
    253.     for (int i = 0; i < dwFunc; i++)
    254.     {
    255.         PCHAR name = ((PCHAR)(pb + pNamesRVA[i]));
    256.         if (0 == lstrcmp(fname, name))
    257.             return (FARPROC)(pb + pFuncRVA[ord[i]]);
    258.     }
    259.  
    260.     return NULL;
    261. }
    262.  
    263. #pragma warning (pop)
    264.  
    265. int main()
    266. {
    267.     LPOFSTRUCT lpOf = NULL;
    268.     HFILE hFile = OpenFile("test.dll", lpOf, 0);
    269.     HANDLE hHeap = HeapCreate(0,12800,0);
    270.     LPCSTR lpBuffer = (LPCSTR)HeapAlloc(hHeap, 0, 12800);
    271.     ReadFile(hFile, lpBuffer, 12800, NULL, lpOf);
    272.     HeapFree(hHeap, 0, (LPVOID)lpBuffer);
    273.     return 0;
    274. }
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    так вопрос в чём?
     
    Indy_ нравится это.
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    addedie,

    Какая ошибка ?
    Почему эта фигня не работает никому не интересно. Фикс ошибок в данном случае означает что нужно переписать всё с нуля. Да и так не загружается из памяти, не тот метод.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Скорей всего нету никакой ошибки, просто не знает как пользоваться. В main() нет вызова MemLoadLibrary(), вот и не работает. Внезапно. Код выглядит так, будто умеет загружать длл из памяти и даже обрабатывать релоки и импорт. Не всякая длл, загруженная таким образом, будет работать.
     
    TermoSINteZ нравится это.
  5. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    39
    Автор: Максим М. Гумеров
    "Загрузчик PE-файлов. (Исследование формата Portable Executable,
    сопровождающееся написанием PE-загрузчика)"
    смотри http://rsdn.org/article/baseserv/peloader.xml
     
  6. OverNight

    OverNight New Member

    Публикаций:
    0
    Регистрация:
    21 авг 2019
    Сообщения:
    10
    орнул:rofl:
    до чего дожили :dash1:
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    OverNight,

    Ну и что, очередной рип кода. f13nd, даже никакой смайлик не поставил, так как обычное это дело.
     
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Может быть мне не смешно было, или было настроение шутить по-английски:
    - два фута до пирса, сэр
    - один фут до пирса, сэр
    - пирс, сэр
    - один фут пирса, сэр
    - два фута пирса, сэр
     
    CKAP, Mikl___ и q2e74 нравится это.
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

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

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Ого, прошлая характеристика была "неспособен к аналитическому мышлению", а тут и мышление хотя бы в какой-то форме и даже знания. И с алгоритмами нормально все, и с абстракциями порядок, просто я херней стараюсь не заниматься. Автоматизировать что-либо имеет смысл, если это проделывается достаточно часто и длительность разработки костыля нужного калибра значительно меньше, чем совокупное потерянное на ручной разбор время. Если тебе обычно нечем заняться, это не характеристика умственных способностей.
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    не переживай, я по характеристике Инде "ни на что не способный спаммер"... у меня характеристика хуже, хорошо, что никто не будет смотреть характеристики Инде при трудоустройстве, а то мы бы тут бомжевали давно все...