Внедрение DLL с помощью ловушек - Модуль внедряемой DLL
ОГЛАВЛЕНИЕ
Страница 3 из 3
Листинг №2 - модуль внедряемой DLL
// DLLToInject.cpp : Defines the entry point for the DLL application.Ну вот вроде и все. Буду рад любым предложенным усовершенствованиям. Также с удовольствием приму все советы и дополнения. Ну и конечно с готовностью выслушаю любую критику, только весом не более 100кб :-)) Пишите!
#include "stdafx.h"
// Определяем переменные, доступные всем экземплярам данной DLL
#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
// Идентификатор хука. Он необходим для вызова функции СallNextHookEx,
// а так как вызов SetWindowsHookEx производится в процессе, внедряющем
// DLL, то данный идентификатор возможно передать в функцию,
// обрабатывающую хук, только таким образом
#pragma data_seg()
// Директива линкеру создать разделяемую(shared) секцию с атрибутами RWS
#pragma comment(linker, "/section:Shared,rws")
HINSTANCE g_hinstDll = NULL;
const TCHAR g_szRegSubKey[] =
__TEXT("Software\\buLLet\\Desktop Shortcuts Position Saver");
void SaveListViewItemPositions(HWND hwndLV);//сохраняет ярлыки
void RestoreListViewItemPositions(HWND hwndLV);//восстанавливает ярлыки
BOOL CALLBACK DlgProc(HWND hwnd, UINT uMsg,WPARAM wParam, LPARAM lParam);
// Процедура диалога серверного окна
void OnClose(HWND hwnd);
LRESULT CALLBACK GetMsgProc (int nCode, WPARAM wParam, LPARAM lParam);
// Обрабатывает хук
////////////////////////////////////////////////////////////////////////
__declspec(dllexport) BOOL WINAPI InjectDLL(DWORD dwThreadId,
HANDLE SwitcherEvent) {
BOOL fOk = FALSE;
if (dwThreadId != 0) {
// Проверяем не установлен ли хук???
if(g_hhook != NULL)
return fOk;
// Если да, то выход
ResetEvent(SwitcherEvent);
// Устанавливаем хук на указанный в dwThreadId поток
g_hhook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc,g_hinstDll,
dwThreadId);
fOk = (g_hhook != NULL);
if (fOk)
// Ловушка успешно внедрена, теперь вызываем PostThreadMessage, чтобы
// послать explorer сообщение, тогда ОС автоматически внедряет нашу
// DLL в адресное пространство explorer и вызывает GetMsgProc
fOk = PostThreadMessage(dwThreadId, WM_NULL, 0, 0);
}
else {
// Проверяем установлен ли хук????
if(g_hhook == NULL)
return FALSE;
fOk = UnhookWindowsHookEx(g_hhook);
// Отключаем DLL от explorer
g_hhook = NULL;
}
return(fOk);
}
////////////////////////////////////////////////////////////////////////
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
// DLL привязана к какому-то потоку
g_hinstDll = (HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
// A new thread is being created
// in the current process
break;
case DLL_THREAD_DETACH:
// A thread is exiting cleanly
break;
case DLL_PROCESS_DETACH:
// The calling process is detaching the
// DLL from its address space
break;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK GetMsgProc (int nCode,
WPARAM wParam, LPARAM lParam)
{
static BOOL fFirstTime = TRUE;
HWND hDlg;
HANDLE SwitcherEvent;
if (fFirstTime) {
// DLL только что была внедрена в explorer
fFirstTime = FALSE;
// Открываем объект-событие для синхронизации с вызывающим
// процессом
SwitcherEvent=OpenEvent(EVENT_MODIFY_STATE,FALSE,"bullet");
if(SwitcherEvent==NULL)
_INFO("Uppsss..","Error opening switcher event!!");
// Создаем скрытое окно диалога для возможности обмена сообщениями
// с вызывающим процессом
hDlg=CreateDialog(g_hinstDll, MAKEINTRESOURCE(IDD_SERVER_DIALOG),
NULL, DlgProc);
if(IsWindow(hDlg)) {
// Сообщаем вызывающему процессу, что диалог создан и готов
// принимать комманды
SetEvent(SwitcherEvent);
}
}
return (CallNextHookEx(g_hhook, nCode, wParam, lParam));
}
////////////////////////////////////////////////////////////////////////
BOOL CALLBACK DlgProc(HWND hwnd, UINT uMsg,WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_CLOSE:
OnClose(hwnd);
break;
case WM_APP:
HWND hwndLV,hwndDSPS;
hwndDSPS = FindWindow(NULL, __TEXT("buLLet shortcut saver"));
if (lParam==IDC_SAVE) {
SendMessage(hwndDSPS,WM_APP,0,(LPARAM)IDC_SAVE);
// Сообщить, что сохранение пошло
SaveListViewItemPositions((HWND) wParam);
// Сохранить позиции
}
if (lParam==IDC_RESTORE) {
SendMessage(hwndDSPS, WM_APP, 0,(LPARAM)IDC_RESTORE);
// Сообщить, что восстановление пошло
RestoreListViewItemPositions((HWND) wParam);
// Восстановить ярлыки
}
break;
}
return(FALSE);
}
////////////////////////////////////////////////////////////////////////
void OnClose(HWND hwnd) {
DestroyWindow(hwnd);
}
////////////////////////////////////////////////////////////////////////
void SaveListViewItemPositions(HWND hwndLV) {
int nItem, nMaxItems = ListView_GetItemCount(hwndLV);
HKEY hkey;
DWORD dwDisposition;
LONG l = RegDeleteKey(HKEY_CURRENT_USER, g_szRegSubKey);
l = RegCreateKeyEx(HKEY_CURRENT_USER, g_szRegSubKey,
0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE,
NULL, &hkey, &dwDisposition);
for (nItem = 0; nItem < nMaxItems; nItem++)
{
TCHAR szName[1024];
POINT pt;
ListView_GetItemText(hwndLV, nItem, 0, szName, 1024);
ListView_GetItemPosition(hwndLV, nItem, &pt);
l = RegSetValueEx(hkey, szName, 0,
REG_BINARY, (PBYTE) &pt, sizeof(pt));
if(l != ERROR_SUCCESS)
_INFO("OOooppss...","RegSetValueEX return ERROR");
}
RegCloseKey(hkey);
}
////////////////////////////////////////////////////////////////////////
void RestoreListViewItemPositions(HWND hwndLV) {
HKEY hkey;
LONG l = RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegSubKey,
0, KEY_QUERY_VALUE, &hkey);
if (l == ERROR_SUCCESS)
{
int nIndex;
DWORD dwStyle=(DWORD)GetWindowLong(hwndLV, GWL_STYLE);
if (dwStyle & LVS_AUTOARRANGE)
SetWindowLong(hwndLV, GWL_STYLE,dwStyle & ~LVS_AUTOARRANGE);
l = NO_ERROR;
for (nIndex = 0; l != ERROR_NO_MORE_ITEMS; nIndex++) {
TCHAR szName[1024];
POINT pt;
LV_FINDINFO lvfi;
unsigned long cbValueName = 1024;
LPDWORD lpcbValueName=&cbValueName;
unsigned long cbData = sizeof(pt), nItem;
LPDWORD lpcbData=&cbData;
DWORD dwType;
l = RegEnumValue(hkey, nIndex, szName, lpcbValueName,
NULL, &dwType, (PBYTE) &pt, lpcbData);
if (l == ERROR_NO_MORE_ITEMS)
continue;
if ((dwType == REG_BINARY) && (cbData == sizeof(pt)))
{
lvfi.flags = LVFI_STRING;
lvfi.psz = szName;
nItem = ListView_FindItem(hwndLV, -1, &lvfi);
if (nItem != -1)
{
ListView_SetItemPosition(hwndLV, nItem, pt.x, pt.y);
}
}
}
SetWindowLong(hwndLV, GWL_STYLE, dwStyle);
RegCloseKey(hkey);
}
}