为了识别内存代码注入(在Windows系统上),我想对系统上所有进程的内存进行哈希处理,例如,如果calc.exe的内存总是x,现在是y,我知道有人注入了calc.exe代码。
1:这个想法是否正确?过程记忆的哪一部分始终保持不变,哪部分正在改变?
2:剂量dll有一个单独的内存,还是在exe的内存中?换句话说,我可以为dll的内存生成哈希吗?
3:如何在c ++中转储进程或dll的内存?
答案 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