首页
论坛
专栏
课程

[原创]函数参数监控。

2019-5-16 22:14 2430

[原创]函数参数监控。

2019-5-16 22:14
2430
功能:实现对进程的指定API进行参数监控,如果该程序调用了被监控的API,将会在该程序的路径下创建一个文本将参数写入进去。

程序思路。

效果。


首先将DLL注入进去,远程线程注入CreateRemoteThread ,具体细节可参考: https://bbs.pediy.com/thread-248873.htm
DLL加载的时候,创建一个线程,来获取DLL所在的窗口程序的HWND。
我们要发送消息给被监控的程序,但是被监控的程序没有这个消息的处理,我们自己通过注入的DLL来处理。

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,然后重新写一个窗口过程函数

}

好的,之后看对应的HOOK操作,实现得非常简单,inline HOOK
这里的HOOK,是收到其它程序的发送过来的消息后进行操作的。

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);

}


void _declspec(naked) MyMsg()

{

__asm

{

pushad                                                                   //保存现场

pushfd


push dword ptr ss:[esp+0x28]                          //对应的参数

push dword ptr ss : [esp + 0x30]

push dword ptr ss : [esp + 0x38]

push dword ptr ss : [esp + 0x40]

call MyFunMSG                                              //调用我们自己的函数,方便写功能

add esp,0x10                                                 //栈平衡


popfd

popad


mov edi, edi                                               //被覆盖的字节,这里我们执行一次,然后我们可以直接返回

push ebp

mov ebp, esp

jmp retAddrMsg                                          //执行完后我们的函数后,需要反返回的地址


}


}


void Mesage()

{

char shellcode[Len] = { 0xe9 };


DWORD MsgAddr = (DWORD)GetProcAddress(LoadLibrary(TEXT("user32.dll")), "MessageBoxA");

retAddrMsg = MsgAddr + Len;

DWORD dwOldProtect = 0;


if (VirtualProtect((LPVOID)MsgAddr, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect))   //修改内存属性

{

*(DWORD*)(shellcode + 1) = (DWORD)MyMsg - (DWORD)MsgAddr - 5;              //修改地址

memcpy((LPVOID)MsgAddr, shellcode, 5);

}

}

这里写一个MSG例子就行了,OpenProcess对应的操作也一样。  由于本人技术有限,只能在R3玩一下,这技术也微不足道,如果对你有帮助,我很荣幸。
只解释了比较难的地方,具体细节,还得麻烦你看源码,如果你对我的程序感兴趣,可以加一些功能,改一改BUG哦。
大部分功能都是在DLL里边写的。



[招聘]欢迎市场人员加入看雪学院团队!

上传的附件:
最新回复 (3)
rongge 2019-5-17 08:47
2
0
有x64 版吗?
minorory 2019-5-17 10:29
3
0
这个我也写过的,监控IsDebuggerPresent、ExitProcess、RegCreateKeyExA,简单实现一下恶意行为检测
hzqst 3 2019-5-19 14:21
4
0
有个东西叫api monitor。。。
游客
登录 | 注册 方可回帖
返回