কিভাবে একটি প্রক্রিয়া থেকে মেমরি পড়া সম্পর্কে যেতে হবে? এটি কি ওএস দ্বারা আলাদা?


11

একজন অভিজ্ঞ ওয়েব-বিকাশকারী, তবে একজন শিক্ষানবিশ "নিম্ন স্তরের" প্রোগ্রামার হিসাবে, এই স্টাফটি এখনও আমার কাছে ভুডু।

আমি কৌতূহল করছি যে কেউ কীভাবে মেমোরি ব্লকটি সন্ধান করতে এবং তারপরে এটি পড়তে শুরু করবে (উদাহরণস্বরূপ, খনিগুলির খেলায় টাইমার পড়া)? এটি কি ওএস / ওএস সংস্করণ অনুসারে আলাদা?

উত্তর:


14

এটি কিছুটা জটিল এবং এমনকি জটিল প্রশ্ন, এই অর্থে যে আপনি এটির সাথে বেশ গভীরভাবে যেতে পারেন। তবে বিষয়গুলিকে কিছুটা সরল করতে:

" খনিগুলির খেলায় টাইমার পড়া " এর উদাহরণ বিবেচনা করে :

প্রথম পদক্ষেপটি মেমরির ঠিকানা খুঁজে পাওয়াএটি সাধারণত মেমোরি এডিটর নামে একটি সরঞ্জামের সাহায্যে করা হয় (একটি ডিবাগারও কিছু ক্ষেত্রে কিছু করতে পারে) যা প্রক্রিয়া স্মৃতিতে একটি ভেরিয়েবলের অবস্থান সন্ধান করতে বিভিন্ন পদ্ধতি ব্যবহার করতে পারে । সাধারণ উপায় হ'ল টার্গেট প্রক্রিয়াটির মেমরি স্পেসের একটি নির্দিষ্ট মান (উদাহরণস্বরূপ টাইমারের মান) সন্ধান করা, তারপরে লক্ষ্য মানটি পরিবর্তন করুন (যেমন টাইমারটি অগ্রিম করুন) এবং আবার ম্যাচের সন্ধান করুন। এই প্রক্রিয়াটি প্রতি পুনরাবৃত্তিকে প্রার্থীদের পিন করে দেয় যতক্ষণ না কেবল সঠিক ভেরিয়েবলটি বাকী থাকে। প্রক্রিয়াটির মেমোরি স্পেসের মধ্যে সেই পরিবর্তনশীলটির ঠিকানা নেওয়া কোনও মেমরি সম্পাদক সহ মাউস ক্লিকের বিষয়।

দ্বিতীয় পদক্ষেপটি সেই নির্দিষ্ট ঠিকানায় ডেটা পরিবর্তন করাএটি কীভাবে করা হয় তা অপারেটিং সিস্টেমের উপর নির্ভর করে। সঙ্গে উইন্ডোজ , একটি WinAPI কল নামে এর WriteProcessMemoryযা লক্ষ্যবস্তু প্রক্রিয়া 'মেমরি স্পেস মধ্যে একটি প্রদত্ত ঠিকানায় লিখুন প্রাক সংজ্ঞায়িত ডেটাতে ব্যবহার করা যাবে। আমাদের উদাহরণস্বরূপ, আপনি আপনার নিজের পছন্দসই মানের সাথে টার্গেট প্রক্রিয়ায় টাইমার ভেরিয়েবলটি ওভাররাইট করতে এই গেমটি ব্যবহার করবেন, গেমের কার্যকরভাবে টাইমার পরিবর্তন করে।

অনুশীলনে আপনাকে লক্ষ্য প্রক্রিয়াটির প্রক্রিয়া আইডিটি খুঁজে পেতে হবে এবং এর পরে আপনার দুর্বৃত্ত প্রক্রিয়াটি তার মেমরির স্থান পরিবর্তন করার ক্ষমতা অর্জন করতে লক্ষ্য প্রক্রিয়ার সাথে সংযুক্ত করবে। এটি বেশ তুচ্ছ কাজ, তবে প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে অবদান রাখে না তাই আমি এটিকে পাঠকের অনুশীলন হিসাবে ছেড়ে দিয়েছি। ;)


প্রক্রিয়াটি যখন চলবে তখন ভেরিয়েবলের অবস্থান কি একই হবে?
brunoqc

1
@ ব্রুনোএকসি না, প্রায় নিশ্চিতভাবেই না।
ড্যান

2

এটি ওএস দ্বারা সম্পূর্ণ আলাদা। কিছু আপনাকে এটিকে একেবারেই অনুমতি দেবে না এবং আপনি যে ডেটা চান তা লক্ষ্যের মেমরির জায়গাতে কোথায় রয়েছে তা জানার আপনার কিছু উপায় থাকতে হবে।

এটি লিনাক্সে কীভাবে করবেন তা এখানে রয়েছে: /unix/6301/how-do-i-read-from-proc-pid-mem-und-linux


কি ওএস এটি অনুমতি দেয় না? দেখে মনে হচ্ছে আপনি এটি লিনাক্স এবং উইন্ডোজের আওতায় কমপক্ষে করতে পারেন
ইভা

@Evan প্রতিটি অপারেটিং সিস্টেমের হয়েছে (সীমাবদ্ধ সুরক্ষা জনিত কারণে) অনুমতি দেয় ডিবাগ করার উদ্দেশ্যে জন্য দূরবর্তী প্রক্রিয়া মেমরির পরিবর্তনের উপায়। তবে নোট করুন যে উদাহরণস্বরূপ সুরক্ষার কারণে সুবিধাদির সাথে মেলে না এমন এটি তৈরি করতে পারে যাতে উচ্চতর সুবিধাপ্রাপ্ত প্রক্রিয়াটির কেউ মেমরি পড়তে / লিখতে না পারে। এর উত্তম উদাহরণ হ'ল প্রশাসকের অধিকার সহ প্রক্রিয়াটির স্মৃতি পড়তে / লেখার জন্য অতিথি ব্যবহারকারীদের সুবিধাগুলি সহ কোনও প্রক্রিয়া যাতে না হয়, কারণ এটি সম্ভবত পুরো সিস্টেমের সাথে আপোস করতে পারে এবং অতিথির ব্যবহারকারীর পক্ষে প্রশাসনের অধিকার অর্জনের প্রত্যক্ষ উপায় হতে পারে পদ্ধতি.
zxcdw

1

ওএস দ্বারা একটি অ্যাপ্লিকেশনকে অনেকগুলি মেমরি দেওয়া হয়। সাধারণত, অ্যাপ্লিকেশনটিতে মেমরিটির জন্য অনুরোধ করতে হয় তবে ভাষাটির কারণে প্রোগ্রামিংটির কাছে সেই কার্যকারিতাটি অস্পষ্ট হতে পারে।

যেহেতু C- এর মতো অন্যান্য ভাষায় ++ সি #, এবং জাভা মত কীওয়ার্ড ব্যবহারের মাধ্যমে অনুরোধ জন্য অনুমতি C- এর মতো ভাষাসমূহ, নির্দিষ্ট মাপ জন্য ব্লক অনুরোধ জন্য অনুমতি new। প্রতিটি ভাষার মেমরি বরাদ্দ করার বিভিন্ন উপায় রয়েছে, সুতরাং এটি কেবল একটি সংক্ষিপ্ত বিবরণ। মেমরিটিকে ওএস-এ ফিরিয়ে দেওয়া হয় স্পষ্টভাবে বা কোনও আবর্জনা সংগ্রহকারীর মাধ্যমে করা যেতে পারে।

অ্যাপ্লিকেশনটির মধ্যে মেমরির অ্যাক্সেস এটি কীভাবে বরাদ্দ করা হয়েছিল তার উপর নির্ভর করে। মেমরিটি কোথায় অবস্থিত তা চিহ্নিত / ট্র্যাক করার জন্য পয়েন্টারগুলির ধারণাটি ব্যবহার করার জন্য সি এবং সি ++ সর্বাধিক পরিচিত। অন্যথায়, তৈরি করা ক্লাস বা ভেরিয়েবলের মাধ্যমে মেমরি অ্যাক্সেস পরিচালনা করা হয়।

বেশিরভাগ সময়, আপনার প্রোগ্রামের মধ্যে আপনাকে নির্দিষ্ট মেমরির অ্যাক্সেস সম্পর্কে চিন্তা করতে হবে না। ভাষাটি তৈরি করে এবং ওএস কার্যকরভাবে আপনার জন্য সেই উদ্বেগকে অস্পষ্ট করে।

কোনও গেমের টাইমার আপনার উদাহরণ হ'ল অন্তর্নিহিত মেমরির বরাদ্দ সম্পর্কে আপনাকে উদ্বিগ্ন হওয়ার দরকার নেই এর দুর্দান্ত উদাহরণ। আপনার টাইমার উপস্থাপন করে একটি ভেরিয়েবল থাকবে এবং আপনি কেবল ভেরিয়েবলটি থেকে পড়বেন।

আমার উত্তর আপনি যখন অ্যাপ্লিকেশনটি লিখছেন তার জন্য প্রাসঙ্গিক, অন্যদিকে zxcdw- র উত্তরটি অন্য অ্যাপ্লিকেশনের সাথে সম্পর্কিত মেমোরি অ্যাক্সেসের জন্য প্রাসঙ্গিক। আপনার এলএমজিটিএফওয়াই শর্তাবলী "ডিবাগিং" এবং "রিভার্স-ইঞ্জিনিয়ারিং" হবে সেই বিষয়ে আরও তদন্ত করতে।

কিছু অতিরিক্ত পড়া:


দুর্দান্ত উত্তর, হ্যাঁ, এই ক্ষেত্রে আমি নিজেই লিখিনি এমন একটি অ্যাপ্লিকেশন থেকে মেমরি পড়ার সাথে আমি আরও উদ্বিগ্ন। আমি 15 জন প্রতিনিধি হওয়ার সাথে সাথেই উত্সাহিত করব;)
ইভা

@ ইভান - অবশ্যই ভার্চুয়াল মেমরির নিবন্ধটি পড়ুন। এটি আপনাকে যে ম্যাপিংটি চালিয়ে যাচ্ছে তার আরও ভাল ধারণা দেবে। কোনও অ্যাপ্লিকেশন আলাদা করার জন্য আপনাকে ম্যাপিংটি বুঝতে হবে। বেশিরভাগ ডিবাগার আপনাকে একটি চলমান প্রক্রিয়াতে সংযুক্ত করার অনুমতি দেবে যা আপনাকে অ্যাপ্লিকেশনটির নির্দেশাবলী এবং মেমোরিটি দেখার অনুমতি দেবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.