আমি কখন এক্সিকিউটেবল বাইনারি স্ট্রিংগুলি সম্পাদনা করতে পারি?


11

আমার একটি এক্সিকিউটেবল বাইনারি রয়েছে; আসুন এটি কল a.out। আমি বাইনারি স্ট্রিং রয়েছে দেখতে পারেন

$ strings a.out
...
/usr/share/foo
....

আমার স্ট্রিংটি পরিবর্তন /usr/share/fooকরতে হবে /usr/share/bar। আমি শুধু সাথে STRING প্রতিস্থাপন করতে পারেন sed:

sed -i 's@/usr/share/foo@/usr/share/bar@' a.out

এটি দেখতে কোনও নিরাপদ জিনিস বলে মনে হচ্ছে। স্ট্রিং একই দৈর্ঘ্য না হলে এটি কি কাজ করবে?

উত্তর:


17

আমি জানি না যে আপনার সংস্করণটি sedবাইনারি-ক্লিন হবে বা এটি কী মনে করে যা তার ইনপুটটিতে সত্যই দীর্ঘ লাইন বলে মনে হচ্ছে, কিন্তু সেই সমস্যাগুলি বাদ দিয়ে, জায়গায় স্ট্রিংটি সম্পাদনা করা উচিত। এটি কিনা তা দেখতে, পুরানো এবং নতুন সংস্করণগুলির সাথে তুলনা করুন cmp -l। এটি আপনাকে বলা উচিত যে দুটি ফাইলের মধ্যে কেবল তিনটি পার্থক্য সেই 3 বাইট কিনা।

একটি কম্পাইল এক্সিকিউটেবলের স্ট্রিংগুলি সম্পাদনা করা সত্যই কাজ করবে যদি স্ট্রিংগুলি একই দৈর্ঘ্যের হয় তবে আপনি যদি স্ট্রিংটি ছোট করে থাকেন তবে প্রায়শই এটি কাজ করবে, সি স্ট্রিংগুলিতে যে স্ট্রিংগুলি কাজ করে তার কারণে, NULটার্মিনেটরের পরে সবকিছু গণনা করা হয় না, সুতরাং আপনি যদি NULপুরনোটির অবস্থানের আগে একটি নতুন টার্মিনেটর লিখেন , আপনি কার্যকরভাবে স্ট্রিংটি সংক্ষিপ্ত করে তুলবেন।

সাধারণভাবে, এই হ্যাকটি ব্যবহার করে আপনি কোনও স্ট্রিং দীর্ঘ করতে পারবেন না।


এরকম কিছু দিয়ে স্ট্রিং সংক্ষিপ্তকরণ সম্পর্কে কী sed -i 's@longstring@foo@' a.out? এটি পুরো বাইনারিটিকে 7 বাইট দ্বারা আরও ছোট করে তুলবে, এটি কি বাইনারিটিকে দূষিত করবে না?
মার্টিন ভেজিটার

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

2
ভাল উত্তর. সেড প্রচুর কাজ করতে পারে তবে সাধারণভাবে বাইনারি সম্পাদকদের জন্য এটি উদ্ভাবিত হয়েছিল। একটি বড় বাইনারি ফাইলের মধ্যে নেভিগেট করার সময় এগুলি ব্যবহার করা চ্যালেঞ্জ হতে পারে তবে তারা আপনাকে বাই বাইট করে জিনিসগুলি পরিবর্তন করতে দেবে। আমি hexeditযখন বাইনারি ফাইল পরীক্ষা বা পরিবর্তন করতে হয় তখন আমি ব্যবহার করি। আপনি strings -t x file | lessসম্পাদকে ঝাঁপ দেওয়ার আগে যে পরিবর্তনগুলি (মুদ্রণযোগ্য) স্ট্রিংগুলি পরিবর্তন করতে চান তার অফসেটগুলি সনাক্ত করতে আপনি ব্যবহার করতে পারেন ।
জো

ধরা যাক আমার সি প্রোগ্রামে আমার একটি স্ট্রিং রয়েছে: "আমার নাম মিস্টার রোবট" এবং আমি 'was' with 'is' প্রতিস্থাপন করতে চাই, তবে প্যাডিংটি \0সাবধানতার সাথে করতে হবে, কারণ যদি প্রতিস্থাপনটি এটি করে: "আমার নাম \ 0 মিস্টার রোবট ", তারপরে স্ট্রিংয়ের সাথে ক্রিয়াকলাপ সম্পাদনের সময়, '\ 0' অক্ষর সমস্যা তৈরি করবে কারণ দৈর্ঘ্য অনিচ্ছাকৃতভাবে হ্রাস পাবে।
নেহাল জে ওনি

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