আপনি ELF সনাক্তকরণ নিজেকে সীমিত করতে চান, আপনি পড়তে পারেন ELF হেডারের এর /proc/$PID/exe
নিজের। এটি বেশ তুচ্ছ: যদি ফাইলে 5 ম বাইট 1 হয় তবে এটি 32-বিট বাইনারি হয়। যদি এটি 2 হয় তবে এটি 64-বিট। স্যানিটি যুক্ত করার জন্য:
- যদি প্রথম 5 বাইট হয়
0x7f, "ELF", 1
: এটি 32 বিট ইএলএফ বাইনারি।
- যদি প্রথম 5 বাইট হয়
0x7f, "ELF", 2
: এটি একটি 64 বিট ইএলএফ বাইনারি।
- অন্যথায়: এটি অনির্বাচিত।
আপনি এটিও ব্যবহার করতে পারেন objdump
তবে এটি আপনার libmagic
নির্ভরতা কেড়ে নেয় এবং এটির সাথে এটি প্রতিস্থাপন করে libelf
।
অন্য উপায় : আপনি /proc/$PID/auxv
ফাইলটি বিশ্লেষণ করতে পারেন । মতে proc(5)
:
এটিতে কার্যকর সময় প্রক্রিয়ায় প্রেরিত ইএলএফ ইন্টারপ্রেটার তথ্যের সামগ্রী রয়েছে। ফর্ম্যাটটি হ'ল একটি স্বাক্ষরযুক্ত লম্বা আইডি প্লাস প্রতিটি প্রবেশের জন্য একটি স্বাক্ষরযুক্ত দীর্ঘ মান long শেষ এন্ট্রিটিতে দুটি শূন্য রয়েছে।
unsigned long
কীগুলির অর্থ /usr/include/linux/auxvec.h
। আপনি চান AT_PLATFORM
, যা 0x00000f
। সে সম্পর্কে আমাকে উদ্ধৃতি দেবেন না, তবে এটি char *
প্ল্যাটফর্মের স্ট্রিংয়ের বিবরণ পেতে মানটি ব্যাখ্যা করা উচিত বলে মনে হয় ।
আপনি এই স্ট্যাকওভারফ্লো প্রশ্নটি দরকারী মনে করতে পারেন।
তবুও অন্য উপায় : আপনি কার্যকর করতে হবে এমন man ld
তথ্য ডাম্প করার জন্য ডায়নামিক লিঙ্কারকে ( ) নির্দেশ করতে পারেন । এটি স্ট্যান্ডার্ড আউটপুটে ডিকোডড এউএক্সভি কাঠামো প্রিন্ট করে। সতর্কতা: এটি হ্যাক, তবে এটি কার্যকর।
LD_SHOW_AUXV=1 ldd /proc/$SOME_PID/exe | grep AT_PLATFORM | tail -1
এটি এমন কিছু প্রদর্শন করবে:
AT_PLATFORM: x86_64
আমি এটি 32-বিট বাইনারি দিয়ে চেষ্টা করেছি এবং পেয়েছি i686
পরিবর্তে ।
এটি কীভাবে কাজ করে: LD_SHOW_AUXV=1
এক্সিকিউটেবল চালানোর আগে ডায়নামিক লিংকারকে ডিকোডেড এএক্সএক্সভি কাঠামো ডাম্প করার নির্দেশ দেয়। যতক্ষণ না আপনি সত্যিই আপনার জীবন আকর্ষণীয় করতে চান, আপনি এড়াতে চান আসলে চলমান এক্সিকিউটেবল বলেন। এটির main()
কার্যকারিতাটি কল না করে এটিকে লোড করার এবং গতিশীলভাবে যুক্ত করার একটি উপায় এটি চালানো ldd(1)
it ডাউনসাইড: LD_SHOW_AUXV
শেল দ্বারা সক্ষম করা হয়েছে, সুতরাং আপনি এর জন্য AUXV কাঠামোর ডাম্পগুলি পাবেন: সাবসেল ldd
এবং আপনার টার্গেট বাইনারি। সুতরাং আমরাgrep
AT_PLATFORM এর জন্য, তবে কেবল শেষ লাইনটি রাখি।
অক্সভ পার্সিং : আপনি যদি কাঠামোটিকে নিজেরাই পার্স করেন auxv
(গতিশীল লোডারটির উপর নির্ভর করে না) তবে কিছুটা ধাঁধা আছে: auxv
কাঠামোটি বর্ণনা করার প্রক্রিয়াটির নিয়ম অনুসরণ করে, সুতরাং sizeof(unsigned long)
32-বিট প্রক্রিয়াগুলির জন্য 4 এবং 64 এর জন্য 8 হবে বিট প্রক্রিয়া। আমরা আমাদের জন্য এই কাজ করতে পারেন। এটি 32-বিট সিস্টেমে কাজ করার জন্য, সমস্ত কী কোড অবশ্যই 0xffffffff
কম বা কম হওয়া উচিত । একটি 64-বিট সিস্টেমে, সর্বাধিক উল্লেখযোগ্য 32 বিট শূন্য হবে। ইন্টেল মেশিনগুলি সামান্য এন্ডিয়ান হয়, সুতরাং এই 32 বিট মেমরির মধ্যে কমপক্ষে উল্লেখযোগ্যগুলি অনুসরণ করে।
যেমন, আপনার যা করতে হবে তা হ'ল:
1. Read 16 bytes from the `auxv` file.
2. Is this the end of the file?
3. Then it's a 64-bit process.
4. Done.
5. Is buf[4], buf[5], buf[6] or buf[7] non-zero?
6. Then it's a 32-bit process.
7. Done.
8. Go to 1.
মানচিত্রের ফাইলটি পার্সিং : এটি গিলস দ্বারা প্রস্তাবিত হয়েছিল, তবে বেশ কার্যকর হয়নি। এখানে একটি পরিবর্তিত সংস্করণ আছে। এটি /proc/$PID/maps
ফাইল পড়ার উপর নির্ভর করে । যদি ফাইলটি -৪-বিট ঠিকানাগুলি তালিকাভুক্ত করে, তবে প্রক্রিয়াটি 64৪ বিট। অন্যথায়, এটি 32 বিট। সমস্যাটির মধ্যে রয়েছে যে কার্নেলটি 4 টি গ্রুপে হেক্স ঠিকানা থেকে নেতৃস্থানীয় শূন্যগুলি কেটে আউটপুটকে সহজতর করবে, তাই দৈর্ঘ্যের হ্যাকটি বেশ কার্যকর করতে পারে না। awk
উদ্ধার করতে:
if ! [ -e /proc/$pid/maps ]; then
echo "No such process"
else
case $(awk </proc/$pid/maps -- 'END { print substr($1, 0, 9); }') in
*-) echo "32 bit process";;
*[0-9A-Fa-f]) echo "64 bit process";;
*) echo "Insufficient permissions.";;
esac
fi
প্রক্রিয়াটির শেষ মেমরি মানচিত্রের প্রারম্ভিক ঠিকানাটি পরীক্ষা করে এটি কাজ করে। তারা যেমন তালিকাভুক্ত করা হয় 12345678-deadbeef
। সুতরাং, যদি প্রক্রিয়াটি 32-বিট এক হয়, তবে ঠিকানাটি আটটি হেক্স অঙ্ক দীর্ঘ হবে এবং নবমটি হাইফেন হবে। এটি যদি 64৪-বিট এক হয় তবে সর্বোচ্চ ঠিকানাটি এর চেয়ে দীর্ঘ হবে। নবম বর্ণটি হেক্স ডিজিটের হবে।
সচেতন হন: প্রথম এবং শেষ পদ্ধতিগুলি বাদে লিনাক্স কার্নেল ২.6.০ বা আরও নতুন প্রয়োজন, যেহেতু auxv
ফাইলটি আগে ছিল না।
/proc/[pid]/auxv
: "। Exec সময়ে প্রক্রিয়া প্রেরণ ELF অনুবাদক তথ্য বিন্যাস এক স্বাক্ষরবিহীন দীর্ঘ আইডি প্লাস প্রতিটি এন্ট্রির জন্য এক স্বাক্ষরবিহীন দীর্ঘ মান হল" (man proc
)।