如何在调用MessageBoxa

问题描述 投票:0回答:1

但是我想这里有问题吗?

#include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <unistd.h> DWORD GetPID(const char *processName); int main(void) { DWORD processId = GetPID("WpfApp1.exe"); if (!processId) { printf("Process not found\n"); fflush(stdout); return 1; } printf("Target process found. PID: %lu\n", processId); fflush(stdout); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId); if (!hProcess) { printf("Failed to open process. Error code: %lu\n", GetLastError()); fflush(stdout); return 1; } printf("Opened handle to process.\n"); fflush(stdout); // Explicitly load user32.dll HMODULE hUser32 = LoadLibrary("user32.dll"); if (!hUser32) { printf("Failed to load user32.dll. Error code: %lu\n", GetLastError()); fflush(stdout); CloseHandle(hProcess); return 1; } printf("Handle to user32.dll loaded successfully.\n"); fflush(stdout); LPVOID msgBoxAddress = (LPVOID)GetProcAddress(hUser32, "MessageBoxA"); if (!msgBoxAddress) { printf("Failed to find address of MessageBoxA. Error code: %lu\n", GetLastError()); fflush(stdout); FreeLibrary(hUser32); CloseHandle(hProcess); return 1; } printf("Address of MessageBoxA: %p\n", msgBoxAddress); fflush(stdout); LPVOID remoteString = VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); if (!remoteString) { printf("Failed to allocate memory in target process. Error code: %lu\n", GetLastError()); fflush(stdout); FreeLibrary(hUser32); CloseHandle(hProcess); return 1; } printf("Allocated memory at remote address: %p\n", remoteString); fflush(stdout); if (!WriteProcessMemory(hProcess, remoteString, "Hello World!", 13, NULL)) { printf("Failed to write to remote memory. Error code: %lu\n", GetLastError()); fflush(stdout); VirtualFreeEx(hProcess, remoteString, 0, MEM_RELEASE); FreeLibrary(hUser32); CloseHandle(hProcess); return 1; } printf("Successfully wrote message to remote memory.\n"); fflush(stdout); HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)msgBoxAddress, remoteString, 0, NULL); if (!hThread) { printf("Failed to create remote thread. Error code: %lu\n", GetLastError()); fflush(stdout); VirtualFreeEx(hProcess, remoteString, 0, MEM_RELEASE); FreeLibrary(hUser32); CloseHandle(hProcess); return 1; } printf("Remote thread created successfully.\n"); fflush(stdout); WaitForSingleObject(hThread, INFINITE); printf("Remote thread completed.\n"); fflush(stdout); VirtualFreeEx(hProcess, remoteString, 0, MEM_RELEASE); FreeLibrary(hUser32); CloseHandle(hThread); CloseHandle(hProcess); return 0; } DWORD GetPID(const char *processName) { PROCESSENTRY32 processEntry; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { printf("Failed to create snapshot. Error code: %lu\n", GetLastError()); fflush(stdout); return 0; } processEntry.dwSize = sizeof(processEntry); if (Process32First(hSnapshot, &processEntry)) { do { if (strcmp(processEntry.szExeFile, processName) == 0) { DWORD pid = processEntry.th32ProcessID; CloseHandle(hSnapshot); printf("Process ID for %s found: %lu\n", processName, pid); fflush(stdout); return pid; } } while (Process32Next(hSnapshot, &processEntry)); } printf("Failed to find process: %s\n", processName); fflush(stdout); CloseHandle(hSnapshot); return 0; }

与我在线阅读的各种文章相比,这似乎也很多代码。

在Win32 API文档中快速搜索后,看起来您正在使用

CreateRemoteThread

错误。
部分中定义的

参数

lpStartAddress
必须在远程过程中存在,并且

lpParameter

是传递到螺纹函数的参数:
c windows winapi code-injection dll-injection
1个回答
0
投票

[in] lpStartAddress


指向类型的应用程序定义函数的指针
lpthread_start_routine将由线程执行并表示
远程过程中线程的启动地址。功能
必须存在于远程过程中。有关更多信息,请参阅
threadproc.

[in] lpParameter

指向要传递到线程函数的变量的指针。
文档是一个很好的例证:

应用程序定义的功能,用作起始地址 对于线程。调用createThread时指定此地址, createmotethread或createMoteThreadex函数。

lpthread_start_routine类型定义了指向此回调的指针
功能。 ThreadProc是应用程序定义的占位符
功能名称

这是您可以用

ThreadProc

指向的函数类型。这样,

CreateRemoteThread

和您的自定义功能就可以使用该机制的功能原型一致。
其他滥用机制的暗示是

CreateRemoteThread

本身的原型。此函数似乎只有一个非选项参数,这是一个无符号整数(
MessageBoxA

):

[in] UINT uType
另一方面,int MessageBoxA( [in, optional] HWND hWnd, [in, optional] LPCSTR lpText, [in, optional] LPCSTR lpCaption, [in] UINT uType );

CreateRemoteThread

定义为指向任何类型(

lpParameter

)的指针:

[in] LPVOID lpParameter

在这个方向上的最后一个指示是
HANDLE CreateRemoteThread( [in] HANDLE hProcess, [in] LPSECURITY_ATTRIBUTES lpThreadAttributes, [in] SIZE_T dwStackSize, [in] LPTHREAD_START_ROUTINE lpStartAddress, [in] LPVOID lpParameter, [in] DWORD dwCreationFlags, [out] LPDWORD lpThreadId );
文档的以下部分(
返回值

):

注意,即使点也可能成功
到数据,代码或无法访问。
我理解是,即使
CreateRemoteThread
无效,也是创建线程的,然后,当线程执行时,它会引发异常。创建是成功的,但由于例外而没有发生任何事情。如回报值的部分所建议的那样,呼叫

CreateRemoteThread

是一个好主意,可以获取有关正在发生的事情并获取扩展错误信息的更多详细信息。

我的建议是首先检查呼叫
lpStartAddress
的错误,然后尝试以
lpStartAddress
格式定义一个函数,该函数将void*参数解释为lpcstr,并且此函数将使用所有函数调用。除非字符串(标题 - >
GetLastError

或消息框的内容 - >
GetLastError
)的参数硬编码,该参数将是新转换的LPCSTR。如果要给您的自定义功能更多参数,建议您使用与LPCSTR建议的相同方法,但是这次使用自定义对象。

希望这有帮助

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.