Example #1
0
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.ProcessExit += AppDomain_ProcessExit;
            using (var textWriter = new StreamWriter(@"D:\test.txt"))
            {
                foreach (var arg in args)
                {
                    textWriter.WriteLine(arg);
                }
            }

            try
            {
                if (args[0] == "-p")
                {
                    _process    = NtProcess.Open(int.Parse(args[1]), ProcessAccessRights.MaximumAllowed);
                    _waitHandle = new IntPtr(long.Parse(args[3]));
                }
                else
                {
                    var config = new NtProcessCreateConfig();
                    config.InitFlags   |= ProcessCreateInitFlag.IFEOSkipDebugger;
                    config.ThreadFlags |= ThreadCreateFlags.Suspended;
                    var path = NtFileUtils.DosFileNameToNt(args[0]);
                    config.ConfigImagePath = path;
                    var result = NtProcess.Create(config);
                    _process = result.Process;
                    _thread  = result.Thread;
                }

                while (true)
                {
                    bool beingDebugged;
                    if (_process.Wow64)
                    {
                        PartialPeb32 peb = (PartialPeb32)_process.GetPeb();
                        beingDebugged = peb.BeingDebugged == 1;
                    }
                    else
                    {
                        PartialPeb peb = (PartialPeb)_process.GetPeb();
                        beingDebugged = peb.BeingDebugged == 1;
                    }

                    if (beingDebugged)
                    {
                        break;
                    }

                    Thread.Sleep(100);
                }

                if (_thread != null)
                {
                    _thread.Resume();
                }

                if (_waitHandle != IntPtr.Zero)
                {
                    SetEvent(_waitHandle);
                }
            }
            finally
            {
                cleanUp(false);
            }
        }