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