예제 #1
0
        public override void Execute(string text)
        {
            base.Execute(text);

            char[] sp   = { ' ', '\t' };
            var    argv = text.Split(sp, 3, StringSplitOptions.RemoveEmptyEntries);

            if (argv.Length != 3)
            {
                Context.CONSOLE.Write(CommandHelp);
                return;
            }

            var strArgDst  = argv[0];
            var strArgSize = argv[2];
            var strArgVal  = argv[1];

            var varArgDst  = Context.IDE.Debugger.GetExpression(strArgDst, false, 100);
            var varArgVal  = Context.IDE.Debugger.GetExpression(strArgVal, false, 100);
            var varArgSize = Context.IDE.Debugger.GetExpression(strArgSize, false, 100);
            var processId  = Context.IDE.Debugger.CurrentProcess.ProcessID;

            if (!varArgDst.IsValidValue)
            {
                Context.CONSOLE.Write("Argument <address>: " + strArgDst + " is invalid!");
                return;
            }

            if (!varArgVal.IsValidValue)
            {
                Context.CONSOLE.Write("Argument <val>: " + strArgVal + " is invalid!");
                return;
            }

            if (!varArgSize.IsValidValue)
            {
                Context.CONSOLE.Write("Argument <size>: " + strArgSize + " is invalid!");
                return;
            }

            long byteval     = 0;
            long dstAddress  = 0;
            long dataSize    = 0;
            var  numStyleSrc = NumberHelpers.IsHexNumber(varArgVal.Value)
                ? NumberStyles.HexNumber
                : NumberStyles.Integer;
            var numStyleDst = NumberHelpers.IsHexNumber(varArgDst.Value)
                ? NumberStyles.HexNumber
                : NumberStyles.Integer;
            var numStyleSize = NumberHelpers.IsHexNumber(varArgSize.Value)
                ? NumberStyles.HexNumber
                : NumberStyles.Integer;
            var bRet = true;

            bRet = bRet && NumberHelpers.TryParseLong(varArgDst.Value, numStyleDst, out dstAddress);
            bRet = bRet && NumberHelpers.TryParseLong(varArgVal.Value, numStyleSrc, out byteval);
            bRet = bRet && NumberHelpers.TryParseLong(varArgSize.Value, numStyleSize, out dataSize);

            if (!bRet)
            {
                Context.CONSOLE.Write("Failed to evaluate command arguments!");
                return;
            }

            var ntdbgStatus = NativeMethods.NtdbgOk;

            if (NativeMethods.NtdbgOk !=
                (ntdbgStatus = MemoryHelpers.ProcMemset(processId, dstAddress, (byte)byteval, dataSize)))
            {
                Context.CONSOLE.Write("Memory set dst:" + NumberHelpers.ToHex(dstAddress) + " " + (byte)byteval + " " +
                                      dataSize + " failed!");
                Context.CONSOLE.Write("Error code:" + ntdbgStatus + " - " + NativeMethods.GetStatusString(ntdbgStatus) +
                                      ".");
                return;
            }

            Context.CONSOLE.Write("Wrote: " + dataSize + " bytes to address: " + NumberHelpers.ToHex(dstAddress));
        }
예제 #2
0
        public override void Execute(string[] args)
        {
            base.Execute(args);

            if (args.Length != 3)
            {
                Context.CONSOLE.Write(CommandHelp);
                return;
            }

            var strArgDst  = args[0];
            var strArgVal  = args[1];
            var strArgSize = args[2];

            var varArgDst  = Context.IDE.Debugger.GetExpression(strArgDst, false, 100);
            var varArgVal  = Context.IDE.Debugger.GetExpression(strArgVal, false, 100);
            var varArgSize = Context.IDE.Debugger.GetExpression(strArgSize, false, 100);

            if (!varArgDst.IsValidValue)
            {
                Context.CONSOLE.Write("Argument <address>: " + strArgDst + " is invalid!");
                return;
            }

            if (!varArgVal.IsValidValue)
            {
                Context.CONSOLE.Write("Argument <val>: " + strArgVal + " is invalid!");
                return;
            }

            if (!varArgSize.IsValidValue)
            {
                Context.CONSOLE.Write("Argument <size>: " + strArgSize + " is invalid!");
                return;
            }

            long byteval     = 0;
            long dstAddress  = 0;
            long dataSize    = 0;
            var  numStyleSrc = NumberHelpers.IsHexNumber(varArgVal.Value)
                ? NumberStyles.HexNumber
                : NumberStyles.Integer;
            var numStyleDst = NumberHelpers.IsHexNumber(varArgDst.Value)
                ? NumberStyles.HexNumber
                : NumberStyles.Integer;
            var numStyleSize = NumberHelpers.IsHexNumber(varArgSize.Value)
                ? NumberStyles.HexNumber
                : NumberStyles.Integer;
            var bRet = true;

            bRet = bRet && NumberHelpers.TryParseLong(varArgDst.Value, numStyleDst, out dstAddress);
            bRet = bRet && NumberHelpers.TryParseLong(varArgVal.Value, numStyleSrc, out byteval);
            bRet = bRet && NumberHelpers.TryParseLong(varArgSize.Value, numStyleSize, out dataSize);

            if (!bRet)
            {
                Context.CONSOLE.Write("Failed to evaluate command arguments!");
                return;
            }

            if (!MemoryHelpers.ProcMemset(
                    Context.IDE.Debugger.CurrentStackFrame,
                    dstAddress,
                    (byte)byteval,
                    dataSize
                    ))
            {
                Context.CONSOLE.Write("Memory set dst:" + NumberHelpers.ToHex(dstAddress) + " " + (byte)byteval + " " +
                                      dataSize + " failed!");
                return;
            }

            Context.CONSOLE.Write("Wrote: " + dataSize + " bytes to address: " + NumberHelpers.ToHex(dstAddress));
        }