N3 [C#] Tutorial Read/WriteProcess Memory menggunakan C#

Discussion in 'N3 Source Codes dan Tutorials' started by jazzybecker, Sep 4, 2014.

Discuss [C#] Tutorial Read/WriteProcess Memory menggunakan C# in the N3 Source Codes dan Tutorials area at Nyit-Nyit.Net

  1. jazzybecker 4 SD Level 4

    Messages:
    507
    Likes Received:
    156
    Trophy Points:
    70
    Game:
    Tidak Ada
    Ane sengaja post di sini biar keliatan gan :D, karena ane liat di SF C# masih kosong, menandakan bahasa ini masih awam untuk teman-teman N3 sekalian. Jadi, mari belajar sama" di sini ya :)

    Credit : EmoAngelWorld aka Irsyad (My Best Friend :D) And jazzybecker

    Tutorial 1 :
    Read/WriteProcess Memory menggunakan C#


    Tutorial kali ini akan menunjukan cara dasar membaca dan menulis sebuah memory suatu proses menggunakan C#, saya menganggap kalian paham apa itu C#, bagaimana cara membuat sebuah project dengan menggunakan Visual Studio, serta bagaimana cara membuat layout tampilan menggunakan toolbox yang tersedia di Visual Studio C#.

    Disini anda dapat menentukan sendiri target apa yang ingin menjadi percobaan dalam melakukan read / write process memory menggunakan C#, saran saya dapat menggunakan aplikasi yang tidak menggunakan proteksi seperti, notepad, paint, game offline.

    Untuk melakukan Read / Write Process Memory kita membutuhkan beberapa windows API ( ada dapat pelajari apa itu Windows API melalui wikipedia / google ), seperti :
    • ReadProcessMemory : adalah windows api yang digunakan untuk membaca memory pada suatu proses pada address / alamat memory yang ditentukan.

    • WriteProcessMemory : adalah windows api yang digunakan untuk menulis ke suatu memory suatu proses pada address / alamat memory yang ditentukan.

    • OpenProcess : adalah windows api yang digunakan untuk membuka sebuah process dengan hak yang kita tentukan sendiri.
    Dan untuk dapat menggunakan API windows kita menggunakan using namespaces yang menyediakan COM Interop dan juga platform invoke (untuk lebih jelas masalah ini dapat dibaca disini : http://msdn.microsoft.com/en-us/library/sd10k43k(v=vs.111).aspx ).

    Using Namespaces agar dapat menggunakan API Windows

    Code:
    using System.Runtime.InteropServices;
    Setelah menambahkan using namespaces pada form kita dapat melakukan import fungsi yang akan kita gunakan seperti yang sudah dijelaskan di atas kita akan membutuhkan fungsi ReadProcessMemory, WriteProcessMemory dan juga OpenProcess. pertama mari kita import fungsi yang akan kita gunakan pada aplikasi kita.

    Import ReadProcessMemory dari kernel32.dll

    Code:
    [DllImport("kernel32.dll")]
    publicstaticexternboolReadProcessMemory(int hProcess,int lpBaseAddress,byte[] lpBuffer,int dwSize,refint lpNumberOfBytesRead);
    
    Import WriteProcessMemory dari kernel32.dll
    Code:
    [DllImport("kernel32.dll",SetLastError=true)]
    staticexternboolWriteProcessMemory(int hProcess,int lpBaseAddress,byte[] lpBuffer,int dwSize,refint lpNumberOfBytesWritten);
    
    Import OpenProcess dari kernel32.dll
    Code:
    [DllImport("kernel32.dll")]
    publicstaticexternIntPtrOpenProcess(int dwDesiredAccess,bool bInheritHandle,int dwProcessId);
    
    Mari kita mulai membuat code untuk membaca dan menulis sebuah nilai dari dan ke dalam sebuah memory suatu proses. Sekarang kita harus membuka sebuah proses dengan hak akses yang kita inginkan dalam hal ini kita ingin agar memory proses tersebut dapat dibaca dan juga ditulis, sesuai yang tertulis di msdn bahwa ada beberapa akses yang dapat digunakan untuk parameter pertama pada fungsi OpenProcess diatas, yaitu :

    Code:
    All = 0x001F0FFF,
    Terminate = 0x00000001,
    CreateThread = 0x00000002,
    VMOperation = 0x00000008,
    VMRead = 0x00000010,
    VMWrite = 0x00000020,
    DupHandle = 0x00000040,
    SetInformation = 0x00000200,
    QueryInformation = 0x00000400,
    Synchronize = 0x00100000
    
    Untuk menggabungkan beberapa hak akses sekaligus dapat menggunakan | (Bitwize) contoh

    - 0x10|0x20 = agar kita dapat melakukan read dan write sekaligus. tapi saran saya tetap gunakan 0x001F0FFF agar gak usah pusingin lagi kalau ada yang ketinggalan.

    Mari kita ambil contoh notepad, sekarang mari kita OpenProcess Notepad dengan hak akses ALL.
    OpenProcess Notepad Dengan ALL Hak Akses, Dan Mendapatkan ProcessHandle Dari Process Tersebut Yang Akan Digunakan Sebagai Parameter Read Dan Write Process Memory.

    Code:
    Process process =Process.GetProcessesByName("notepad")[0];
    IntPtr processHandle =OpenProcess(0x1F0FFF,false, process.Id);
    
    Kemudian fungsi untuk membaca sebuah alamat / address tertentu pada suatu memory dalam sebuah proses yaitu dengan menggunakan ReadProcessMemory.

    ReadProcessMemory Address / Alamat Pada Memory Proses Notepad
    Code:
    int bytesRead =0;
    byte[] buffer =newbyte[10];
    ReadProcessMemory((int)processHandle,0xaddress, buffer, buffer.Length,ref bytesRead);
    
    Variable processHandle disini adalah sebuah handle dari suatu proses yang telah kita buka diawal dengan menggunakan fungsi OpenProcess yang memiliki hak akses ALL.

    Variable buffer disini adalah sebuah array yang akan digunakan untuk menampung hasil dari ReadProcessMemory, pada contoh ini saya hanya dapat menampung 10 byte sehingga akan hanya dapat membaca 10 byte dari memory process, dan jika ingin membaca lebih dari 10 byte anda dapat memperbesar size arraynya menjadi jumlah yang anda inginkan.

    0xaddress disini adalah address yang akan kita baca valuenya, address ini anda dapat melalui ollydbg / cheat engine atau tools memory scanner lain.

    Variable buffer.Length disini adalah mengirim panjang data yang akan kita baca disini kita hanya dapat menampung 10 byte maka kita kirim ke fungsi ReadProcessMemory bahwa kita hanya mau membaca 10 byte saja

    Variable bytesRead disini adalah variable yang akan dirubah valuenya sesuai dengan jumlah byte yang kita baca, contoh setelah menjalankan fungsi ReadProcessMemory kita membaca 10 byte maka variable bytesRead akan berubah nilai dari 0 menjadi 10. (untuk lebih jelasnya silahkan membaca statement out dan ref pada C#, bisa dibilang pass by reference dan pass by value pada bahasa pemograman lain)

    Dan untuk mencetak hasil dari byte yang kita baca menjadi sebuah ascii / string.
    Merubah Byte Hasil ReadProcessMemory Menjadi String
    Code:
    Console.WriteLine(Encoding.Unicode.GetString(buffer));
    Console.ReadLine();
    
    Encoding.Unicode.GetString adalah sebuah fungsi yang digunakan untuk mengconvert dari byte ke string.
    Kemudian kita lanjutkan pada fungsi menusil sebauh nilai kedalam sebuah alamat / address suatu process memory.

    WriteProcessMemory Address / Alamat Pada Memory Proses Notepad
    Code:
    int bytesWritten =0;
    \\ \0 untuk menandakan akhir dari string
    byte[] buffer =Encoding.Unicode.GetBytes("Berubah\0");
    WriteProcessMemory((int)processHandle,0xaddress, buffer, buffer.Length,ref bytesWritten);
    
    Variable processHandle disini adalah sebuah handle dari suatu proses yang telah kita buka diawal dengan menggunakan fungsi OpenProcess yang memiliki hak akses ALL.

    Variable buffer disini adalah sebuah array yang akan digunakan untuk menampung nilai yang akan kita tulis menggunakan WriteProcessMemory, pada contoh ini saya hanya dapat menulis 10 byte sehingga akan hanya dapat menulis 10 byte ke memory process, dan jika ingin menulis lebih dari 10 byte anda dapat memperbesar size arraynya menjadi jumlah yang anda inginkan atau sesuai dengan panjang string yang telah anda rubah menggunakan fungsi Unicode.GetBytes.

    0xaddress disini adalah address yang akan kita baca valuenya, address ini anda dapat melalui ollydbg / cheat engine atau tools memory scanner lain.

    Variable buffer.Length disini adalah mengirim panjang data yang akan kita tulis disini kita hanya dapat menampung 10 byte maka kita kirim ke fungsi WriteProcessMemory bahwa kita hanya mau menulis 10 byte saja

    Variable bytesWritten disini adalah variable yang akan dirubah valuenya sesuai dengan jumlah byte yang kita tulis, contoh setelah menjalankan fungsi WriteProcessMemory kita menulis 10 byte maka variable bytesWritten akan berubah nilai dari 0 menjadi 10. (untuk lebih jelasnya silahkan membaca statement out dan ref pada C#, bisa dibilang pass by reference dan pass by value pada bahasa pemograman lain).

    Encoding.Unicode.GetBytesadalah sebuah fungsi yang digunakan untuk mengconvert dari string ke byte.

    Code Lengkap :

    Code:
    usingSystem;
    usingSystem.Diagnostics;
    usingSystem.Runtime.InteropServices;
    usingSystem.Text;
    
    publicclassTutorial1
    {
    [DllImport("kernel32.dll")]
    publicstaticexternIntPtrOpenProcess(int dwDesiredAccess,bool bInheritHandle,int dwProcessId);
    [DllImport("kernel32.dll")]
    publicstaticexternboolReadProcessMemory(int hProcess,int lpBaseAddress,byte[] lpBuffer,int dwSize,refint lpNumberOfBytesRead);
    [DllImport("kernel32.dll",SetLastError=true)]
    staticexternboolWriteProcessMemory(int hProcess,int lpBaseAddress,byte[] lpBuffer,int dwSize,refint lpNumberOfBytesWritten);
    
    publicstaticvoidMain()
    {
    Process process =Process.GetProcessesByName("notepad")[0];
    IntPtr processHandle =OpenProcess(0x1F0FFF,false, process.Id);
    int bytesRead =0;
    byte[] buffer =newbyte[10];
    ReadProcessMemory((int)processHandle,0xaddress, buffer, buffer.Length,ref bytesRead);
    Console.WriteLine(Encoding.Unicode.GetString(buffer));
    
    int bytesWritten =0;
    byte[] buffer =Encoding.Unicode.GetBytes("Berubah\0");
    WriteProcessMemory((int)processHandle,0xaddess, buffer, buffer.Length,ref bytesWritten);
    Console.ReadLine();
    }
    }
    

    To Be Continued
     
    Acenggers, dono and Zeinheizer like this.

    Gunakan jasa Rekber N3 untuk menjamin jual beli anda atau menghindari penipuan dengan meng klik disini
  2. deny11 Pra TK Level 1

    Messages:
    21
    Likes Received:
    1
    Trophy Points:
    28
    Game:
    Tidak Ada
    gan misal kita mo cari process memory untuk cheat engine gmn gan? yang saya maksud disini kayak process plugin-container, flashplayer plugin dll
     
  3. jazzybecker 4 SD Level 4

    Messages:
    507
    Likes Received:
    156
    Trophy Points:
    70
    Game:
    Tidak Ada
    maksud ente nampilin module yang diload sama process ya gan, kalau memang itu maksudnya ente tinggal pertama cari process yang mau diliat modulenya, caranya :
    Code:
    System.Diagnostics.Process process = System.Diagnostics.Process.GetProcessesByName("notepad")[0];
    
    terus Bikin Variable untuk menampung Module contohnya :
    Code:
    System.Diagnostics.ProcessModule singleModule;
    
    kemudian ambil semua modules yang ada pada process yang sudah kita pilih diatas, caranya :
    Code:
    System.Diagnostics.ProcessModuleCollection allModuleInsideProcess = process.Modules;
    
    kita sudah mendapatkan semua module pada satu process yang disimpan dalam allModuleInsideProcess, nah sekarang tinggal dilooping / iteration untuk menampilkan data tiap module, contohnya :
    Code:
    for (int i = 0; i < allModuleInsideProcess.Count; i++)
    {
    ingleModule = allModuleInsideProcess[i];
    Console.WriteLine("Module Name : "+singleModule.ModuleName);
    Console.WriteLine("File Name : " + singleModule.FileName);
    Console.WriteLine("BaseAddress Memory Address Module Loaded : " + singleModule.BaseAddress);
    Console.WriteLine("EntryPoint Memory Address Module Loaded : " + singleModule.EntryPointAddress);
    }
    
    Silahkan di coba gan :D
     
  4. napster.junior TK 0 Kecil Level 1

    Messages:
    82
    Likes Received:
    8
    Trophy Points:
    36
    Game:
    Dota 2
    bos mau nanyakalau untuk membaca penggunaan memory dari process gimana ya?
    seperti yang ada di task manager tab process kan disitu ada tampilan penggunaan memorynya.
     
  5. dante7867 TK 0 Besar Level 1

    Messages:
    109
    Likes Received:
    3
    Trophy Points:
    43
    ini bisa dipakai di c# 2010 ngga gan?
     
  6. gladiator Belum Sekolah Level 0

    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    1
    Game:
    Ragnarok
    Region:
    Kediri
    gan rekues dong delphi 7
     
  7. jazzybecker 4 SD Level 4

    Messages:
    507
    Likes Received:
    156
    Trophy Points:
    70
    Game:
    Tidak Ada

Share This Page