大多数时候,当恶意软件将自己注入到另一个进程中时,它会调用“SetThreadContext”来设置CONTEXT结构。通过CONTEXT结构中的“eax”成员,您可以轻松获取目标进程的“oep”。 “oep”代表目标进程恢复时的原始地址,你可以在“oep”处做一个循环,这样目标进程就会一直在循环中运行。但是如何在“oep”中做一个循环呢?
恶意软件通常调用“WriteProcessMemory”将代码写入目标进程。“WriteProcessMemory”的第二个参数是“lpBaseAddress”,表示这段代码在目标进程中的开始位置。第三个参数是“lpBuffer”,它代表缓冲区包含此代码。
你可以很容易地计算出“oep”和“lpBaseAddress”之间的偏移量,然后,如果偏移量>0并且偏移量<参数“nSize”,将偏移量添加到“lpBuffer”,你会得到地址包含“oep”缓冲区中的代码。
例如,目标进程的“oep”为0x401000,参数“lpBaseAddress”为0x400000,参数“lpBuffer”为0x120000,因此缓冲区中包含“oep”代码的地址为0x401000-0x400000+0x1000x1002
然后,您可以将包含“oep”的地址中的指令更改为“jmp本身”(即修补前2个字节到EB FE)。在上面的示例中,它是“jmp 0x121000”。调用“WriteProcessMemory”和“SetThreadContext”后”,你会看到代码在目标进程的“oep”处循环运行,因为指令更改为“jmp oep”,在上面的例子中它是“jmp 0x401000”。目标进程“停止”。
现在您可以使用 OllyDbg 附加它并开始您的工作!
在某些情况下,恶意软件会通过共享节、原子弹等其他方式将自身注入目标进程。现在在这些情况下您可能找不到“WriteProcessMemory”,但您会发现恶意软件使用其他方式注入代码。因此您可以更改通过将前 2 个字节修补到 EB FE 将代码注入目标进程,目标进程将在与第一种情况相同的循环中运行。