功能:实现对进程的指定API进行参数监控,如果该程序调用了被监控的API,将会在该程序的路径下创建一个文本将参数写入进去。
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
DWORD GetPID;
GetWindowThreadProcessId(hwnd, &GetPID); //通过获取到的HWND 来获取进程ID,来判断是否是我们监控的程序
if (GetPID == pID)
{
MainHwnd = hwnd;
return false;
}
return TRUE;
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
EnumWindows(EnumWindowsProc, NULL);
return 0;
}
LRESULT __stdcall WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) // WndProc wrapper
{
switch (uMsg)
{
case WM_USER + 0x1:
MessageBox(0, TEXT("NoName..."), TEXT("Hook"), 0);
break;
case WM_USER + 0x2: //自定义消息 实现对MessageBox的监控
Mesage();
break;
case WM_USER +0x3: //自定义消息 实现对OpenProcess的监控
OpenPro();
break;
}
return CallWindowProcW((WNDPROC)oriWndProc, hWnd, uMsg, wParam, lParam);
}
void Start()
{
pID = GetCurrentProcessId();
HANDLE hThread = CreateThread(NULL, NULL, ThreadProc, NULL, NULL, NULL);
WaitForSingleObject(hThread, INFINITE); //等待创建的线程结束后再往下执行! 特别注意。
CloseHandle(hThread);
oriWndProc = SetWindowLong(MainHwnd, GWL_WNDPROC, (LONG)WndProc); //执行完上面的操作后,找到了对应的HWND,然后重新写一个窗口过程函数
}
DWORD retAddrMsg = 0; //执行完我们自己的函数后,需要反回的地址 JMP... 5字节
void MyFunMSG(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
char szBuffer[0x100];
wsprintfA(szBuffer, "有调用MessageBox 参数: %x %s %s %x\n", hWnd, lpText, lpCaption, uType);
char setFilePath[MAX_PATH] = { 0 };
GetCurrentDirectoryA(MAX_PATH, setFilePath);
char szFilePath[MAX_PATH] = "\\Monitor.txt";
strcat(setFilePath, szFilePath);
FILE* pFile = fopen(setFilePath, "a"); //将参数写到文本
fputs(szBuffer, pFile);
fclose(pFile);
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!