2006ǯ11��30��

Windows����­������?�� �� �եå��ؿ��λȤ���

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

������¿���� OS �������Ǥ���褦�ˡ�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 ��եå�������ˡ��ͤ��Ƥߤޤ���

klab_gijutsu2 at 22:17��Comments(4)��TrackBack(0)��win 

�ȥ�å��Хå�URL

���ε����ؤΥ�����

1. Posted by typeR   2006ǯ12��23�� 04:17
�Ϥ��ޤᤷ�ơ�
Windows�����ӥ��ؤΥեå��Ϥɤ��ʤ�ޤ�����Ʊ����꤫���ˤʤ�ΤǤ��礦����
2. Posted by DSAS Staff   2006ǯ12��25�� 12:07
�����ӥ�����ȥ�����ޥ͡�����δ������ˤ��륵���ӥ��ץ������ε�ư����������ˤ� OpenService, StartService ���� API �򥰥����Х륹�����פǥեå�������ˡ���ͤ����ޤ���
# ����ε����Ǥ� API �եå�����夲��ͽ��Ǥ�
3. Posted by typeR   2006ǯ12��26�� 01:25
����������ꤤ���ޤ���
���������ץ��������饵���ӥ����Ф��Ʋ����������Ǥ������٤Υեå��Ϥɤ��ʤ�ΤǤ��礦����
4. Posted by DSAS Staff   2006ǯ12��26�� 15:54
���ߤޤ��󡢤�����ΰտޤ�⤦�ҤȤĵ�᤺�ˤ���ΤǤ������ɤ����ä������μ¸�����ɸ�Ȥ���Ƥ���ΤǤ��礦��

���ε����˥����Ȥ���

̾��:
URL:
  ����òµ­²ï¿½: ɾ��: ��    ��
 
 
 
Blog�⸡��
�ǿ�����
Archives
���Υ֥����ˤĤ���
DSAS�Ȥϡ�KLab �����ۤ����Ѥ��Ƥ��륳��ƥ�ĥ����ӥ��Ѥ�Linux�١����Υ���ե�Ǥ�������5����Υǡ������󥿤ˤƹ��ۤ������Ѥ��Ƥ��ޤ������桹��DSAS����Ȥ��䤹�����������ˡ������Ƥ����ϤDZ��ѤǤ��뤳�Ȥ��ܻؤ��ơ��������ɤ˶Ф���Ǥ��ޤ���
���Υ֥����Ǥϡ������ DSAS �ǻȤäƤ��뵻�ѤξҲ�䡢�¸����Ƥߤ���̤���𡢥ȥ�֥�˴������ޤ줿���ηи��̤ʤɡ���������������������򿥤�ޤ��ƾҲ𤷤Ƥ��������Ȼפ��ޤ���
�ǿ�������
<%==comments[n].author%>
<% } %>


'); label.html('\ �饤�֥ɥ��֥����ǤϹ���Υѡ����ʥ饤�������¬��Τ��᥯�å���(cookie)����Ѥ��Ƥ��ޤ���
\ ���ΥХʡ����Ĥ��뤫�������³���뤳�Ȥǥ��å����λ��Ѥ�ǧ������������ΤȤ����Ƥ��������ޤ���
\ �ޤ��������ͤ����ҥѡ��ȥʡ���Ȥˤ��������μ�³���ˤ�ꡢ���å����λ��Ѥ�������뤳�Ȥ�Ǥ��ޤ���
\ �ܺ٤��饤�֥ɥ����ѵ���򤴳�ǧ����������\ '); banner.append(label); var closeButton = $('