Windows - 如何在应用程序启动前将代码注入到应用程序的内核中?
Windows - How can I inject code in the kernel of a application before it starts?
我想制作一个恶意软件分析软件,我必须将代码注入到进程的不同 kernel32 函数中,例如 Sleep 以覆盖恶意软件试图进行的任何睡眠,ExitProcess 以在进程被杀死之前转储内存等
我尝试启动进程暂停然后我尝试枚举库希望我能得到 kernel32 rva 但看起来当我启动进程时库甚至没有加载暂停。
使用 EasyHook 可以轻松完成您想要实现的目标 API。 API 在
可用
https://github.com/EasyHook/EasyHook
下面是覆盖 Kernel32.dll 中的 CreateFile 的示例。你需要CreateAndInject
方法
EasyHook.RemoteHooking.CreateAndInject(
targetExe, // executable to run
"", // command line arguments for target
0, // additional process creation flags to pass to CreateProcess
EasyHook.InjectionOptions.DoNotRequireStrongName, // allow injectionLibrary to be unsigned
injectionLibrary, // 32-bit library to inject (if target is 32-bit)
injectionLibrary, // 64-bit library to inject (if target is 64-bit)
out targetPID, // retrieve the newly created process ID
channelName // the parameters to pass into injected library
// ...
);
关键是将进程的主线程 ID 发送到您的 Hooking DLL,然后该 DLL 应该修补并唤醒主线程。这是在 EasyHook 中完成的,如下所示
if((hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, ThreadID)) == NULL)
THROW(STATUS_INTERNAL_ERROR, L"Unable to open wake up thread.");
if(!ResumeThread(hThread))
THROW(STATUS_INTERNAL_ERROR, L"Unable to resume process main thread.");
其余的挂钩过程与任何 windows 进程相同,通过打开进程并写入其内存以发送有效负载
PS:如果您需要有关示例记事本应用程序文件监控的详细示例,请查看
上提供了更多教程源代码
我想制作一个恶意软件分析软件,我必须将代码注入到进程的不同 kernel32 函数中,例如 Sleep 以覆盖恶意软件试图进行的任何睡眠,ExitProcess 以在进程被杀死之前转储内存等
我尝试启动进程暂停然后我尝试枚举库希望我能得到 kernel32 rva 但看起来当我启动进程时库甚至没有加载暂停。
使用 EasyHook 可以轻松完成您想要实现的目标 API。 API 在
可用https://github.com/EasyHook/EasyHook
下面是覆盖 Kernel32.dll 中的 CreateFile 的示例。你需要CreateAndInject
方法
EasyHook.RemoteHooking.CreateAndInject(
targetExe, // executable to run
"", // command line arguments for target
0, // additional process creation flags to pass to CreateProcess
EasyHook.InjectionOptions.DoNotRequireStrongName, // allow injectionLibrary to be unsigned
injectionLibrary, // 32-bit library to inject (if target is 32-bit)
injectionLibrary, // 64-bit library to inject (if target is 64-bit)
out targetPID, // retrieve the newly created process ID
channelName // the parameters to pass into injected library
// ...
);
关键是将进程的主线程 ID 发送到您的 Hooking DLL,然后该 DLL 应该修补并唤醒主线程。这是在 EasyHook 中完成的,如下所示
if((hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, ThreadID)) == NULL)
THROW(STATUS_INTERNAL_ERROR, L"Unable to open wake up thread.");
if(!ResumeThread(hThread))
THROW(STATUS_INTERNAL_ERROR, L"Unable to resume process main thread.");
其余的挂钩过程与任何 windows 进程相同,通过打开进程并写入其内存以发送有效负载
PS:如果您需要有关示例记事本应用程序文件监控的详细示例,请查看
上提供了更多教程源代码