我试图将 DLL 注入记事本并使其显示 MessageBox,但什么也没有发生。我对此很陌生,但我确信它应该有效。
我目前正在将此代码用于 DLL 文件 (Dllinj.dll):
#include <Windows.h>
/*
__declspec(dllexport) int message() {
}
*/
BOOL APIENTRY DllMain(HMODULE hModule, DWORD nReason, LPVOID lpReserved) {
MessageBox(NULL,"Injected!",MB_OK);
return TRUE;
}
并用这一行进行编译:
gcc dllinj.cpp -o dllinj.dll -shared
我已经尝试过nefarius注射器。它返回错误远程进程中对 LoadLibraryW 的调用失败。,但我检查了进程架构,我知道它已经是 64 位,并且我正在编译为 64 位。
我读过这篇关于同样问题的文章,但由于解决方案只是改变IDE,我无法自己修复它,因为我没有使用任何IDE。是的,我看到答案说 MessageBox 在 DllMain 函数中不起作用,所以这就是它不显示的原因,但在我的例子中,dll 甚至没有首先注入。
还尝试了我在此页面上找到的注入器代码。它实际上返回了一个错误,但我不确定我在这里做错了什么。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <tlhelp32.h>
char evilDLL[] = "C:\\Users\\ACER\\Desktop\\tcc\\Dllinj.dll";
unsigned int evilLen = sizeof(evilDLL) + 1;
void HandleError(const char* message) {
perror(message);
exit(EXIT_FAILURE);
}
int main(int argc, char* argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
return EXIT_FAILURE;
}
HANDLE ph = OpenProcess(PROCESS_ALL_ACCESS, FALSE, atoi(argv[1]));
if (ph == NULL) {
HandleError("Error opening process");
}
LPVOID rb = VirtualAllocEx(ph, NULL, evilLen, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (rb == NULL) {
CloseHandle(ph);
HandleError("Error allocating memory in the remote process");
}
if (!WriteProcessMemory(ph, rb, evilDLL, evilLen, NULL)) {
CloseHandle(ph);
VirtualFreeEx(ph, rb, 0, MEM_RELEASE);
HandleError("Error writing to remote process memory");
}
HMODULE hKernel32 = GetModuleHandle("Kernel32");
if (hKernel32 == NULL) {
CloseHandle(ph);
VirtualFreeEx(ph, rb, 0, MEM_RELEASE);
HandleError("Error getting handle to Kernel32");
}
FARPROC lb = GetProcAddress(hKernel32, "LoadLibraryA");
if (lb == NULL) {
CloseHandle(ph);
VirtualFreeEx(ph, rb, 0, MEM_RELEASE);
HandleError("Error getting address of LoadLibraryA");
}
HANDLE rt = CreateRemoteThread(ph, NULL, 0, (LPTHREAD_START_ROUTINE)lb, rb, 0, NULL);
if (rt == NULL) {
CloseHandle(ph);
VirtualFreeEx(ph, rb, 0, MEM_RELEASE);
HandleError("Error creating remote thread");
}
// Wait for the remote thread to finish
WaitForSingleObject(rt, INFINITE);
CloseHandle(rt);
CloseHandle(ph);
VirtualFreeEx(ph, rb, 0, MEM_RELEASE);
return 0;
}
用这一行编译:
g++ -O2 injector.cpp -o injector.exe -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive
用这行代码运行:
injector.exe 10008
我得到以下输出:
Error creating remote thread: No error
是的,我确定进程 PID 是 10008,我在进程黑客和进程管理器中检查过。
我还尝试使用process hacker来查看我的dll是否被上面的代码注入到记事本中,但我也没有找到任何名为“Dllinj.dll”的dll。
所有这些让我相信问题出在 dll 编译过程或代码本身,尽管我不确定问题是什么。
我对这种对 Windows 内核的低级访问很陌生,所以请不要对我无礼。预先感谢。
HANDLE rt = CreateRemoteThread(..., NULL);
该参数 (lpThreadId) 不是可选的。将指针传递给您自己的堆栈上的
DWORD
。
DWORD junk;
HANDLE rt = CreateRemoteThread(..., &junk);