нестандартная загрузка DLL

Тема в разделе "WASM.BEGINNERS", создана пользователем someone, 14 июн 2007.

  1. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    товарищи кодеры
    просьба помочь
    я наваял библиотечку, которая при подрузке (дллмаин) читает из конфига имена библиотек, и подгружает их себе в процесс, а затем вызавет их дллмаин.
    вродебы (как мне кажется) мапит библиотеку оно нормально.
    проблема возникает при вызове дллмаин....
    для теста использовал простенькую подгружаемую длл, с 1 функцией, ее дллмаин вызывает мессажбокс.
    после того как выскакивает окошко соответствуещего мессажбокса происходит глюк. вроде бы срывается стек. но хоть убейте не пойму где :dntknw:
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    в 17ой строке.
     
  3. pushick

    pushick New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2007
    Сообщения:
    95
    пятая функция в том классе, что был в предыдущем сорце

    someone

    что за вопрос? где код? или нужен магический шар?
     
  4. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    Код (Text):
    1. HMODULE xLoadLibrary(PBYTE pbDllBuff,DWORD reason)
    2. {
    3.     HMODULE             hRet = 0;
    4.     DWORD               dwImageBase, dwImageSize, dwHeadersSize, dwImageBaseDelta;
    5.     PIMAGE_NT_HEADERS   pImageNtHeaders;
    6.     PBYTE               pbImage = NULL;
    7.     DWORD               dllEntry;
    8.     TDLLENTRY           entrypoint;
    9.     __try
    10.     {
    11.         pImageNtHeaders = (PIMAGE_NT_HEADERS)
    12.             (pbDllBuff + ((PIMAGE_DOS_HEADER)pbDllBuff)->e_lfanew);
    13.  
    14.         dwImageBase     = pImageNtHeaders->OptionalHeader.ImageBase;
    15.         dwImageSize     = pImageNtHeaders->OptionalHeader.SizeOfImage;
    16.         dwHeadersSize   = pImageNtHeaders->OptionalHeader.SizeOfHeaders;
    17.         dllEntry        = pImageNtHeaders->OptionalHeader.AddressOfEntryPoint;
    18.         DWORD dwNewBase = dwImageBase;
    19.         while (pbImage == NULL)
    20.         {
    21.             pbImage = (PBYTE)VirtualAlloc((LPVOID)dwNewBase, dwImageSize,
    22.                 MEM_RESERVE, PAGE_NOACCESS);
    23.             dwNewBase += 0x10000;
    24.         }
    25.         dwImageBaseDelta = dwNewBase - dwImageBase - 0x10000;
    26.  
    27.         PBYTE pbHeaders = (PBYTE)VirtualAlloc(pbImage, dwHeadersSize,
    28.             MEM_COMMIT, PAGE_READWRITE);
    29.        
    30.         memcpy(pbHeaders, pbDllBuff, dwHeadersSize);
    31.    
    32.         DWORD dwOldProtect;
    33.         VirtualProtect(pbHeaders, dwHeadersSize, PAGE_READONLY, &dwOldProtect);
    34.    
    35.         PIMAGE_SECTION_HEADER pImageSectionHeader = (PIMAGE_SECTION_HEADER)
    36.             (pImageNtHeaders->FileHeader.SizeOfOptionalHeader +
    37.             (long)&(pImageNtHeaders->OptionalHeader));
    38.  
    39.         PBYTE pbMem = NULL;
    40.         DWORD dwRawSectionSize = 0;
    41.  
    42.         for (int i = 0; i < pImageNtHeaders->FileHeader.NumberOfSections; i++)
    43.         {
    44.             if (pImageSectionHeader->SizeOfRawData > pImageSectionHeader->Misc.VirtualSize)
    45.                 dwRawSectionSize = pImageSectionHeader->Misc.VirtualSize;
    46.             else
    47.                 dwRawSectionSize = pImageSectionHeader->SizeOfRawData;
    48.  
    49.             pbMem = (PBYTE)VirtualAlloc((LPVOID)RVATOVA(pbImage, pImageSectionHeader->VirtualAddress),
    50.                 pImageSectionHeader->Misc.VirtualSize, MEM_COMMIT, PAGE_READWRITE);
    51.  
    52.             ZeroMemory(pbMem, pImageSectionHeader->Misc.VirtualSize);
    53.             memcpy(pbMem, (void *)RVATOVA(pbDllBuff, pImageSectionHeader->PointerToRawData), dwRawSectionSize);
    54.  
    55.             pImageSectionHeader++;
    56.         }
    57.  
    58.         for (int m = 0; m < pImageNtHeaders->FileHeader.NumberOfSections; m++)
    59.         {
    60.             VirtualProtect((LPVOID)RVATOVA(pbImage, pImageSectionHeader[m].VirtualAddress),
    61.                 pImageSectionHeader[m].Misc.VirtualSize,
    62.                 GetSectionProtection(pImageSectionHeader[m].Characteristics),
    63.                 &dwOldProtect);
    64.         }
    65.  
    66.         if (!ProcessRelocs((long)pbImage, dwImageBaseDelta))
    67.             goto end;
    68.         if (!ProcessImports((long)pbImage))
    69.             goto end;
    70.         MessageBoxA(0,"ok",0,0);
    71.         entrypoint=(TDLLENTRY)(dllEntry+(DWORD)pbImage);
    72.         entrypoint((HMODULE)pbImage,DLL_PROCESS_ATTACH,NULL);
    73.  
    74.     } __except (EXCEPTION_EXECUTE_HANDLER)
    75.     {
    76.         goto end;
    77.     }
    78.  
    79.     hRet = (HMODULE)pbImage;
    80.  
    81. end:
    82.  
    83.     return hRet;
    84. }
    извините собирался вторым постом код кинуть, отвлекся не успел :)
    дело в том что без вызова дллентри из подгружаемой библиотеки такого глюка замечено не было и вроде бы все работало нормально
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    надеюсь ты конвенцию правильно для DLLMain указал?
     
  6. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    entrypoint=(TDLLENTRY)(dllEntry+(DWORD)pbImage);
    entrypoint((HMODULE)pbImage,DLL_PROCESS_ATTACH,NULL);
    А че, разве это надо делать? Винда вроде как сама вызовет DLL Main подгружаемой библиотеки...
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а ты разве не видишь что он руками всё подгружает? какя винда?
     
  8. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    А есть откомпиленные библиотеки? Хочется посмотреть как и что в оле...
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    n0name
    pushick
    отжиг засчитан)

    someone
    уверен, что остальные функции работают нормально, особенно обработка релоков?
     
  10. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    блин :dntknw:
    я пользовался всем этим "г" раньше, просто не нужно было дллмаин вызывать да и все.
    а теперь возникла необходимость.
    вызываю.
    ОНА ВЫПОЛНЯЕТСЯ (тестю на либе написаной на паскале которая вызывает мессажбокс при загрузке и все.)
    и сразу потом все нафик вылетает (после того мессажбокса из подгружаемой либы)
    и хз шо с ним.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    значит у тебя проблемы с calling convention, в пользу этой причины еще и говорит то, что слетает стек.
    покажи объявление типа TDLLENTRY
     
  12. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    typedef
    BOOL
    (WINAPI*
    TDLLENTRY)(HMODULE, DWORD,LPVOID);



    ps
    WINAPI == __stdcall
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хм.. ну тогда неясно ни разу. если хочешь, кинь полные сорсы твоего чуда природы и тестовую дллку, посмотрим что где падает.
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а отлаживать не пробовал? всё таки иногда помогает, тем более что если DllMain достаточно простаю, посмотри где падает.
     
  15. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    хз.
    внимание вопрос на засыпку :)
    как отлаживать длл?
    а особенно как проследить загрузку одной длл из другой?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    внимание вопрос на засыпку: про OllyDbg слышал? это раз
    два - скажи-ка, а чем по-твоему отличается отладка длл от отладки проги?

    Лирическое отступление: складывается такое впечатление, что народ сюда приходит с мыслью - ооо, они шаманы, я их попрошу посмотреть где ошибка, они посмотрят и сразу скажут что не так и как исправить, у них наверное есть какие-то супербубны и мегазаклинания, которые нужно петь, танцуя вокруг костра =\
     
  17. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    да не занимался я раньше с длл
    были у меня эти исходники готовые, рабочие. надо было прикрутить туда вызов дллмаин да и все. сел колупал-колупал не получается :dntknw:
    а вдруг ктото с чемто подобным воевал?


    дело в том что без вызова дллмаин все работает отлично. а как только
    Код (Text):
    1.         dllEntry        = pImageNtHeaders->OptionalHeader.AddressOfEntryPoint;
    2.         entrypoint=(TDLLENTRY)(dllEntry+(DWORD)pbImage);
    3.         entrypoint((HMODULE)pbImage,DLL_PROCESS_ATTACH,NULL);
    вот это добавил...
    запускает оно дллмаин....
    а потом тупо вылетает и все :dntknw:
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Давай сорсы, если жаба душит от жадности, можешь дать бинарник своей проги.
    + бинарник длл
     
  19. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    Код (Text):
    1. #define RVATOVA(base,offset) ((PVOID)((DWORD)(base)+(DWORD)(offset)))
    2. DWORD GetSectionProtection(DWORD);
    3. BOOL ProcessRelocs(unsigned long, DWORD);
    4. typedef
    5. BOOL
    6. (WINAPI*
    7. TDLLENTRY)(HMODULE, DWORD,LPVOID);
    8.  
    9.  
    10. PVOID myalloc (DWORD size)
    11. {
    12.     PVOID mem;
    13.     mem=VirtualAlloc(NULL,size,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    14.     memset(mem,0,size);
    15.     return mem;
    16. }
    17. BOOL myfree (PVOID mem)
    18. {
    19.     return VirtualFree(mem,0,MEM_DECOMMIT);
    20. }
    21. PVOID decrypt(PVOID data,DWORD size,PCHAR key)
    22. {
    23.     PVOID   r;
    24.     r=myalloc(size);
    25.     memcpy(r,data,size);
    26.     return r;
    27. }
    28.  
    29. DWORD GetSectionProtection(DWORD SC)
    30. {
    31.     DWORD result=0;
    32.  
    33.     if (SC && IMAGE_SCN_MEM_NOT_CACHED != 0)
    34.         result = result || PAGE_NOCACHE;
    35.  
    36.     if (SC && IMAGE_SCN_MEM_EXECUTE != 0)
    37.     {
    38.         if (SC && IMAGE_SCN_MEM_READ != 0)     
    39.         {
    40.             if (SC && IMAGE_SCN_MEM_WRITE != 0)
    41.                 result = result || PAGE_EXECUTE_READWRITE;
    42.             else result = result || PAGE_EXECUTE_READ;
    43.         }
    44.         else if (SC && IMAGE_SCN_MEM_WRITE != 0)
    45.             result = result || PAGE_EXECUTE_WRITECOPY;
    46.         else result = result || PAGE_EXECUTE;
    47.     }
    48.     else if (SC && IMAGE_SCN_MEM_READ != 0)
    49.     {
    50.         if (SC && IMAGE_SCN_MEM_WRITE != 0)
    51.             result = result || PAGE_READWRITE;
    52.         else result = result || PAGE_READONLY;
    53.     }
    54.     else if (SC || IMAGE_SCN_MEM_WRITE != 0)
    55.         result = result || PAGE_WRITECOPY;
    56.     else result = result || PAGE_NOACCESS;
    57.  
    58.     return result;
    59. }
    60.  
    61. BOOL ProcessRelocs(unsigned long hMap, DWORD dwImageBaseDelta)
    62. {
    63.     PIMAGE_NT_HEADERS pImageNtHeaders = (PIMAGE_NT_HEADERS)(hMap + ((PIMAGE_DOS_HEADER)hMap)->e_lfanew);
    64.    
    65.     unsigned long pImageBaseRelocation = (unsigned long)(RVATOVA(hMap,
    66.         pImageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress));
    67.    
    68. //  __try
    69.     {
    70.         while (((PIMAGE_BASE_RELOCATION)pImageBaseRelocation)->VirtualAddress != 0)
    71.         {
    72.             int number = (((PIMAGE_BASE_RELOCATION)pImageBaseRelocation)->SizeOfBlock - 8) / 2;
    73.             WORD* Rel = (WORD *)(pImageBaseRelocation + 8);
    74.            
    75.             for (int i = 0; i < number; i++)
    76.             {
    77.                 *(PDWORD)(RVATOVA(hMap,
    78.                     ((PIMAGE_BASE_RELOCATION)pImageBaseRelocation)->VirtualAddress + ((0x0FFF)&(Rel[i])))) +=
    79.                     dwImageBaseDelta;
    80.             }
    81.  
    82.             pImageBaseRelocation += ((PIMAGE_BASE_RELOCATION)pImageBaseRelocation)->SizeOfBlock;
    83.         }
    84.     } /*__except (EXCEPTION_EXECUTE_HANDLER)
    85.     {  
    86.         return FALSE;
    87.     }   */
    88.  
    89.     return TRUE;
    90. }
    91.  
    92. BOOL ProcessImports(unsigned long hMap)
    93. {
    94.     IMAGE_THUNK_DATA32 *pThunk;
    95.     HMODULE hLibModule;
    96.  
    97.     PIMAGE_NT_HEADERS pImageNtHeaders = (PIMAGE_NT_HEADERS)(hMap + ((PIMAGE_DOS_HEADER)hMap)->e_lfanew);
    98.  
    99.     PIMAGE_IMPORT_DESCRIPTOR pImageImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)(RVATOVA(hMap,
    100.         pImageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
    101.  
    102.     //__try
    103.     {
    104.         while (pImageImportDescriptor->Name != 0)
    105.         {  
    106.             char *name = (char *)RVATOVA(hMap, pImageImportDescriptor->Name);
    107.             hLibModule = LoadLibraryA(name);
    108.            
    109.             if (hLibModule == NULL)
    110.                 return FALSE;
    111.  
    112.             if (pImageImportDescriptor->TimeDateStamp == 0)
    113.                 pThunk = (IMAGE_THUNK_DATA32 *)RVATOVA(hMap, pImageImportDescriptor->FirstThunk);
    114.             else pThunk = (IMAGE_THUNK_DATA32 *)RVATOVA(hMap, pImageImportDescriptor->OriginalFirstThunk);
    115.  
    116.             while (pThunk->u1.Ordinal != 0)
    117.             {
    118.                 DWORD dwProcAddr = 0;
    119.                 char *ImportedName;
    120.                 if (((pThunk->u1.Ordinal) & 0x80000000) != 0)
    121.                 {
    122.                     dwProcAddr = (DWORD)GetProcAddress(hLibModule, (char *)(pThunk && 0xFFFF));
    123.                 } else {
    124.                     PIMAGE_IMPORT_BY_NAME pImageImportByName = (PIMAGE_IMPORT_BY_NAME)
    125.                         RVATOVA(hMap, pThunk->u1.AddressOfData);
    126.                     ImportedName = (char *)&pImageImportByName->Name;
    127.                     dwProcAddr = (DWORD)GetProcAddress(hLibModule, ImportedName);
    128.                 }
    129.                 *(PDWORD)pThunk = dwProcAddr;
    130.                 pThunk++;
    131.             }
    132.  
    133.             pImageImportDescriptor++;
    134.         }
    135.     } /*__except (EXCEPTION_EXECUTE_HANDLER)
    136.     {  
    137.         return FALSE;
    138.     }   */
    139.  
    140.     return TRUE;
    141. }
    142.  
    143. DWORD xGetProcAdress(long hMap, int num)
    144. {
    145.     PIMAGE_NT_HEADERS pImageNtHeaders = (PIMAGE_NT_HEADERS)(hMap + ((PIMAGE_DOS_HEADER)hMap)->e_lfanew);
    146.  
    147.     PIMAGE_EXPORT_DIRECTORY pImageExportDirectory = (PIMAGE_EXPORT_DIRECTORY)RVATOVA(hMap,
    148.             pImageNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress);
    149.    
    150.     PDWORD AddressOfFunctions = (PDWORD)RVATOVA(hMap, pImageExportDirectory->AddressOfFunctions);
    151.  
    152.     for (DWORD i = 0; i < pImageExportDirectory->NumberOfFunctions; i++)
    153.         if (i == num - 1)
    154.             return (DWORD)RVATOVA(hMap, AddressOfFunctions[i]);
    155.    
    156.     return 0;
    157. }
    158.  
    159. HMODULE xLoadLibrary(PBYTE pbDllBuff,DWORD reason)
    160. {
    161.     HMODULE             hRet = 0;
    162.     DWORD               dwImageBase, dwImageSize, dwHeadersSize, dwImageBaseDelta;
    163.     PIMAGE_NT_HEADERS   pImageNtHeaders;
    164.     PBYTE               pbImage = NULL;
    165.     DWORD               dllEntry;
    166.     TDLLENTRY           entrypoint;
    167.     __try
    168.     {
    169.         pImageNtHeaders = (PIMAGE_NT_HEADERS)
    170.             (pbDllBuff + ((PIMAGE_DOS_HEADER)pbDllBuff)->e_lfanew);
    171.  
    172.         dwImageBase     = pImageNtHeaders->OptionalHeader.ImageBase;
    173.         dwImageSize     = pImageNtHeaders->OptionalHeader.SizeOfImage;
    174.         dwHeadersSize   = pImageNtHeaders->OptionalHeader.SizeOfHeaders;
    175.         dllEntry        = pImageNtHeaders->OptionalHeader.AddressOfEntryPoint;
    176.         DWORD dwNewBase = dwImageBase;
    177.         while (pbImage == NULL)
    178.         {
    179.             pbImage = (PBYTE)VirtualAlloc((LPVOID)dwNewBase, dwImageSize,
    180.                 MEM_RESERVE, PAGE_NOACCESS);
    181.             dwNewBase += 0x10000;
    182.         }
    183.         dwImageBaseDelta = dwNewBase - dwImageBase - 0x10000;
    184.  
    185.         PBYTE pbHeaders = (PBYTE)VirtualAlloc(pbImage, dwHeadersSize,
    186.             MEM_COMMIT, PAGE_READWRITE);
    187.        
    188.         memcpy(pbHeaders, pbDllBuff, dwHeadersSize);
    189.    
    190.         DWORD dwOldProtect;
    191.         VirtualProtect(pbHeaders, dwHeadersSize, PAGE_READONLY, &dwOldProtect);
    192.    
    193.         PIMAGE_SECTION_HEADER pImageSectionHeader = (PIMAGE_SECTION_HEADER)
    194.             (pImageNtHeaders->FileHeader.SizeOfOptionalHeader +
    195.             (long)&(pImageNtHeaders->OptionalHeader));
    196.  
    197.         PBYTE pbMem = NULL;
    198.         DWORD dwRawSectionSize = 0;
    199.  
    200.         for (int i = 0; i < pImageNtHeaders->FileHeader.NumberOfSections; i++)
    201.         {
    202.             if (pImageSectionHeader->SizeOfRawData > pImageSectionHeader->Misc.VirtualSize)
    203.                 dwRawSectionSize = pImageSectionHeader->Misc.VirtualSize;
    204.             else
    205.                 dwRawSectionSize = pImageSectionHeader->SizeOfRawData;
    206.  
    207.             pbMem = (PBYTE)VirtualAlloc((LPVOID)RVATOVA(pbImage, pImageSectionHeader->VirtualAddress),
    208.                 pImageSectionHeader->Misc.VirtualSize, MEM_COMMIT, PAGE_READWRITE);
    209.  
    210.             ZeroMemory(pbMem, pImageSectionHeader->Misc.VirtualSize);
    211.             memcpy(pbMem, (void *)RVATOVA(pbDllBuff, pImageSectionHeader->PointerToRawData), dwRawSectionSize);
    212.  
    213.             pImageSectionHeader++;
    214.         }
    215.  
    216.         for (int m = 0; m < pImageNtHeaders->FileHeader.NumberOfSections; m++)
    217.         {
    218.             VirtualProtect((LPVOID)RVATOVA(pbImage, pImageSectionHeader[m].VirtualAddress),
    219.                 pImageSectionHeader[m].Misc.VirtualSize,
    220.                 GetSectionProtection(pImageSectionHeader[m].Characteristics),
    221.                 &dwOldProtect);
    222.         }
    223.  
    224.         if (!ProcessRelocs((long)pbImage, dwImageBaseDelta))
    225.             goto end;
    226.         if (!ProcessImports((long)pbImage))
    227.             goto end;
    228.         MessageBoxA(0,"ok",0,0);
    229.         entrypoint=(TDLLENTRY)(dllEntry+(DWORD)pbImage);
    230.         entrypoint((HMODULE)pbImage,DLL_PROCESS_ATTACH,NULL);
    231.         //  MessageBoxA(0,"ok",0,0);
    232.         MessageBoxA(0,"ls",0,0);
    233.     } __except (EXCEPTION_EXECUTE_HANDLER)
    234.     {
    235.         MessageBoxA(0,"ffuck",0,0);
    236.         goto end;
    237.     }
    238.  
    239.     hRet = (HMODULE)pbImage;
    240.  
    241. end:
    242.  
    243.     return hRet;
    244. }
    245.  
    246.  
    247.  
    248. BOOL APIENTRY DllMain( HMODULE hModule,
    249.                        DWORD  ul_reason_for_call,
    250.                        LPVOID lpReserved
    251.                      )
    252. {
    253.     HANDLE      hfile=INVALID_HANDLE_VALUE;
    254.     PVOID       fdata=NULL;
    255.     PCHAR       fname=NULL;
    256.     HANDLE      hcfile=INVALID_HANDLE_VALUE;
    257.     PCHAR       cfdata=NULL;
    258.     PCHAR       cfname=NULL;
    259.     PCHAR       cryptdata=NULL;
    260.     DWORD       i,j,k;
    261.     PCHAR       ss;
    262.     DWORD       size,dsize=0;
    263.     OFSTRUCT    os;
    264.     if(ul_reason_for_call!=DLL_PROCESS_ATTACH&&ul_reason_for_call!=DLL_THREAD_ATTACH)
    265.     {
    266.         MessageBoxA(0,"UNLOADING",0,0);
    267.         return true;
    268.     }
    269. //--------------------------------------------------read from config file and decrypt it
    270.     //MessageBoxA(0,"1",0,0);
    271.     cfname=(PCHAR)myalloc(strlen("C:\\fconfig.txt"));
    272.     //MessageBoxA(0,"2",0,0);
    273.     strcpy(cfname,"C:\\fconfig.txt");
    274.     hcfile=CreateFileA(cfname,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
    275.     if(hcfile==INVALID_HANDLE_VALUE)
    276.         return false;//MessageBoxA(0,"cantopenfile",0,0);
    277.     //MessageBoxA(0,"3",0,0);
    278.     size=GetFileSize(hcfile,NULL);
    279.     cryptdata=(PCHAR)myalloc(size);
    280.     if(!ReadFile(hcfile,cryptdata,size,&i,NULL))
    281.         return false;//MessageBoxA(0,"cantreadfile",0,0);
    282.     cfdata=(PCHAR)decrypt((PVOID)cryptdata,size,"");
    283.     myfree(cryptdata);
    284.     //MessageBoxA(0,cfdata,0,0);
    285.     i=0;
    286.     //MessageBoxA(0,cfname,0,0);
    287.     ss=strstr(&(cfdata[i]),"dll ");
    288.     fname=NULL;
    289.     while(ss!=NULL)
    290.     {
    291.         MessageBoxA(0,"next",0,0);
    292.         i=ss-cfdata;
    293.         i+=4;
    294.         while(cfdata[i]==' '&&i<=size)
    295.             i++;
    296.         j=i;
    297.         while(cfdata[i]!=';'&&i<=size)
    298.             i++;
    299.  
    300.         if(fname!=NULL)
    301.             myfree(fname);
    302.         fname=(PCHAR)myalloc(i-j+1);
    303.         strncpy(fname,&cfdata[j],i-j);
    304.         //MessageBoxA(0,fname,0,0);
    305.         hfile=CreateFileA(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
    306.         dsize=GetFileSize(hfile,NULL);
    307.         cryptdata=(PCHAR)myalloc(dsize);
    308.         if(!ReadFile(hfile,cryptdata,dsize,&i,NULL))
    309.             return false;//MessageBoxA(0,"cantreadfile",0,0);
    310.         fdata=decrypt(cryptdata,dsize,"");
    311.         if(cryptdata!=NULL)myfree(cryptdata);
    312.         MessageBoxA(0,"try","ok",0);
    313.         xLoadLibrary((PBYTE)fdata,ul_reason_for_call);
    314.         MessageBoxA(0,"decrypt","ok",0);
    315.         if(fdata!=NULL)myfree(fdata);
    316.         MessageBoxA(0,"this","ok",0);
    317.         ss=strstr(&cfdata[i],"dll ");
    318.     }
    319.    
    320. //--------------------------------------------------loop read and load modules
    321.  
    322. //--------------------------------------------------cleanup memory
    323.     if(fname!=NULL)
    324.         myfree(fname);
    325.     if(cfdata!=NULL)
    326.         myfree(cfdata);
    327.     if(hcfile!=INVALID_HANDLE_VALUE)
    328.         CloseHandle(hcfile);
    329.     if(hfile!=INVALID_HANDLE_VALUE)
    330.         CloseHandle(hfile);
    331.  
    332.     return TRUE;
    333. }
     
  20. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    а может у когото есть шото подобное?
    готовое я бы глянул как там сделано и может нашел бы таки ошибочку?