2009ǯ06��24��
Windows�ץ������ΰ۾ェλ��ȥ�åפ��륳����
�� �Ϥ����
����������Ǥ����������꤬����ޤ�����
��Windows ��Υץ������ A ���饽���������ɤΤʤ��ץ������ B ��ư����ɬ�פ����������ɡ��ץ������ B �ϤȤ��ɤ��۾ェλ������ä��ꤹ�롣�����Ѥ���������뤳�ȼ��Τ��ܤ�Ĥ֤�Ȥ��ơ��ץ������ B ���۾ェλ�������ˤϥץ������ A ¦�Ǥ������˥ϥ�ɥ뤷�������ɤ���ˡ�Ϥʤ���Τ���
�����ä˶�̣�򴶤����۾ェλ�򵯤���û���ץ��������äƥǥХå��ǥȥ졼�����ʤ���ҥ�Ȥ�õ���Ƥ�����ˤդȻפ��ޤ�����
���Υץ���������Ǽ¹Ԥ���ȡ��ץ��������ǽ�������ʤ��㳰�ϿޤΤ褦�ʷ��ǥ����ƥ�ˤ�äƽ�������ޤ������������ǥХå���ǥǥХå��ʥǥХå��оݡˤȤ��Ƽ¹Ԥ��Ƥ�����ϥǥХå����㳰��ȯ�����Τ������桼���������ޤ����Ĥޤꡢ�ǥХå������沼�ˤ���ޤ���
�Ȥ������Ȥϡ֥ǥХå��Ȥ���ư��륳���ɡפ��Ѱդ��ץ������ B ��ǥХå��Ȥ��ư����С�������ȯ������̤�������㳰����ª���뤳�Ȥ��Ǥ��뤫�⤷��ޤ��� ����ä����򤽤��ʤΤǻ�ˤ��������ץ�������񤤤Ƥߤ뤳�Ȥˤ��ޤ�����
����������Ǥ����������꤬����ޤ�����
��Windows ��Υץ������ A ���饽���������ɤΤʤ��ץ������ B ��ư����ɬ�פ����������ɡ��ץ������ B �ϤȤ��ɤ��۾ェλ������ä��ꤹ�롣�����Ѥ���������뤳�ȼ��Τ��ܤ�Ĥ֤�Ȥ��ơ��ץ������ B ���۾ェλ�������ˤϥץ������ A ¦�Ǥ������˥ϥ�ɥ뤷�������ɤ���ˡ�Ϥʤ���Τ���
�����ä˶�̣�򴶤����۾ェλ�򵯤���û���ץ��������äƥǥХå��ǥȥ졼�����ʤ���ҥ�Ȥ�õ���Ƥ�����ˤդȻפ��ޤ�����
���Υץ���������Ǽ¹Ԥ���ȡ��ץ��������ǽ�������ʤ��㳰�ϿޤΤ褦�ʷ��ǥ����ƥ�ˤ�äƽ�������ޤ������������ǥХå���ǥǥХå��ʥǥХå��оݡˤȤ��Ƽ¹Ԥ��Ƥ�����ϥǥХå����㳰��ȯ�����Τ������桼���������ޤ����Ĥޤꡢ�ǥХå������沼�ˤ���ޤ���
�Ȥ������Ȥϡ֥ǥХå��Ȥ���ư��륳���ɡפ��Ѱդ��ץ������ B ��ǥХå��Ȥ��ư����С�������ȯ������̤�������㳰����ª���뤳�Ȥ��Ǥ��뤫�⤷��ޤ��� ����ä����򤽤��ʤΤǻ�ˤ��������ץ�������񤤤Ƥߤ뤳�Ȥˤ��ޤ�����
�� �ɤ�������Τ��롩
��ꤿ���ץ������Υ��᡼���Ϥ���������ΤǤ���- ���ꤵ�줿�ץ�������ҥץ������Ȥ��Ƽ¹Ԥ���
- �ҥץ��������̤�������㳰��ȯ�����������ν�λ�����ɤ��֤�
- �ҥץ�����������˽�λ�������ˤϤ��ν�λ�����ɤ��֤�
�� �ɤ���äƺ�롩
�ǥХå���Ȥä����ȤΤʤ��ץ�����ޤϾ��ʤ��Ȼפ��ޤ������ǥХå����ä����ȤΤ���ץ�����ޤ�ޤ����ޤ�¿���Ϥʤ��Ǥ��礦��ɮ�Ԥˤ⤽�ηи��Ϥʤ����ʤ���������̤������פȤ������᡼��������ޤ�����äȤ⺣�����ɸ�ϥץ�������ǥХå����뤿��ΥǥХå����뤳�ȤǤϤʤ������ޤǤ�ǥХå��ε�ǽ�ΰ��������Ѥ��뤳�ȤǤ����餢�ޤ굤�ˤ����¸���ˡ��Ĵ�٤뤳�Ȥˤ��ޤ�����˽񤤤��̤ꤳ�Υץ������ϻҥץ�������ư�����ΤǤ��� ���ϤȤ⤢�� CreateProcess API �������򤢤餿����ɤ�Ǥߤޤ���
MSDN �饤�֥�� - CreateProcess �ؿ�
6 ���ܤΥѥ�᡼���� dwCreationFlags �������˼��ε��Ҥ�����ޤ���
DEBUG_PROCESS
���Υե饰����ꤹ��ȡ��ƤӽФ�¦�ץ�������ǥХå��� �������ץ�������ǥХå��оݤȤ��ư����ޤ��������ƥ�ϡ��ǥХå��оݤ� �ץ��������ȯ�����뤹�٤ƤΥǥХå����٥�Ȥ�ƤӽФ�¦����åɤ����Τ��ޤ���
���줳�줳�졪�Ȥ��������ǡ��֥ǥХå����٥�ȡפȤ����������ë¥ï¿½ï¿½ï¿½ï¡¼ï¿½É¤ï¿½Ð¤Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
�����ˤϤ���ʾ�������ϸ�������ޤ��󡣡�DEBUG_PROCESS�פ�Ĵ�٤Ƥߤޤ���
���Υե饰����ꤹ��ȡ��ƤӽФ�¦�ץ�������ǥХå��� �������ץ�������ǥХå��оݤȤ��ư����ޤ��������ƥ�ϡ��ǥХå��оݤ� �ץ��������ȯ�����뤹�٤ƤΥǥХå����٥�Ȥ�ƤӽФ�¦����åɤ����Τ��ޤ���
MSDN �饤�֥�� - Process Creation Flags (Windows)
DEBUG_PROCESS��0x00000001
The calling thread starts and debugs the new process and all child processes created by the new process. It can receive all related debug events using the WaitForDebugEvent function.
�ǥХå����٥�ȤȤ�����Τ� WaitForDebugEvent �ؿ��Ǽ�����뤳�Ȥ��Ǥ���Ȥ������ȤǤ��͡�
The calling thread starts and debugs the new process and all child processes created by the new process. It can receive all related debug events using the WaitForDebugEvent function.
MSDN �饤�֥�� - WaitForDebugEvent �ؿ�
�ǥХå���Υץ������ǥǥХå����٥�Ȥ�ȯ������Τ��Ե����ޤ���
BOOL WaitForDebugEvent(
LPDEBUG_EVENT lpDebugEvent,
DWORD dwMilliseconds
);
�ѥ�᡼��
lpDebugEvent
�Ե�����ǥХå����٥�Ȥξ������ä� ��¤�ΤؤΥݥ��󥿤���ꤷ�ޤ���
dwMilliseconds
�ǥХå����٥�Ȥ��Ե�������֤�ߥ���ñ�̤ǻ��ꤷ�ޤ���
DEBUG_EVENT ��¤�Τ�Ĵ�٤Ƥߤޤ���
BOOL WaitForDebugEvent(
LPDEBUG_EVENT lpDebugEvent,
DWORD dwMilliseconds
);
�ѥ�᡼��
lpDebugEvent
�Ե�����ǥХå����٥�Ȥξ������ä� ��¤�ΤؤΥݥ��󥿤���ꤷ�ޤ���
dwMilliseconds
�ǥХå����٥�Ȥ��Ե�������֤�ߥ���ñ�̤ǻ��ꤷ�ޤ���
MSDN �饤�֥�� - DEBUG_EVENT Structure (Windows)
typedef struct _DEBUG_EVENT {
DWORD dwDebugEventCode;
DWORD dwProcessId;
DWORD dwThreadId;
union {
EXCEPTION_DEBUG_INFO Exception;
CREATE_THREAD_DEBUG_INFO CreateThread;
CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
EXIT_THREAD_DEBUG_INFO ExitThread;
EXIT_PROCESS_DEBUG_INFO ExitProcess;
LOAD_DLL_DEBUG_INFO LoadDll;
UNLOAD_DLL_DEBUG_INFO UnloadDll;
OUTPUT_DEBUG_STRING_INFO DebugString;
RIP_INFO RipInfo;
} u;
}DEBUG_EVENT, *LPDEBUG_EVENT;
dwDebugEventCode
The code that identifies the type of debugging event. This member can be one of the following values.
Remarks
If the WaitForDebugEvent function succeeds, it fills in the members of a DEBUG_EVENT structure.
DWORD dwDebugEventCode;
DWORD dwProcessId;
DWORD dwThreadId;
union {
EXCEPTION_DEBUG_INFO Exception;
CREATE_THREAD_DEBUG_INFO CreateThread;
CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
EXIT_THREAD_DEBUG_INFO ExitThread;
EXIT_PROCESS_DEBUG_INFO ExitProcess;
LOAD_DLL_DEBUG_INFO LoadDll;
UNLOAD_DLL_DEBUG_INFO UnloadDll;
OUTPUT_DEBUG_STRING_INFO DebugString;
RIP_INFO RipInfo;
} u;
}DEBUG_EVENT, *LPDEBUG_EVENT;
dwDebugEventCode
The code that identifies the type of debugging event. This member can be one of the following values.
- CREATE_PROCESS_DEBUG_EVENT
- CREATE_THREAD_DEBUG_EVENT
- EXCEPTION_DEBUG_EVENT
Reports an exception debugging event. The value of u.Exception specifies an EXCEPTION_DEBUG_INFO structure.
- EXIT_PROCESS_DEBUG_EVENT
- EXIT_THREAD_DEBUG_EVENT
- LOAD_DLL_DEBUG_EVENT
- OUTPUT_DEBUG_STRING_EVENT
- RIP_EVENT
- UNLOAD_DLL_DEBUG_EVENT
Remarks
If the WaitForDebugEvent function succeeds, it fills in the members of a DEBUG_EVENT structure.
�ݥ���Ȥϡ�WaitForDebugEvent �ؿ�����������Ȱ������Ϥ��줿 DEBUG_EVENT ��¤�Τγƥ��Ф����åȤ���뤳�ȡ��㳰��ȯ���������� dwDebugEventCode �� EXCEPTION_DEBUG_EVENT �� ���åȤ���뤳�ȡ�EXCEPTION_DEBUG_EVENT �λ��� u.Exception ���Ф� EXCEPTION_DEBUG_INFO ��¤�Τ򻲾Ȥ��衢�Ȥ������ȤΤ褦�Ǥ���
��������Τλ��Ȥߤ��狼��ޤ��������Ȥ���������Ĵ�٤ʤ��饳���ɤ�񤯤��Ȥˤ��ޤ���
�� ���������� (trapfault.c)
�Ӻ��ʤ��餶�ä��ꥳ���ɤ�񤤤Ƥߤޤ�����trapfault.exe �Ϥ���������ΤǤ���
���� 1���ҥץ�������̤�������㳰��ȯ�������ݤ˸ƤӸ����֤���λ������
���� 2���ҥץ������Ȥ��Ƶ�ư����¹ԥե�����̾ # �ե�͡���ǻ���
���� 3�����ҥץ������ε�ư�����Ϥ��ѥ�᡼�� # ��ά��
��λ�����ɡ��ҥץ����������ェλ����Ф��ν�λ�����ɤ��֤�
�۾ェλ������������ǻ��ꤵ�줿�����ɤ��֤�
���� 2���ҥץ������Ȥ��Ƶ�ư����¹ԥե�����̾ # �ե�͡���ǻ���
���� 3�����ҥץ������ε�ư�����Ϥ��ѥ�᡼�� # ��ά��
��λ�����ɡ��ҥץ����������ェλ����Ф��ν�λ�����ɤ��֤�
�۾ェλ������������ǻ��ꤵ�줿�����ɤ��֤�
#include <windows.h> #include <stdio.h> DWORD doit(int ac, char *av[]) { BOOL bSts; STARTUPINFO si; PROCESS_INFORMATION pi; DWORD dwExitCode; DEBUG_EVENT debug; DWORD dwContinueStatus; DWORD dwDebugEventCode, dwDebugEventCodePrev = 0; DWORD dwExceptionCode, dwExceptionCodePrev = 0; DWORD dwExceptionFlags, dwExceptionFlagsPrev = 0; ULONG_PTR dwExceptionInformation0, dwExceptionInformation0Prev = 0; ULONG_PTR dwExceptionInformation1, dwExceptionInformation1Prev = 0; char *pszExe = av[2]; char szParam[1024] = "\0"; if (ac > 3) { // �ҥץ��������Ϥ����� int i; for (i = 3; i < ac; i++) { strcat(szParam, " "); strcat(szParam, av[i]); } } memset(&pi, 0, sizeof(pi)); memset(&si, 0, sizeof(si)); si.cb = sizeof(si); // ���ꤵ�줿�ץ������Υץ�������ư bSts = CreateProcess(pszExe, szParam, NULL, NULL, FALSE, DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS | CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); if (!bSts) { // CreateProcess ���� } // �ǥХå����٥�ȥ롼�� while (WaitForDebugEvent(&debug, INFINITE)) { dwDebugEventCode = debug.dwDebugEventCode; dwContinueStatus = DBG_CONTINUE; // �㳰ȯ�� if (dwDebugEventCode == EXCEPTION_DEBUG_EVENT) { dwExceptionCode = debug.u.Exception.ExceptionRecord.ExceptionCode; dwExceptionFlags = debug.u.Exception.ExceptionRecord.ExceptionFlags; dwExceptionInformation0 = debug.u.Exception.ExceptionRecord.ExceptionInformation[0]; dwExceptionInformation1 = debug.u.Exception.ExceptionRecord.ExceptionInformation[1]; // ���󥰥륹�ƥå��㳰, �֥졼���ݥ�����㳰��̵�� if (dwExceptionCode != EXCEPTION_SINGLE_STEP && dwExceptionCode != EXCEPTION_BREAKPOINT) { // ľ����Ʊ����㳰�ʤ�æ�� if (dwDebugEventCodePrev == EXCEPTION_DEBUG_EVENT && dwExceptionCodePrev == dwExceptionCode && dwExceptionFlagsPrev == dwExceptionFlags && dwExceptionInformation0Prev == dwExceptionInformation0 && dwExceptionInformation1Prev == dwExceptionInformation1) { dwExitCode = (DWORD)atol(av[1]); break; } dwDebugEventCodePrev = EXCEPTION_DEBUG_EVENT; dwExceptionCodePrev = dwExceptionCode; dwExceptionFlagsPrev = dwExceptionFlags; dwExceptionInformation0Prev = dwExceptionInformation0; dwExceptionInformation1Prev = dwExceptionInformation1; // �ץ������¦���㳰�����ˤޤ����Ƥߤ� dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED; } } // �ץ�������λ else if (dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) { if (debug.dwProcessId == pi.dwProcessId) { // �ǥХå��ν�λ�����ɤ򥻥å� GetExitCodeProcess(pi.hProcess, &dwExitCode); break; } } // ���٥�ȥ롼�׷�³ if (!ContinueDebugEvent(debug.dwProcessId, debug.dwThreadId, dwContinueStatus)) { break; } } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return dwExitCode; } int WINAPI WinMain(HINSTANCE p_hInstance, HINSTANCE p_hPreInst, LPSTR p_pchCmdLine, int p_iCmdShow ) { char buf[16]; int ret; if (__argc < 3 || GetFileAttributes(__argv[2]) == 0xFFFFFFFF) { MessageBox(NULL, "usage: trapfault <exitcode> <debugee> [<debugee parameter>]...", __argv[0], MB_OK); return 0; } ret = (int)doit(__argc, __argv); //sprintf(buf, "ret=%d\n", ret); //MessageBox(NULL, buf, __argv[0], MB_OK); return ret; }�ǥХå��Ȥ��Ƽ������ʤ�����񤷤����Ȥ�ҤȤޤ��������٤�û�������ɤǼ¸��Ǥ��ޤ����� �����ñ��ʤ�ΤǤ�������������ˡ�Ϥ����������ѤǤ������Ǥ���
�� �����������
�åµï¿½Î¥×¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¼Â¹Ô·ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É¤Ç¤ï¿½ï¿½Þ¤ï¿½ï¿½Ê¥Õ¥ê¡¼ï¿½ï¿½ï¿½Õ¥È¡Ë¡ï¿½ï¿½ÜºÙ¤Ï¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö¤Ë´Þ¤Þ¤ï¿½ï¿½ README �ò»²¾È¤ï¿½ï¿½Æ²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½trapfaultMbox 999 test1.exe�פμ¹Է��
����trapfaultMbox 999 test1.exe abc�פμ¹Է��
�� ���ͽ���
��API�dzؤ�WindowsŰ������������BP�Ҵ����¼� ���� ��
��Windows�ץ�����ޤΤ���ΥǥХå��ƥ��˥å�Ű�����
������BP���եȥץ쥹����John Robbins ����Ë�� �� ��
(tanabe)
�ȥ�å��Хå�URL
���ε����ؤΥ�����
1. Posted by ��󥿥륵���С���Ӵ����ͤΥ��� 2009ǯ11��11�� 12:45
�ɤ��⡢�Ϥ�ޤ��ơ�
�����Ǥ���
�����ɤޤ���ĺ���ޤ�����
�����������ɤΤʤ��ץ�������ư�����뤳�Ȥ���ǽ�ʤ�Ǥ�������
��������
�ǥХå��������Τϡ�
�ץ�����ޡ��ǤϾ��ʤ���Ǥ�����
����ٹ��ʤ�Ǥ��礦����
�����Ǥ���
�����ɤޤ���ĺ���ޤ�����
�����������ɤΤʤ��ץ�������ư�����뤳�Ȥ���ǽ�ʤ�Ǥ�������
��������
�ǥХå��������Τϡ�
�ץ�����ޡ��ǤϾ��ʤ���Ǥ�����
����ٹ��ʤ�Ǥ��礦����
2. Posted by tanabe 2009ǯ11��11�� 16:27
�������󡢥����Ȥ򤢤꤬�Ȥ��������ޤ����⤷���ε��������Ƥ˴ؿ��򤪻����ʤ黲�ͽ��Ҥ���ɤ���뤳�Ȥ򤪤����ᤷ�ޤ���