通过内存转储进程或dll来识别内存代码注入

时间:2014-06-26 23:06:13

标签: c++ code-injection memory-dump

为了识别内存代码注入(在Windows系统上),我想对系统上所有进程的内存进行哈希处理,例如,如果calc.exe的内存总是x,现在是y,我知道有人注入了calc.exe代码。

1:这个想法是否正确?过程记忆的哪一部分始终保持不变,哪部分正在改变?

2:剂量dll有一个单独的内存,还是在exe的内存中?换句话说,我可以为dll的内存生成哈希吗?

3:如何在c ++中转储进程或dll的内存?

3 个答案:

答案 0 :(得分:3)

运行Windows时,代码会不断注入进程。

一个例子是延迟加载的DLL。进程启动时,仅加载核心DLLS。当某些功能被运用时,代码首先从磁盘加载新的DLL(代码),然后执行它。

另一个例子是.NET托管应用程序。大多数代码都是磁盘上未编译的代码。当需要运行应用程序的新部分时,.NET运行时会加载未编译的代码,编译它(也就是JIT),然后执行它。

你想要解决的问题值得,但非常困难。操作系统本身会尝试解决此问题以保护您的进程。

如果您正在尝试做一些比Windows在幕后为您做的更先进的事情,首先要做的是了解Windows为保护进程和验证注入其中的代码所采取的所有步骤,同时仍然允许进程动态加载代码(这是必要的)。

祝你好运。

或许你有一个更具体的问题要解决?

答案 1 :(得分:1)

1)这个想法很好。但只要流程运行,它们就会改变记忆(或者它们什么都不做),所以它不会起作用。你可以做的是散列内存的代码部分。

2)不,DLL是链接到您的代码的库,而不是单独的进程。它们只是动态加载而不是静态加载(http://msdn.microsoft.com/en-us/library/windows/desktop/ms681914%28v=vs.85%29.aspx

3)通常,您的操作系统禁止您访问邻居进程的内存。如果它允许它用于您的进程,那么恶意软件很容易传播,并且您的系统将非常不稳定,因为一个崩溃进程可能会崩溃所有其他进程。因此,进行这种转储非常棘手!但是,如果您的流程具有正确的权限,您可以查看ReadProcessMemory()

答案 2 :(得分:0)

我刚刚做了类似的事情我基本上就是这些脚本:

http://www.exploit-monday.com/2012/03/powershell-live-memory-analysis-tools.html