Source code for vtrace.tools.win32stealth
import vtrace
import vstruct
[docs]class StealthBreak(vtrace.Breakpoint):
"""
A breakpoint to fake out CheckRemoteDebuggerPresent.
"""
[docs] def notify(self, event, trace):
sp = trace.getStackCounter()
eip, handle, outbool = trace.readMemoryFormat(sp, "<LLL")
trace.setRegisterByName("eax", 1)
trace.writeMemoryFormat(outbool, "<L", 0)
trace.setProgramCounter(eip)
trace.setStackCounter(sp+12)
trace.runAgain()
[docs]def writeBeingDebugged(trace, val):
peb = trace.parseExpression("peb")
ps = vstruct.getStructure("win32.PEB")
off = ps.vsGetOffset("BeingDebugged")
trace.writeMemoryFormat(peb+off, "<B", val)
[docs]def stealthify(trace):
writeBeingDebugged(trace, 0)
sym = trace.getSymByName("kernel32").getSymByName("CheckRemoteDebuggerPresent")
if sym != None:
addr = long(sym)
bp = StealthBreak(addr)
bpid = trace.addBreakpoint(bp)
trace.setMeta("Win32Stealth", bpid)
[docs]def unstealthify(trace):
writeBeingDebugged(trace, 1)
bp = trace.getMeta("Win32Stealth")
if bp != None:
trace.setMeta("Win32Stealth", None)
trace.removeBreakpoint(bp)