• Thứ Ba, 23/09/2008 09:09 (GMT+7)

    Cách sử dụng hàm ReadProcessMemory để đọc một số có độ dài 4 byte trong C# .Net?

    Câu hỏi :
    Cách sử dụng hàm ReadProcessMemory để đọc một số có độ dài 4 byte trong C# .Net? 
     

    Trả lời :

    Trước hết, chúng tôi xin nhắc lại một số thuật ngữ cơ bản có liên quan đến phần trả lời cho câu hỏi của bạn. Một chương trình đang chạy được gọi là process, nó truy xuất một vùng nhớ riêng biệt. Về nguyên tắc, mỗi ứng dụng không có yêu cầu truy xuất vùng nhớ của process khác.

     Một ứng dụng C# bao gồm từ 1 tới n class đối tượng cấu thành, mỗi class được đặc tả bởi 1 phát biểu class. Để các lệnh trong một class C# có thể gọi 1 hàm trong thư viện liên kết động *.dll, trước hết bạn phải khai báo hàm cần gọi bằng lệnh DllImport.

     Hàm ReadProcessMemory() thuộc thư viện kernel32.dll, nó cho phép đọc 1 vùng bộ nhớ của 1 process xác định. Thường hàm này được dùng bởi các trình debug (tìm lỗi trong chương trình khác).

     Sau đây là qui trình điển hình để viết 1 ứng dụng C# đơn giản, demo cho việc gọi hàm ReadProcessMemory():
     1. Chạy Visual Studio .Net, chọn menu File.New.Project để hiển thị cửa sổ New Project.
     2. Chọn loại Project Visual C#.Window, chọn thư mục chứa Project trong listbox "Location", nhập tên Project là CSReadProcessDemo, chọn button OK để máy tạo ra Project mới chứa Form mặc định có tên là Form1 theo các thông tin chọn lựa.
     3. Ấn phải chuột vào đối tượng Form1, chọn option "View Code" để hiển thị cửa sổ soạn code của Form1, rồi hiệu chỉnh code theo nội dung sau:
     using System;
     using System.Collections.Generic;
     using System.ComponentModel;
     using System.Data;
     using System.Drawing;
     using System.Text;
     using System.Windows.Forms;
     //thêm lệnh sau
     using System.Runtime.InteropServices;
     
     namespace CSReadProcessDemo {
     public partial class Form1 : Form {
     //khai báo 1 biến để đọc thử
     int a;
     //khai báo các hàm API cần dùng
     [DllImport("kernel32.dll")]
     private static extern bool ReadProcessMemory(
     IntPtr hProcess, ref int lpBaseAddress,
     ref int lpBuffer, int nSize,
     ref int lpNumberOfBytesRead);
     [DllImport("kernel32.dll")]
     private static extern IntPtr GetCurrentProcess();
     
     public Form1() {
     InitializeComponent();
     //viết thêm đoạn code demo việc dùng ReadProcessMemory
     int lpbuf=0;
     int lpsize=0;
     //chứa 10 vào biến a
     a = 10;
     //tìm handle của process cần đọc nội dung
     //ở đây chúng tôi chọn process hiện hành
     IntPtr hpro = GetCurrentProcess();
     //đọc 4 byte của biến a vào biến lpbuf
     bool kq = ReadProcessMemory(hpro, ref a, ref lpbuf, 4, ref lpsize);
     if (kq) //nếu đọc được thì hiển thị kết quả
     MessageBox.Show("Nội dung đọc được là : " + lpbuf.ToString());
     }
     }
     }
     4. Chọn menu Debug.Start debug để chạy thử chương trình, máy sẽ hiển thị là 10 (chính là nội dung của biến a mà hàm ReadProcessMemory đọc được).
     

    Chuyên mục: Lập trình