Показать сообщение отдельно

  #18  
Старый 10.07.2008, 20:19
SlyBit
Познающий
Регистрация: 04.07.2008
Сообщений: 56
Провел на форуме:
390892

Репутация: 60
По умолчанию

А вот и пример подмены точки входа библиотеки подоспел (описание несколькими постами выше):

Код:
#include <windows.h>
#include "ntdll.h"
  
#pragma comment(linker, "/ENTRY:Main")
  
typedef DWORD (WINAPI *PTRUEENTRY)(HMODULE Module, DWORD Reason, LPVOID Reserved);
  
PVOID dwTrueAddr;
  
DWORD WINAPI CatchExit(HMODULE Module, DWORD Reason, LPVOID Reserved)
{
    if(Reason == DLL_PROCESS_DETACH) {
        // Событие перед завершение приложения
    }
    return ((PTRUEENTRY)dwTrueAddr)(Module, Reason, Reserved);
}
  
VOID WINAPI HookDllEntry(PWCHAR pDllName, PVOID pDummyEntry)
{
    PPEB pPeb;
    PPEB_LDR_DATA pPebLdrData;
    PLDR_DATA_TABLE_ENTRY pLdrDataTableEntry;
    DWORD dwBlink;
   
    __asm {
        mov eax, fs:[0x30]
        mov pPeb, eax
    }
     
    pPebLdrData = (PPEB_LDR_DATA)pPeb->Ldr;
    
    // Запоминаем адрес последнего элемента в двусвязном списке
    dwBlink = *(PDWORD)pPebLdrData->InMemoryOrderModuleList.Blink;

    // Получаем указатель на первую структуру в двусвязном списке
    pLdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)pPebLdrData->InLoadOrderModuleList.Flink;
     
    // Обходим все структуры и как находим библиотеку с именем pDllName, изменяем её точку входа
    do {
        pLdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)pLdrDataTableEntry->InLoadOrderModuleList.Flink;
        if(!lstrcmpW(pLdrDataTableEntry->BaseDllName.Buffer, pDllName)) {
            dwTrueAddr = pLdrDataTableEntry->EntryPoint;
            pLdrDataTableEntry->EntryPoint = pDummyEntry;
        }
    } while(dwBlink != *(PDWORD)pLdrDataTableEntry->InMemoryOrderModuleList.Flink);
}
   
VOID WINAPI Main()
{   
    HookDllEntry(L"ntdll.dll", CatchExit);
    ExitProcess(0);
}

Последний раз редактировалось SlyBit; 10.07.2008 в 20:22..
 
Ответить с цитированием