سؤال

لذلك كل ما أريد القيام به ببساطة هو إنشاء برنامج Ruby الذي يقرأ بعض القيم من عنوان الذاكرة المعروف في الذاكرة الافتراضية لعملية أخرى. من خلال بحثي ومعرفتي الأساسية بتحرير Hex تحرير مجموعة X86 الخاصة بعملية التشغيل في الذاكرة ، وجدت العنوان الأساسي وإزاحة القيم في الذاكرة التي أريدها. لا أريد تغييرها ؛ أنا فقط أريد قراءتها. لقد طلبت من مطور محرر الذاكرة كيفية التعامل مع هذا الملخص للغة وافتراض نظام Windows. أخبرني أن Win32Api يدعو إلى OpenProcess و CreateProcess و ReadProcessMemory و WriteProcessMemory كانت الطريقة للذهاب باستخدام C أو C ++. أعتقد أن الطريق للذهاب سيكون مجرد استخدام فئة Win32API ورسم الخرائط لحالتين منه ؛ واحد إما لـ OpenProcess أو CreateProcess ، اعتمادًا على ما إذا كان المستخدم قد تم تشغيله بالفعل أم لا ، وسيتم تعيين مثيل آخر إلى ReadProcessMemory. ربما ما زلت بحاجة إلى العثور على وظيفة للحصول على قائمة عمليات التشغيل ، لذا فأنا أعرف أي عملية تشغيل هي تلك التي أريدها إذا كانت تعمل بالفعل.

هذا سيستغرق بعض العمل لتجميعه معًا ، لكنني أعتقد أنه لن يكون الأمر سيئًا للغاية. إنه مجرد مجال جديد للبرمجة بالنسبة لي لأنني لم أعمل مطلقًا هذا المستوى المنخفض من لغة عالية المستوى (جيدًا ، مستوى أعلى من C على أي حال). أنا فقط أتساءل عن طرق الاقتراب من هذا. يمكنني فقط استخدام مكالمات مجموعة أو Win32API ، ولكن هذا يعني الاضطرار إلى التعامل مع مجموعة من الحزمة من السلسلة والصفوف والتفريغ المعتمدة على النظام ، أريد في النهاية جعل هذا العمل عبر النظام الأساسي لأن العملية التي أقرأ منها تنتج من قابلة للتنفيذ تحتوي على العديد من منصة ، (أعرف أن عنوان الذاكرة يتغير من النظام إلى النظام. الفكرة هي أن يكون لديك ملف مسطح يحتوي على جميع تعيينات الذاكرة حتى يتمكن برنامج Ruby من مطابقة بيئة النظام الأساسي الحالي مع رسم خرائط الذاكرة المطابقة. ) ولكن من نظرات الأشياء ، سيتعين علي فقط إنشاء فصل يلف كل ما هو مكالمات الوظائف المشتركة بين نظام المكتبة المشتركة للنظام الحالي.

على كل ما أعرفه ، يمكن أن توجد بالفعل جوهرة الياقوت التي تهتم بكل هذا بالنسبة لي أنني لا أجدها. يمكن أن أحاول أيضًا محاولة تحرير المنافعين التنفيذيين لكل بناء لجعله ، لذلك كلما كانت قيم الذاكرة التي أريد قراءتها من قبل العملية ، فإنها تكتب أيضًا نسخة من القيمة الجديدة إلى مساحة في الذاكرة المشتركة التي لدي بطريقة أو بأخرى يقوم Ruby بإعداد مثيل لفئة يكون مؤشرًا تحت غطاء محرك السيارة إلى عنوان الذاكرة المشتركة هذا ويشير بطريقة أو بأخرى إلى برنامج Ruby الذي تم تحديث القيمة ويجب إعادة تحميله. في الأساس ، سيكون النظام القائم على المقاطعة لطيفًا ، ولكن نظرًا لأن الغرض من قراءة هذه القيم هو مجرد إرسال إلى لوحة النتائج التي تم بثها من خادم مركزي ، يمكنني فقط الالتزام بنظام قائم على الاقتراع يرسل تحديثات على فترات زمنية ثابتة. كما يمكنني التخلي عن روبي تمامًا وأذهب إلى C أو C ++ ، لكنني لا أعرف ذلك أيضًا. أنا في الواقع أعرف المزيد من X86 من C ++ وأعلم فقط C بقدر ما هو النظام المستقل ANSI C ولم يتعامل مع مكتبات النظام المشتركة من قبل.

فهل هناك جوهرة أو وحدة أقل شهرة متوفرة بالفعل؟ إذا لم يكن الأمر كذلك ، فإن أي معلومات إضافية حول كيفية تحقيق ذلك ستكون لطيفة. أعتقد ، قصة قصيرة طويلة ، كيف أفعل كل هذا؟

شكرا مقدما ، grg

ملاحظة: أيضًا تأكيد على أن مكالمات Win32API يجب أن تهدف إلى مكتبة kernel32.dll ستكون لطيفة.

هل كانت مفيدة؟

المحلول

ألق نظرة على Win32Utils. أفكر في أنه يجب أن يجعلك على الأقل على قدميك ، وأعطيك أمثلة على كيفية البحث في واجهة برمجة التطبيقات نفسها إذا كانت الأحجار الكريمة نفسها لا تعمل من أجلك. قد تحتاج إلى عض الرصاصة وكتابة وحدة في C.

نصائح أخرى

استخدم Ruby-Ffi:

إذا كنت تعرف C و Win32 API ، فقد تجد أنه من الأسهل استخدامه Ruby-FFI جوهرة. Ruby-FFI تعمل ملفات C بشكل شفاف ، مما يتيح لك استخدام أي وظيفة Win32.

للذاكرة المشتركة المسماة ، يوفر Win32 CreateFileMapping( ) و MapViewOfFile( ).

هذه لها الرؤوس

# WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR);
# WINBASEAPI PVOID WINAPI MapViewOfFile(HANDLE,DWORD,DWORD,DWORD,DWORD);

عن طريق تمرير مقبض ملف غير صالح 0xFFFFFFFF داخل CreateFileMapping, ، يمكنك تجنب التعامل مع الملفات على الإطلاق ، وحدد ذاكرتك المشتركة باستخدام المصفوفات والمؤشرات.

فيما يلي مثال مبسط يقرأ من الذاكرة المشتركة. (ستستخدم إصدار جودة الإنتاج الإشارات في القارئ والكاتب ، ومؤسسة دائرية ، للسماح لكلتا العمليتين بالمضي قدماً بشكل غير متزامن مع التأكد من أن الكاتب لا يكتب مخزن مؤقتًا حتى ينتهي القارئ من قراءته.)

مثال روبي مبسط:

require 'ffi'

module Win32
   extend FFI::Library
   ffi_lib 'kernel32'  # see winbase.h
   attach_function :CreateFileMapping, 
            :CreateFileMappingA,[ :uint, :pointer, :long, :long, :long, :pointer ], :pointer   
            # suffix A indicates the ASCII version
   attach_function :MapViewOfFile, 
            :MapViewOfFile,[ :pointer, :long, :long, :long, :long ], :pointer  
end

memoryName = "Share Memory Name"
sz_buf = 1000  # bytes  (250 ints, 4 bytes each)
num_ints = sz_buf / 4

# Windows constants
PAGE_READWRITE = 0x0004
FILE_MAP_WRITE = 2

# Get handle to shared memory
hMemory = Win32.CreateFileMapping(0xFFFFFFFF, nil, PAGE_READWRITE, 0, sz_buf, memoryName)

# Create pointer into shared memory in the reader's memory space 
pMemory = FFI::MemoryPointer.new(:int, num_ints )
pMemory = Win32.MapViewOfFile(hMemory, FILE_MAP_WRITE, 0, 0, sz_buf)

# Read from shared memory buffer
puts pMemory.read_array_of_int(sz_buf).join(" ")  

بعض المعلومات المفيدة:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top