0

我正在做一些与信息安全相关的测试,我遇到了以下情况,如果我把它发布在错误的地方,我很抱歉,任何问题都告诉我,我会解决它!

研究破解WIFI密码,找到了aircrack-ng套件应用,经过一段时间的学习,终于完成了找到我家wifi密码的任务xD

事不宜迟,下面我详细说明我的问题:

aircrack-ng 设法通过参数接收要测试的密码,我的问题是:

如何从 C# 控制台应用程序传递此参数

我尝试了几种方法,但没有成功。

在我最后一次尝试中,出于绝望,我使用了sendmessage函数,该函数在 windows 的user32.dll库中可用。

Obs:我正在使用已编译的适用于 windows 的 aircrack 二进制文件,可在链接中找到:适用于 windows 的 aircrack-ng

class Program
{
    public const Int32 WM_COPYDATA = 0x4A;

    [DllImport("user32.dll")]
    static extern long SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    static extern IntPtr FindWindow(string classname, string windowname);

    public static IntPtr IntPtrAlloc<T>(T param)
    {
        IntPtr retval = Marshal.AllocHGlobal(Marshal.SizeOf(param));
        Marshal.StructureToPtr(param, retval, false);
        return (retval);
    }

    public static void IntPtrFree(IntPtr preAllocated)
    {
        if (IntPtr.Zero == preAllocated) throw (new Exception("Go Home"));
        Marshal.FreeHGlobal(preAllocated); preAllocated = IntPtr.Zero;
    }

    public struct COPYDATASTRUCT
    {
        public IntPtr dwData;
        public int cbData;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
    }


    static void Main()
    {
        string msg = "123456";
        var cds = new COPYDATASTRUCT
        {
            dwData = new IntPtr(3),
            cbData = msg.Length + 1,
            lpData = msg
        };
        IntPtr hWnd = FindWindow("ConsoleWindowClass", @"C:\WINDOWS\system32\cmd.exe aircrack-ng");
        IntPtr cdsBuffer = IntPtrAlloc(cds);
        SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, cdsBuffer);
    }
}

目前有一个应用程序可以做到这一点,它叫做crunch,它基本上是一个单词生成器。并且可以使用控制台中的以下命令将此参数发送到 aircrack:

crunch 8 8 0123456789 | aircrack-ng -a 2 my-handshake-capture.cap -b my-router-mac-addres -w -

其中最后一个-在 aircrack 中被来自 crunch 的参数替换。

我在 github 上的Crunch 项目中搜索了它,但它是用 c 语言编写的,对我来说更复杂。谁能帮我?非常感谢您!

4

1 回答 1

0

我在此链接上遵循了建议:如何写入另一个应用程序的标准输入? 我得到了我需要的地平线!

好吧,最后,工作的代码基本上是这样的:

    public static void WriteWord(string word)
    {
        using (System.Diagnostics.Process airNgProcess = new System.Diagnostics.Process())
        {
            airNgProcess.StartInfo.FileName = @"D:\aircrack-ng-1.6-win\bin\aircrack-ng.exe";
            airNgProcess.StartInfo.Arguments = "francos.cap -b 38:BC:01:D1:A2:64 -w -";
            airNgProcess.StartInfo.UseShellExecute = false;
            airNgProcess.StartInfo.RedirectStandardInput = true;
            airNgProcess.StartInfo.RedirectStandardOutput = true;
            airNgProcess.StartInfo.WorkingDirectory = @"D:\aircrack-ng-1.6-win\bin";
            airNgProcess.Start();

            StreamWriter airNgWriter = airNgProcess.StandardInput;
            StreamReader airNgReader = airNgProcess.StandardOutput;

            airNgWriter.WriteLine(word);
            airNgWriter.Close();
            airNgProcess.WaitForExit();

            String airNgOutput = airNgReader.ReadToEnd();
            Console.WriteLine($"Testing Key: {word}");

            if (airNgOutput.IndexOf("KEY FOUND!") > -1)
            {
                Console.WriteLine($"Wifi password is: {word}");
            }
        }
    }

在现实世界中,它没有任何适用性,因为随着 C# 应用程序与 aircrack-ng 的结合,每秒的尝试次数已经大大减少,大约是每秒 8000 次尝试。这是我的电脑,核心 i9 和 32Gb 内存。

但是,通过学习和学习的方式,对我来说是非常好的

于 2022-01-26T02:23:20.540 回答