Windows����Â������?�� �� �եå��ؿ��λȤ���
������Υץ��������Ф��� Windows ��å������δƻ롦��ª
������Υץ������Ǥ�����Υ��٥�Ȥ˸Ʊ����뼫����ɤ�����
����¸�Υ��ץꥱ�������ν����ѹ� etc.
�ּ���Υ����ɤ򤢤�ץ������˲���������פȤϤɤ��������ȤǤ��礦��
�����Υ⥸�塼�륤�᡼���˥����������ƥޥ����̿���ñ¤´ï¿½ï¿½ï¿½ï¿½Æ¡ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¡ï¿½â¤¢ï¿½ê¤½ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½Windows �Ǥ� DLL �����Ѥ��뤳�Ȥ����Ū�ưפˤ���̿�����Ǥ��ޤ���
���������ץ������¹��Ѥ��Ѱդ����ץ��������֤ˤϡ��¹ԥ⥸�塼�����Τȼ¹ԥ⥸�塼��ΰ�¸���� DLL �⥸�塼�뤬�ޥåԥ󥰤��졢����ʹߡ�DLL ��Υ����ɤϼ¹ԥ⥸�塼��Υץ������ΰ����Ȥ���Ʃ��Ū�˰�����褦�ˤʤ�ޤ���
���Τ��Ȥ�դ˹ͤ���ȡ������ DLL �����Υץ������Υ�����֤ض���Ū�˥ޥåԥ󥰤��Ƥ��С������˴ޤޤ�륳���ɤ������ץ������ΰ����Ȥ��ư����뤳�Ȥˤʤ�ޤ������μ�ˡ�ϰ��̤ˡ�DLL ���󥸥��������פȸƤФ�Ƥ��ꡢʣ������ˡ�Ǽ¸����뤳�Ȥ��Ǥ��ޤ���
�����ǤҤȤĵ��䤬ͯ���Ƥ��ޤ������� DLL �򤢤�ץ��������������뤳�Ȥ��Ǥ����Ȥ��Ƥ⡢�����˴ޤޤ�륳���ɤ������ץ�������Ǽ¹Ԥ�����ˤϤɤ�����Ф褤�ΤǤ��礦�����μ¹ԥ⥸�塼��ϼ��� DLL �˴ؤ���̵�ռ��Ǥ����鲿�⤷�ʤ���Ф��� DLL ��Υ����ɤϰ�Ԥ�¹Ԥ���ʤ��Ϥ��Ǥ���
���Τ���ΤҤȤĤ���ˡ�� DllMain() �ؿ��ƤӽФ��Υᥫ�˥�������ѤǤ���
����ץ������� DLL ���ǽ�˥ޥåԥ󥰤����ݡ�Windows �Ϥ��� DLL ���DllMain() �ؿ��� DLL_PROCESS_ATTACH ���Τ�ȼ�äƥץ���������ƤӽФ����Ȥ��ޤ����ĤޤꡢDLL �� DllMain() �òµ½Ò¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½Æ±ï¿½ï¿½ï¿½Î¤Ø¤Î¥Ï¥ï¿½É¥ï¿½ï¿½ï¿½Ñ°Õ¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½Ð¼ï¿½Æ°Åªï¿½Ë¼ï¿½ï¿½î¥³ï¿½ï¿½ï¿½É¤ï¿½ï¿½×¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¼Â¹Ô¤ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¤Ç¤ï¿½ï¿½ï¿½
¾�ˡ�C++ ���饹�Υ��󥹥����ѿ��� DLL ��Υ������Х륹�����פ�������Ƥ������Ȥˤ�ꡢDLL �ޥåԥ󥰻��˥��󥹥����ѿ��Υ��󥹥ȥ饯����ư�¹Ԥ�������ˡ��ͤ����ޤ���
�����ε����Ϥ�����⼫�� DLL ���ǽ�˥ץ������˥ޥåԥ󥰤����ݤ˰��ٶ�ư�����ΤߤǤ��������ε��˥ץ����������ν���Υ��ɥ쥹��������뤳�Ȥˤ������� Windows API ��եå����뤿��ν����������Ƥ����С������ץ��������Ф����³Ū�ʸ��̤����ꤹ�뤳�Ȥ��ǽ�Ǥ���
�ޤ���Windows �� SetWindowsHookEx() API ��Ȥ��С�DLL ���󥸥���������Ʊ���ˡ�����Υ��٥�ȥ�����ȯ���˸Ʊ���������Ρ֥եå��ץ���������פ���ꤹ�뤳�Ȥ��Ǥ��ޤ�������ϡ���Ϥ�ˤ��� API ���Ѥ��� C �Ǵ�ñ�ʥեå������ɤ�񤤤Ƥߤ뤳�Ȥˤ��ޤ��礦��
�եå������ɤλ��
�������Ȥ��ơ�����Υ��ץꥱ�������ε�ư��ػߤ���ץ������פ�������Ƥߤޤ��������Ǥ϶ػ��оݤȤ��륢�ץꥱ�������Ȥ��� Windows ɸ��Ρ֥��Ģ�פ����ꤷ�ޤ���
�ޤ� MSDN �����Ȥ� SetWindowsHookEx() �λ��ͤ��ǧ���Ƥߤޤ��礦��
http://msdn.microsoft.com/library/ja/jpipc/html/_win32_setwindowshookex.asp
���� API ����Ѥ����ǤΥݥ���Ȥϰʲ������ƤǤ��뤳�Ȥ��狼��ޤ���
- SetWindowsHookEx() �ϡ����ꤷ�� DLL ����ν���Υեå��ץ���������򥷥��ƥ�δ�������եå�����������ɲä��뤳�Ȥ���Ū�Ȥ����ΤǤ���
- �եå�����������¸�ߤ����̤Υեå��ץ�������������Τ�����Ϥ�����ˡ��եå��ץ�����������椫�� CallNextHookEx() API ��ƤӽФ��٤��Ǥ���
- �եå��Υ������פˤ�����Υ���åɤΤߤ��оݤȤ����Τ����ץ��������оݤȤ��륰�����Х�եå��Τդ��Ĥ�����
- �ƻ뤹�륤�٥�ȤΥ����פ�����Ѥߤ�������椫�����򤹤�
- �������Х�եå��򤫤���ˤϡ�SetWindowsHookEx() �ƤӽФ��� DLL ���椫��Ԥ�ɬ�פ�����
- SetWindowsHookEx() ��˥եå������פȤʤä������� UnhookWindowsHookEx()��ƤӽФ��ʤ���Фʤ�ʤ�
��
��
����Υ������åȤϤ��Ǥ�¸�ߤ���ץ������Υ���åɤǤϤʤ�����˵�ư����ץ������Ǥ��뤿�ᡢ�����ƥ����Τ˥������Х�եå���Ŭ�Ѥ��뤳�Ȥˤʤ�ޤ���
�����ޤǤξ���ǡ�ɬ�פʥ⥸�塼��ϰʲ��� exe + DLL �ι����ˤʤ뤳�Ȥ��狼��ޤ���
[myDLL]
[myEXE] +-------------------------------+
+-----+ | �եå��ץ������������� |
| | �եå������� +-------------------------------+
| ------------------> SetWindowsHookEx �ƽФ� --------+
| | �եå����� | | |
| ------------------> UnhookWindowsHookEx �ƽФ�-----+ |
+-----+ | | | |
+-------------------------------+ | |
| |
�㥷���ƥ�Υեå���������� | |
| |
myDLL�� �Υեå��ץ��������㤬������� <-------+ |
|
myDLL�� �Υեå��ץ��������㤬�ɲä����<---------+
���եå������꡿�������Τ� myEXE �ץ������ΤߤǤ��뤳�Ȥ�����
SetWindowsHookEx() �ػ��ꤹ��ѥ�᡼�����������Ƥߤޤ���
HHOOK SetWindowsHookEx(
int idHook, // �եå�������
HOOKPROC lpfn, // �եå��ץ���������
HINSTANCE hMod, // ���ץꥱ������󥤥󥹥��󥹤Υϥ�ɥ�
DWORD dwThreadId // ����åɤμ��̻�
);
idHook �ˤϴƻ뤹�륤�٥�ȤΥ����פ���ꤷ�ޤ�������ϥ��ץꥱ�������ε�ư��ƻ뤹�뤳�Ȥ���Ū�ʤΤǡ�WH_SHELL ����ꤷ�ޤ���
lpfn �ˤϼ���Υեå��ץ���������Υ��ɥ쥹����ꤷ�ޤ���
hmod �ˤ��� DLL �Υ⥸�塼��ϥ�ɥ����ꤷ�ޤ���
dwThreadId �ˤϴƻ��оݤȤ��륹��åɤ� ID ����ꤷ�ޤ�������� 0 ����ꤹ�뤳�Ȥǥ����ƥ�˥������Х�եå��򤫤��ޤ���
WH_SHELL ���٥�ȥ����פ��б�����եå��ץ���������λ��ͤ��ǧ���Ƥߤޤ��礦��
http://msdn.microsoft.com/library/ja/jpipc/html/_win32_shellproc.asp
LRESULT CALLBACK ShellProc(
int nCode, // �եå�������
WPARAM wParam, // ���٥����Í���
LPARAM lParam // ���٥����Í���
);
nCode �ΰ����򸫤�ȡ�HSHELL_WINDOWCREATED �˼�������������ޤ���
1�ĤΥȥåץ�٥륦����ɥ��ʿƤ�����ʤ�������ɥ��ˤ���������ޤ�����
�����ƥब ShellProc �ؿ���ƤӽФ��������ǡ����ˤ��Υ�����ɥ���¸�ߤ��Ƥ��ޤ���
�եå��ץ��������㤬���� HSHELL_WINDOWCREATED ���Τ�����������Ǹ��ߤΥץ����������Ģ�Ǥ��뤫�ݤ���Ƚ�ꤷ���⤷�����Ǥ���Ф������� ExitProcess() ���뤳�ȤǺ������Ū��ã���Ǥ������Ǥ���
�եå����������Ҥ������ CallNextHookEx()
http://msdn.microsoft.com/library/ja/jpipc/html/_win32_callnexthookex.asp
LRESULT CallNextHookEx(
HHOOK hhk, // ���ߤΥեå��Υϥ�ɥ�
int nCode, // �եå��ץ�����������Ϥ��եå�������
WPARAM wParam, // �եå��ץ�����������Ϥ���
LPARAM lParam // �եå��ץ�����������Ϥ���
);
������ hhk �ˤϼ�������������ޤ���
���ߤΥեå��Υϥ�ɥ����ꤷ�ޤ������ץꥱ�������ϡ�SetWindowsHookEx
�ؿ���ƤӽФ����ݤ˼��������ϥ�ɥ����ꤷ�ޤ���
myDLL �����SetWindowsHookEx() ��ƤӽФ��롼����פ�ƤӽФ��Τ����Ҥ��̤�myEXE �ΤߤǤ��ꡢCallNextHookEx ��ƤӽФ��եå��ץ���������Ϥ��٤ƤΥץ���������ƤӽФ���ޤ������ץ������ǥեå��ϥ�ɥ��Í�������Ȥ����Ǥ�����DLL�ˤ������̾����ˡ����������������Х��ѿ��ϥץ������֤Ƕ�Í���줺�ƥץ��������������Ω�������󥹥��󥹤���������뤳�Ȥ�פ��Ф��Ʋ��������ץ������֤�DLL ����ѿ���Í������ˡ�ˤĤ��Ƥϰʲ��ε����ò»²¾È¤ï¿½ï¿½Æ²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
��How To Share Data Between Different Mappings of a DLL��
http://support.microsoft.com/kb/125677/en-us
�Ǹ�ˡ������ޤǤ��μ����Ȥ� myDLL �򥳡��ǥ��󥰤��Ƥߤޤ���
myEXE ¦�ϡ�Ŭ���ʥȥꥬ���� myDLL �Υ������ݡ��ȴؿ��Ǥ��� StartHook() ��EndHook() ��Ǥ�դ˸ƤӽФ����Ȥ��Ǥ����ץ������Ȥ��Ƥ��ξ��֤�ݻ����뤳�Ȥβ�ǽ�����ƤǼ������ޤ����եå��椫�ݤ���Ƚ��ˤ� QueryHookState() �ؿ������Ѥ���Ȥ褤�Ǥ��礦��
#include <windows.h>
#define CHKPROC_API __declspec(dllexport)
// �ץ������֤Ƕ�Í���륰�����Х��ѿ������
#pragma comment(linker, "/section:shared,rws")
#pragma data_seg("shared")
static HHOOK g_hHookProc = NULL; // �եå��ץ���������ϥ�ɥ�
#pragma data_seg()
// ���ץ�������Υ������Х��ѿ�
static HINSTANCE g_hDLLMod = NULL;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hDLLMod = (HINSTANCE)hModule; // ��DLL�Υ⥸�塼��ϥ�ɥ�
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// �եå��ץ���������
LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam)
{
char szBuf[MAX_PATH];
if (nCode == HSHELL_WINDOWCREATED) { // �ȥåץ�٥륦����ɥ���������
GetModuleFileName(NULL, szBuf, sizeof(szBuf));
// ���ץ������Υ⥸�塼��̾�����Ģ�ʤ餳�λ����ǥץ�������λ
if (stricmp(szBuf, "C:\\WINDOWS\\system32\\notepad.exe") == 0) {
ExitProcess(0);
}
}
// �եå�����������μ��Υեå��طҤ�
return CallNextHookEx(g_hHookProc, nCode, wParam, lParam);
}
// �������ݡ��ȴؿ����եå��γ���
CHKPROC_API BOOL StartHook()
{
if (!g_hHookProc) {
// WH_SHELL �����פΥեå��ץ���������򥰥����Х륹�����פǥ��󥹥ȡ���
g_hHookProc = SetWindowsHookEx(WH_SHELL, (HOOKPROC)ShellProc, g_hDLLMod, 0);
if (!g_hHookProc) {
return FALSE;
}
}
return TRUE;
}
// �������ݡ��ȴؿ����եå��ν�λ
CHKPROC_API void EndHook()
{
if (g_hHookProc) {
UnhookWindowsHookEx(g_hHookProc);
g_hHookProc = NULL;
}
}
// �������ݡ��ȴؿ����եå��椫�ݤ���Ƚ��
CHKPROC_API BOOL QueryHookState()
{
return (g_hHookProc) ? TRUE : FALSE;
}
myEXE ��ư����StartHook() �ؿ���ƤӽФ������֤�¾�Υ��ץꥱ�������ε�ư���Ƥߤޤ��礦�����Ģ�Τߤ���ư�ԲĤȤʤäƤ���������Ǥ���myEXE ��λ�������� EndHook() ��ƤӽФ��ƥեå��������뤳�Ȥ�˺��ʤ��Dz�������
�ʤ�������ץ륳���ɤǤ�ñ�㲽�Τ���˵�ư�ػߤȤ��륢�ץꥱ��������ñ�˥ե�ѥ�̾��ɾ�����Ƥ��ޤ������ػߤ��� exe �ե�����Υ����å�����򤢤餫����MD5 ���ο������ι⤤�������ϥå���ؿ��Ǽ����ξ�ǡ��������Ƥ�����ShellProc()��Ǹ��ץ������μ¹ԥ⥸�塼��Υ����å�����Ⱦȹ礹��Ȥ��ä�������ä���м����������夹��Ǥ��礦���ޤ����ƥ������ݡ��ȴؿ��� myEXE �ʳ������ݸ�������ä��뤳�Ȥ����ޤ����Ǥ��礦��
����������� Windows API ��եå�������ˡ��ͤ��Ƥߤޤ���
�ȥ�å��Хå�URL
���ε����ؤΥ�����
Windows�����ӥ��ؤΥեå��Ϥɤ��ʤ�ޤ�����Ʊ����꤫���ˤʤ�ΤǤ��礦����
# ����ε����Ǥ� API �եå�����夲��ͽ��Ǥ�
���������ץ��������饵���ӥ����Ф��Ʋ����������Ǥ������٤Υեå��Ϥɤ��ʤ�ΤǤ��礦����