为了识别内存代码注入(在windows系统上),我想对系统上所有进程的内存进行哈希处理,例如,如果calc.exe的内存总是x,现在是y,我知道有人注入到 calc.exe 代码中。
1:这个想法正确吗?进程内存的哪一部分始终保持不变,哪一部分在变化?
2:dose dll有单独的内存,还是在exe的内存中?换句话说,我可以为 dll 的内存生成哈希吗?
3:如何在 c++ 中转储进程或 dll 的内存?
为了识别内存代码注入(在windows系统上),我想对系统上所有进程的内存进行哈希处理,例如,如果calc.exe的内存总是x,现在是y,我知道有人注入到 calc.exe 代码中。
1:这个想法正确吗?进程内存的哪一部分始终保持不变,哪一部分在变化?
2:dose dll有单独的内存,还是在exe的内存中?换句话说,我可以为 dll 的内存生成哈希吗?
3:如何在 c++ 中转储进程或 dll 的内存?
运行 Windows 时,代码会不断地注入进程中。
一个示例是延迟加载的 DLL。当一个进程启动时,只加载核心 DLLS。当某些功能得到执行时,代码首先从磁盘加载新的 DLL(代码),然后执行它。
另一个示例是 .NET 托管应用程序。大多数代码作为未编译的代码存在于磁盘上。当需要运行应用程序的新部分时,.NET 运行时会加载未编译的代码,对其进行编译(也称为 JIT),然后执行它。
你试图解决的问题是值得的,但非常困难。操作系统本身试图解决这个问题以保护您的进程。
如果您尝试做的事情比 windows 在幕后为您所做的更高级,首先要做的是了解 windows 为保护进程和验证注入其中的代码而采取的所有步骤,同时仍然启用进程动态加载代码(这是必要的)。
祝你好运。
或者,也许您有一个更具体的问题要解决?
1)这个想法很好。但是只要进程运行,他们就会改变他们的记忆(或者他们什么都不做),所以它不会工作。您可以做的是对内存的代码部分进行哈希处理。
2) 不,DLL 是链接到您的代码的库,而不是单独的进程。它们只是动态加载而不是静态加载(http://msdn.microsoft.com/en-us/library/windows/desktop/ms681914%28v=vs.85%29.aspx)
3)通常您的操作系统会禁止您访问相邻进程的内存。如果它允许您的进程使用它,那么恶意软件很容易传播,并且您的系统将非常不稳定,因为一个崩溃的进程可能会导致所有其他进程崩溃。所以做这种转储会非常非常棘手!但是,如果您的进程具有正确的权限,您可以查看ReadProcessMemory()
我刚刚做了类似的事情,我基本上是 c# 的这些脚本:
http://www.exploit-monday.com/2012/03/powershell-live-memory-analysis-tools.html