ايران ويج

نسخه‌ی کامل: خواندن اطلاعات یک پراسس در حال اجرا از رم ؟
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام دوستان

من میخوام یک عبارت متنی رو در اطلاعات موجود در حافظه رم مربوط به یک پراسس در حال اجرا جستجو کنم و آدرس اونو برداشت کنم و بعد مقدارشو عوض کنم

مشکلم جستجو کردن اون عبارت در حافظه هستش و گرفتن آدرسش در حافظه ؟
خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید
با نحوه اجرای برنامه های ویندوزی اشنا بشید
بعد نحوه ی کار با توابع API ویندوز رو یاد بگیرید
و تکنبکهای مربط با اینجکت رو درک کنید

و بعدش تمرین کنید و تلاش کنید بنویسیدش
با توابع read_process_memory میتونین یه بخش از حافظه برنامه رو بخونین و با تابع write_process_memory هم میتونین اون بخش رو تغییر بدین
البته قبلش با تابع open_process باید هندل اون پروسه رو بدست بیارین و آدرس محلی که اطلاعات اونجا هست تو حافظه رو داشته باشین
فکر کنم مشکل ایشون جست و جوی عبارت مورد نظر هست.
خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید خنده بلد − بهینه شده برای ورژن جدید تعجب - بهینه شده برای ورژن جدید 

اصلا نفهمیدم باید از کجا شروع کنم !

من میخوام آدرس مربوط به یه عبارت متنی رو در حافظه پیدا کنم . . .

کار با توابع API رو تا حدودی بلدم
نقل قول: فکر کنم مشکل ایشون جست و جوی عبارت مورد نظر هست.


بله دقیقا مشکلم همین هست

"جستجوی عبارت مورد نظر و گرفتن آدرس اون عبارت در حافظه "

چون با نرم افزار هایی مثل OllyDBG تونستم آدرس رو بگیرم و با توابعی که دوستمون بالا گفت مقدار رو تغییر دادم ولی اینکه اون آدرس رو من خودم با کد نویسی چه جوری بدست بیارم برام سواله
اینو تو stackoverflow پیدا کردم
کد:
#include <Windows.h>
#include <iostream>
#include <string>
#include <vector>

char* GetAddressOfData(DWORD pid, const char *data, size_t len)
{
   HANDLE process = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, pid);
   if(process)
   {
       SYSTEM_INFO si;
       GetSystemInfo(&si);

       MEMORY_BASIC_INFORMATION info;
       std::vector<char> chunk;
       char* p = 0;
       while(p < si.lpMaximumApplicationAddress)
       {
           if(VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info))
           {
               p = (char*)info.BaseAddress;
               chunk.resize(info.RegionSize);
               SIZE_T bytesRead;
               if(ReadProcessMemory(process, p, &chunk[0], info.RegionSize, &bytesRead))
               {
                   for(size_t i = 0; i < (bytesRead - len); ++i)
                   {
                       if(memcmp(data, &chunk[i], len) == 0)
                       {
                           return (char*)p + i;
                       }
                   }
               }
               p += info.RegionSize;
           }
       }
   }
   return 0;
}

int main()
{
   const char someData[] = "SomeDataToFind";
   std::cout << "Local data address: " << (void*)someData << "\n";

   //Pass whatever process id you like here instead.
   DWORD pid = GetCurrentProcessId();
   char* ret = GetAddressOfData(pid, someData, sizeof(someData));
   if(ret)
   {
       std::cout << "Found: " << (void*)ret << "\n";
   }
   else
   {
       std::cout << "Not found\n";
   }

   return 0;
}

اول با OpenProcess پروسس باز کرده بعد با VirtualQueryEx (فکر کنم خنده بلد − بهینه شده برای ورژن جدید ) برای دسترسی برای حافظه استفاده کرده و در نهایت با ReadProcessMemory حافظه و خونده و شروع به جست و جو کرده
مرسی دوست عزیز

من این مقاله رو هم پیدا کردم که قراره حافظه اختصاص یافته به Notepad رو در یک فایل متنی ذخیره کنه

کدش با کدی که شما گذاشتید فرق داره؟ این با #C هست

http://www.codingvision.net/security/c-h...ess-memory
کدش که مسلما فرق داره خنده بلد − بهینه شده برای ورژن جدید 
ولی آره جفتشون از یه روش استفاده کردن
متاسفانه من هر کاری کردم نتونستم از این کد جواب بگیرم غمگین - بهینه شده برای ورژن جدید

http://www.codingvision.net/security/c-h...ess-memory

این کد تبدیل شده هست

کد:
Imports System.Diagnostics
Imports System.IO
Imports System.Runtime.InteropServices
Public Class Form1
   ' REQUIRED CONSTS
   Private Const PROCESS_QUERY_INFORMATION As Integer = 1024
   Private Const MEM_COMMIT As Integer = 4096
   Private Const PAGE_READWRITE As Integer = 4
   Private Const PROCESS_WM_READ As Integer = 16

   ' REQUIRED METHODS
   Public Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As IntPtr
   Public Declare Function ReadProcessMemory Lib "kernel32.dll" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByVal lpBuffer() As Byte, ByVal dwSize As Integer, ByRef lpNumberOfBytesRead As Integer) As Boolean
   Private Declare Sub GetSystemInfo Lib "kernel32.dll" (ByRef lpSystemInfo As SYSTEM_INFO)
   Private Declare Function VirtualQueryEx Lib "kernel32.dll" (ByVal hProcess As IntPtr, ByVal lpAddress As IntPtr, ByRef lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As UInteger) As Integer

   ' REQUIRED STRUCTS
   Public Structure MEMORY_BASIC_INFORMATION
       Public BaseAddress As Integer
       Public AllocationBase As Integer
       Public AllocationProtect As Integer
       Public RegionSize As Integer
       Public State As Integer
       Public Protect As Integer
       Public lType As Integer
   End Structure

   Public Structure SYSTEM_INFO
       Public processorArchitecture As System.UInt16
       Private reserved As System.UInt16
       Public pageSize As UInteger
       Public minimumApplicationAddress As IntPtr
       Public maximumApplicationAddress As IntPtr
       Public activeProcessorMask As IntPtr
       Public numberOfProcessors As UInteger
       Public processorType As UInteger
       Public allocationGranularity As UInteger
       Public processorLevel As System.UInt16
       Public processorRevision As System.UInt16
   End Structure
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       ' getting minimum & maximum address
       Dim sys_info As SYSTEM_INFO
       GetSystemInfo(sys_info)
       Dim proc_min_address As IntPtr = sys_info.minimumApplicationAddress
       Dim proc_max_address As IntPtr = sys_info.maximumApplicationAddress

       ' saving the values as long ints so I won't have to do a lot of casts later
       Dim proc_min_address_l As Long = CType(proc_min_address, Long)
       Dim proc_max_address_l As Long = CType(proc_max_address, Long)

       ' notepad better be runnin'
       Dim process As Process = Process.GetProcessesByName("ETABS")(0)

       ' opening the process with desired access level
       Dim processHandle As IntPtr = OpenProcess((PROCESS_QUERY_INFORMATION Or PROCESS_WM_READ), False, process.Id)
       Dim sw As StreamWriter = New StreamWriter("dump.txt")

       ' this will store any information we get from VirtualQueryEx()
       Dim mem_basic_info As MEMORY_BASIC_INFORMATION = New MEMORY_BASIC_INFORMATION
       Dim bytesRead As Integer = 0

       ' number of bytes read with ReadProcessMemory

       While (proc_min_address_l < proc_max_address_l)
           ' 28 = sizeof(MEMORY_BASIC_INFORMATION)
           VirtualQueryEx(processHandle, proc_min_address, mem_basic_info, 28)
           ' if this memory chunk is accessible
           If ((mem_basic_info.Protect = PAGE_READWRITE) AndAlso (mem_basic_info.State = MEM_COMMIT)) Then
             
               Dim buffer() As Byte = New Byte((mem_basic_info.RegionSize) - 1) {}
               ' read everything in the buffer above
               ReadProcessMemory(CType(processHandle, Integer), mem_basic_info.BaseAddress, buffer, mem_basic_info.RegionSize, bytesRead)
               ' then output this in the file
               Dim i As Integer = 0
               Do While (i < mem_basic_info.RegionSize)
                   'sw.WriteLine("0x{0} : {1}", (mem_basic_info.BaseAddress + i).ToString("X"), CType(buffer(i), Char))
                   sw.WriteLine("0x{0} : {1}", (mem_basic_info.BaseAddress + i).ToString("X"), Microsoft.VisualBasic.AscW(buffer(i)))
                   i = (i + 1)
               Loop
           End If

           ' move to the next memory chunk
           proc_min_address_l = (proc_min_address_l + mem_basic_info.RegionSize)
           proc_min_address = New IntPtr(proc_min_address_l)

       End While

       sw.Close()
       Console.ReadLine()
   End Sub
End Class
کد که با زبان سی نوشته شده مشکلی نداره، حالا تو سی شارپ دیگه من نمیدونم
بهتره بگی هدفت چیه؟
میخوای چیکار کنی ؟
صفحه‌ها: 1 2