TargetInfo::TargetInfo(pid_t pid, const char *executable) { // Process m_pid = pid; m_executable = executable; // Configuration m_threaded_rts = IsThreadedRTS(executable); m_profiling_rts = IsProfilingRTS(executable); m_is_64_bit = IsProcess64Bit(pid); // Extract name of the executable module const char *module_name = &executable[std::strlen(executable) - 1]; while (module_name != executable) { if (* module_name == '/') { module_name++; break; } module_name--; } m_module = module_name; // We need a port for the task to be debugged if (task_for_pid(mach_task_self(), pid, &m_task_port) != KERN_SUCCESS) assert(!"Can't get port for task"); }
VOID ListProcesses(VOID) { DWORD cbNeeded, cProcesses; unsigned int i; HANDLE hProcess; HMODULE hMod; char szProcessName[MAX_PATH]; char b[MAX_PATH]; EnumProcesses(ProcessIDs, MAX_PROCESS * sizeof(DWORD), &cbNeeded); cProcesses = cbNeeded / sizeof(DWORD); for (i = 0; i < cProcesses; i++) { hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessIDs[i]); if (hProcess != NULL) { if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) { if (IsProcess64Bit(hProcess, hMod) == TRUE) { GetModuleBaseNameA(hProcess, hMod, szProcessName, MAX_PATH); sprintf_s(b, MAX_PATH - 1, "%.08X - %s", ProcessIDs[i], szProcessName); } else goto next; } else { sprintf_s(b, MAX_PATH - 1, "%.08X - <unknown>", ProcessIDs[i]); } ComboxAdd(b); next: CloseHandle(hProcess); } } }
// // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_CREATE: //appendText(txtbox, TEXT("test\r\n")); break; case WM_COPYDATA: return (OnCopyData((COPYDATASTRUCT *) lParam)); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case ID_FILE_STARTHOOK: StartMessageHook(); break; case ID_FILE_STOPHOOK: StopMessageHook(); break; case ID_TESTMSGS_WM: SendWmSettext(); break; case ID_TESTMSGS_WMCOM: SendWmCommand(); break; case ID_PROC64TEST: if (_tcscmp(targetProcessId, _T("")) != 0) //if target pid was used { TCHAR tmp[500]; TCHAR *stopStr; targetPid = (DWORD)_tcstol(targetProcessId, &stopStr, 10); BOOL current64bit = IsCurrentProcess64Bit(); if (IsProcess64Bit(targetPid) && current64bit) _stprintf_s(tmp, _T("Target pid (%ld) is a matching 64 bit process\r\n"), targetPid); else if(!IsProcess64Bit(targetPid) && !current64bit) _stprintf_s(tmp, _T("Target pid (%ld) is a matching 32 bit process\r\n"), targetPid); else if (IsProcess64Bit(targetPid)) _stprintf_s(tmp, _T("Target pid (%ld) is 64 bit process\r\n"), targetPid); else _stprintf_s(tmp, _T("Target pid (%ld) is 32 bit process\r\n"), targetPid); AppendText(txtbox, tmp); //ExtractResource(IDR_SETMH32, _T("SetMsgHook32.exe")); //_stprintf_s(tmp, _T(" %s %ld %d"), dll32bitName, (long)mainHwnd, targetPid); //RunResource(IDR_SETMH32, tmp); //MessageBox(0, , _T("64 bit Test"), 0); } break; case ID_FILE_SETTINGS: DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc); break; case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, DlgProc); break; case ID_FILE_CLEAR: SetWindowText(txtbox, _T("")); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_HOTKEY: HotKeyPressed(wParam); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... EndPaint(hWnd, &ps); break; case WM_SIZE: { //resize the txtbox when the parent window size changes int nWidth = LOWORD(lParam); int nHeight = HIWORD(lParam); SetWindowPos(txtbox, HWND_NOTOPMOST, txtboxSpacing, txtboxSpacing, nWidth-(txtboxSpacing*2), nHeight-(txtboxSpacing*2), SWP_NOZORDER|SWP_NOMOVE); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
void StartMessageHook() { AppendText(txtbox, _T("Starting Message Hook\r\n")); //targetHwnd = FindWindow(targetClassname, NULL); TCHAR tmp[500]; DWORD tid = 0; if (_tcscmp(targetHwndStr, _T("")) != 0) //if target HWND was used { TCHAR *stopStr; targetHwnd = (HWND)_tcstol(targetHwndStr, &stopStr, 10); tid = GetWindowThreadProcessId(targetHwnd, NULL); _stprintf_s(tmp, _T("Target Handle: %ld, and Thread Id: %ld\r\n"), targetHwnd, tid); } targetPid = 0; if (_tcscmp(targetProcessId, _T("")) != 0) //if target pid was used { TCHAR *stopStr; targetPid = (DWORD)_tcstol(targetProcessId, &stopStr, 10); tid = GetProcessMainThreadId(targetPid); _stprintf_s(tmp, _T("Target PId: %ld, and Thread Id: %ld\r\n"), targetPid, tid); } InitMsgFiltersAndLookup(); //InitializeMsgLookup(); AppendText(txtbox, tmp); //block self/global msg hook if (tid == 0) { AppendText(txtbox, _T("Target thread not found\r\n")); return; } if (targetPid != 0) // handle various types of bit matching { BOOL current64bit = IsCurrentProcess64Bit(); if (IsProcess64Bit(targetPid) && current64bit) { _stprintf_s(tmp, _T("Target PId (%ld) is a matching 64 bit process\r\n"), targetPid); SetCustomMsgHookDll(dll64bitName, dllProcName); } else if(!IsProcess64Bit(targetPid) && !current64bit) { _stprintf_s(tmp, _T("Target PId (%ld) is a matching 32 bit process\r\n"), targetPid); SetCustomMsgHookDll(dll32bitName, dllProcName); } else { if (current64bit) _stprintf_s(tmp, _T("Target PId (%ld) is a not matching 64 bit process.\r\n"), targetPid); else _stprintf_s(tmp, _T("Target PId (%ld) is a not matching 32 bit process.\r\n"), targetPid); AppendText(txtbox, tmp); TCHAR *dllname = dll32bitName; TCHAR *exename = _T("SetMsgHook32.exe"); int setMsgHookRes = IDR_SETMH32; if (IsProcess64Bit(targetPid)) { dllname = dll64bitName; exename = _T("SetMsgHook64.exe"); setMsgHookRes = IDR_SETMH64; } _tcscat_s(tmp, 500, _T("Do you wish to open a new matching Message Hook Window?")); int mbResult = MessageBox(mainHwnd, tmp, _T("Message Hook"), MB_ICONQUESTION | MB_YESNO); if (mbResult == IDNO) return ; _stprintf_s(tmp, _T("%s %s 0 %d"), exename, dllname, targetPid); RunResource(setMsgHookRes, tmp); //EnableMenuItem(mainMenu, ID_FILE_STOPHOOK, MF_ENABLED); //EnableMenuItem(mainMenu, ID_FILE_STARTHOOK, MF_DISABLED | MF_GRAYED); _tcscat_s(tmp, 500, _T("\r\n")); AppendText(txtbox, tmp); PostQuitMessage(2); return; } AppendText(txtbox, tmp); } if (SetMsgHook(mainHwnd, tid)) { EnableMenuItem(mainMenu, ID_FILE_STOPHOOK, MF_ENABLED); EnableMenuItem(mainMenu, ID_FILE_STARTHOOK, MF_DISABLED | MF_GRAYED); AppendText(txtbox, _T("Hook successfully initialized\r\n")); } else AppendText(txtbox, _T("Hook failed to initialize\r\n")); }
extern "C" __declspec(dllexport) BOOL IsCurrentProcess64Bit() { return IsProcess64Bit(_getpid()); }