劫持程序的命令来运行记事本

时间:2011-03-23 22:17:12

标签: c# vb.net

我有一个实用程序的EXE文件,当我运行这个文件时只有一个winform,当我们点击它时有按钮,它运行windows的记事本。现在我想劫持这个程序的命令来运行记事本而不是运行记事本我想运行MS Word。我知道C#和VB.NET。我需要做什么?

2 个答案:

答案 0 :(得分:5)

您可以尝试在此程序的文件夹中添加一个名为notepad.exe的程序,该程序只能执行以下操作:运行单词。

如果你想用C语言编写,那么你应该阅读这个页面 - 也许它会有所帮助:Intercepted: Windows Hacking via DLL Redirection

答案 1 :(得分:3)

您可以通过更改注册表来使用技巧将程序替换为另一个程序。即使您运行的程序使用绝对路径运行记事本,这也可以工作。它会覆盖正在运行的程序的任何实例,无论它位于何处。而且您不必修补文件。您感兴趣的关键是:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

添加一个包含程序名称的密钥,并添加一个Debugger字符串,其中包含要替换它的程序的路径。当然,您需要具有进行必要修改的权限。这个page解释了如何用其他程序替换Windows Notepad。您可以在此处应用相同的过程。


虽然您可能不希望进行此永久性更改,但您可以编写一个程序来临时添加/更改密钥,运行程序然后将其更改回来。这是一个完整的,我刚刚用Word暂时替换记事本进行演示。似乎工作得很好(虽然一如既往,使用风险自负)。只需进行所有必要的更改以适应您的情况。

using System.Diagnostics;
using Microsoft.Win32;

namespace ProgramLauncher
{
    class Program
    {
        // change the following constants as needed
        const string PROGRAM_NAME = @"notepad.exe";
        const string REPLACEMENT_PATH = @"C:\Program Files (x86)\Microsoft Office\Office12\WINWORD.EXE";
        const string RUNNING_PATH = @"C:\Windows\notepad.exe";

        // root key
        const string KEY = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options";

        static void Main(string[] args)
        {
            using (var rootKey = Registry.LocalMachine.OpenSubKey(KEY, RegistryKeyPermissionCheck.ReadWriteSubTree))
            {
                var oldPath = default(string);
                var needsRestoration = false;
                try
                {
                    oldPath = BackupKey(rootKey, PROGRAM_NAME, REPLACEMENT_PATH);
                    needsRestoration = true;
                    Process.Start(RUNNING_PATH).WaitForExit();
                }
                finally
                {
                    if (needsRestoration)
                        RestoreKey(rootKey, PROGRAM_NAME, oldPath);
                }
            }
        }

        static string BackupKey(RegistryKey rootKey, string programName, string newPath)
        {
            Debug.Assert(rootKey != null);
            Debug.Assert(!string.IsNullOrEmpty(programName));
            Debug.Assert(!string.IsNullOrEmpty(newPath) && System.IO.File.Exists(newPath));
            if (newPath.Contains(" "))
                newPath = string.Format("\"{0}\"", newPath);

            using (var programKey = rootKey.CreateSubKey(programName, RegistryKeyPermissionCheck.ReadWriteSubTree))
            {
                var oldDebugger = programKey.GetValue("Debugger") as string;
                programKey.SetValue("Debugger", newPath, RegistryValueKind.String);
                return oldDebugger;
            }
        }

        static void RestoreKey(RegistryKey rootKey, string programName, string oldPath)
        {
            Debug.Assert(rootKey != null);
            Debug.Assert(!string.IsNullOrEmpty(programName));

            if (oldPath != null)
            {
                using (var programKey = rootKey.OpenSubKey(programName, RegistryKeyPermissionCheck.ReadWriteSubTree))
                    programKey.SetValue("Debugger", oldPath);
            }
            else
            {
                rootKey.DeleteSubKey(programName);
            }
        }
    }
}