首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實作查看密碼框內容:透過 Windows API 讀取外部程式文字方塊

     編輯:關於C語言

前言

有時需要開發「查看密碼」工具,讀取其他程式密碼方塊(或任何文字方塊)的真實內容。C# 雖屬管理式語言,但透過 P/Invoke 呼叫 Windows API,即可跨進程讀取視窗文字。本文示範完整實作步驟與代碼。

核心 API 宣告

public static class NativeMethods
{
    [DllImport("user32.dll")]
    public static extern IntPtr WindowFromPoint(POINT lpPoint);

    [DllImport("user32.dll")]
    public static extern int GetCursorPos(out POINT lpPoint);

    [DllImport("kernel32.dll")]
    public static extern IntPtr VirtualAllocEx(
        IntPtr hProcess, IntPtr lpAddress, int dwSize,
        uint flAllocationType, uint flProtect);

    [DllImport("user32.dll")]
    public static extern IntPtr SendMessage(
        IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll")]
    public static extern int ReadProcessMemory(
        IntPtr hProcess, IntPtr lpBaseAddress,
        byte[] lpBuffer, int nSize, out int lpNumberOfBytesRead);
}

[StructLayout(LayoutKind.Sequential)]
public struct POINT { public int X; public int Y; }

取得游標下控制項句柄

public static IntPtr GetControlUnderCursor()
{
    POINT pt;
    NativeMethods.GetCursorPos(out pt);
    return NativeMethods.WindowFromPoint(pt);
}

讀取控制項文字完整流程

public static string ReadControlText(IntPtr hWnd)
{
    const int WM_GETTEXT = 0x000D;
    const int MAX_LEN = 256;

    // 1. 在目標進程配置記憶體
    IntPtr hProcess = Process.GetCurrentProcess().Handle; // 同進程簡化,跨進程需 OpenProcess
    IntPtr remotePtr = NativeMethods.VirtualAllocEx(
        hProcess, IntPtr.Zero, MAX_LEN, 0x1000, 0x04); // MEM_COMMIT | PAGE_READWRITE

    // 2. 發送 WM_GETTEXT 要求控制項將文字複製到遠端記憶體
    NativeMethods.SendMessage(hWnd, WM_GETTEXT, new IntPtr(MAX_LEN), remotePtr);

    // 3. 讀取遠端記憶體到本地陣列
    byte[] buffer = new byte[MAX_LEN];
    int bytesRead;
    NativeMethods.ReadProcessMemory(hProcess, remotePtr, buffer, MAX_LEN, out bytesRead);

    // 4. 釋放遠端記憶體 (略,實際應呼叫 VirtualFreeEx)

    return Encoding.Default.GetString(buffer, 0, bytesRead).TrimEnd('\0');
}

整合熱鍵觸發 (Win+V)

protected override void WndProc(ref Message m)
{
    const int WM_HOTKEY = 0x0312;
    if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == 1001)
    {
        OnHotKeyV();
    }
    base.WndProc(ref m);
}

private void RegisterHotKey()
{
    // 在 Form Load 中註冊
    RegisterHotKey(this.Handle, 1001, KeyModifiers.Windows, Keys.V);
}

private void OnHotKeyV()
{
    IntPtr hWnd = GetControlUnderCursor();
    string text = ReadControlText(hWnd);
    MessageBox.Show($"控制項文字:{text}");
}

關鍵技術點總結

步驟API說明
定位控制項GetCursorPos + WindowFromPoint取得滑鼠座標下的視窗句柄
配置跨進程記憶體VirtualAllocEx在目標進程位址空間保留緩衝區
請求文字SendMessage(WM_GETTEXT)控制項將文字複製到指定位址
讀回資料ReadProcessMemory將遠端記憶體複製到本地陣列

注意事項

  • 權限:跨進程讀取需 OpenProcess(PROCESS_VM_READ | PROCESS_VM_OPERATION),目標進程若以管理員權限執行,本程式亦需提權。
  • Unicode/ANSI:WM_GETTEXT 依視窗建立時的字元集決定回傳編碼,建議搭配 WM_GETTEXTLENGTH 先取得長度。
  • 安全性:現代瀏覽器、密碼管理器常使用非標準控制項或啟用 UIPI 防護,此法可能失效。

結語

透過 P/Invoke 組合 VirtualAllocEx、SendMessage、ReadProcessMemory,C# 即可實作跨進程文字讀取工具。搭配全域熱鍵,可做成實用的「密碼顯示器」或自動化測試輔助程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved