远程注入 DLL 成功后,有些程序没有运行 DLL

2019-11-16 09:12:44 +08:00
 hkitdog
参考了 Window 核心编程里的远程注入 DLL。远程注入 DLL 成功后,某些程序没有运行 DLL,有些程序正常执行了 DLL,这是什么原因?
DLL 里只是简单的调用了下 messagebox
代码如下:
BOOL WINAPI InjectLibW(DWORD dwProcessId, PCWSTR pszLibFile)
{
//如果函数执行失败
BOOL bOk = FALSE;
HANDLE hProcess = NULL, hThread = NULL;
PWSTR pszLibFileRemote = NULL;

__try
{
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION |
PROCESS_CREATE_THREAD | //用于创建远程线程
PROCESS_VM_OPERATION | //用于 virtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE, //用于写入进程内存
FALSE, dwProcessId);
if (hProcess == NULL)
__leave;

//计算 DLL 路径名所需的字节数
int cch = 1 + lstrlenW(pszLibFile);
int cb = cch * sizeof(wchar_t);

//在远程进程中为路径名分配空间
pszLibFileRemote = (PWSTR)
VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
if (pszLibFileRemote == NULL)
__leave;

//复制 DLL 路径到远程进程地址空间
if (!WriteProcessMemory(hProcess, pszLibFileRemote, (PVOID)pszLibFile, cb, NULL))
__leave;

//获取在 Kernel32 中 loadlibraryW 的真实地址
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryW");

if (pfnThreadRtn == NULL)
__leave;

//创建远程线程并调用 LoadLibraryW(DLLPathname)
hThread = CreateRemoteThread(hProcess, NULL, 0,
pfnThreadRtn, pszLibFileRemote, 0, NULL);
if (hThread == NULL)
__leave;

WaitForSingleObject(hThread, INFINITE);
bOk = TRUE;
}
__finally
{
if (pszLibFileRemote != NULL)
VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
if (hThread != NULL)
CloseHandle(hThread);
if (hProcess != NULL)
CloseHandle(hProcess);
}

return bOk;
}
1306 次点击
所在节点    问与答
3 条回复
hehe12dyo
2019-11-16 09:39:16 +08:00
中华人民共和国刑法
after1990s
2019-11-16 09:40:37 +08:00
这种问题应该打 log,检查调用出错 API 的错误码。再根据错误码分析。
hkitdog
2019-11-16 10:30:02 +08:00
@hehe12dyo 老哥,我良好市民

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/620102

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX