
10.07.2008, 20:19
|
|
Познающий
Регистрация: 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..
|
|
|