bool bInject(uint pToBeInjected, string sDllPath)
{
IntPtr hndProc = OpenProcess((0x2 | 0x8 | 0x10 | 0x20 | 0x400), 1, pToBeInjected);
if (hndProc == INTPTR_ZERO)
{
return false;
}
IntPtr lpLLAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if (lpLLAddress == INTPTR_ZERO)
{
return false;
}
IntPtr lpAddress = VirtualAllocEx(hndProc, (IntPtr)null, (IntPtr)sDllPath.Length, (0x1000 | 0x2000), 0X40);
byte[] bytes = Encoding.ASCII.GetBytes(sDllPath);
WriteProcessMemory(hndProc, lpAddress, bytes, (uint)bytes.Length, 0);
// This next one is the one that doesn't seem to work.
CreateRemoteThread(hndProc, (IntPtr)null, INTPTR_ZERO, lpLLAddress, lpAddress, 0, (IntPtr)null);
CloseHandle(hndProc);
return true;
}
我在为 x86 编译的 .NET 4.6.1 中使用 C#(显然)。在上面的代码中,我评论了似乎不起作用的命令。CreateRemoteThread 调用。没有返回错误,受害者进程(记事本)没有显示以下 DLL(我从示例项目中提取,因为我很懒惰。)被注入的任何迹象。
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
extern "C" __declspec(dllexport)
DWORD WINAPI MessageBoxThread(LPVOID lpParam) {
MessageBox(NULL, "Hello world!", "Hello World!", NULL);
return 0;
}
extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
CreateThread(NULL, NULL, MessageBoxThread, NULL, NULL, NULL);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
记住我使用的是 Windows 10。我想也许有额外的安全检查来防止我注入所说的 DLL。在此之后,我计划制作一个引导程序 DLL 来加载 CLR,以及另一个 C# DLL。
非常感谢您提供的任何帮助!
您应该使用预处理器定义作为 API 调用的标志,这样更清楚。
我相信VirtualAllocEx
你试图通过PAGE_READWRITE
一个标志,但是你通过了0x40
,它被定义为#define PAGE_READWRITE 0x04
. 所以要么PAGE_READWRITE
直接使用,要么如果你想“酷”使用0x04
.
此外,我从未使用过 string 类,但您应该使用它sDllPath.Length + 1
,因为它也可能不会将空终止符添加到您的路径中!
更准确地说(在以后的问题中),您可以将错误代码添加到问题中!您可以使用:
CHAR Error[MAX_PATH]; // MAX_PATH is used for system paths, it's still big enough
wsprintfA(Error, "Error: %lu", GetLastError());
MessageBoxA(0, Error, 0, 0);
在您CreateRemoteThread
获取系统错误代码之后- 它可以帮助您随时了解应用程序中的错误!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句