ডিডির সাথে বাইনারি প্যাচিং করা হচ্ছে


32

আমি এই উদ্ধৃতিটি (নীচে) বেশ কয়েকবার পড়েছি, খুব সম্প্রতি এখানে এসেছি এবং ক্রমাগত বিস্মিত হয়েছি যে কোনওdd সংকলককে যে কোনও কিছুকে কীভাবে প্যাচ করতে ব্যবহার করা যেতে পারে :

30 বছর আগে স্কুলে আমি ইউনিক্স সিস্টেমটি ব্যবহার করেছি, র‌্যাম এবং ডিস্ক স্পেসে খুব সীমাবদ্ধ ছিল। বিশেষত, /usr/tmpফাইল সিস্টেমটি খুব ছোট ছিল, যার ফলে কেউ যখন একটি বিশাল প্রোগ্রাম সংকলন করার চেষ্টা করে তখন সমস্যা দেখা দেয়। অবশ্যই, শিক্ষার্থীদের যাইহোক "বড় প্রোগ্রাম" লেখার কথা ছিল না; বড় প্রোগ্রামগুলি সাধারণত "কোথাও" থেকে অনুলিপি উত্স কোড ছিল। আমাদের মধ্যে অনেকে অনুলিপি /usr/bin/ccকরেছিল /home/<myname>/ccএবং তার পরিবর্তে বাইনারিগুলি ব্যবহার ddকরার জন্য প্যাচ করত/tmp/usr/tmp যা বড় ছিল। অবশ্যই এটি আরও জটিল করে তুলেছে - এই অনুলিপিগুলির অধীনে থাকা ডিস্কের জায়গাগুলি days দিনগুলি গুরুত্বপূর্ণ ছিল না এবং এখন /tmpনিয়মিতভাবে পূরণ করা হয়, অন্য ব্যবহারকারীদের এমনকি তাদের ফাইলগুলি সম্পাদনা করা থেকে বিরত করে। তারা কী ঘটেছে তা জানতে পেরে সিসাদমিনরা এchmod go-r /bin/* /usr/bin/* যা সমস্যাটি "সংশোধন" করেছে এবং আমাদের সি সংকলকটির সমস্ত অনুলিপি মুছে ফেলেছে।

(জোর আমার)

ddমনুষ্যসৃষ্ট পৃষ্ঠা প্যাচিং সম্পর্কে কিছুই বলছেন এবং তা মনে করি না এই যাহাই হউক না কেন করতে পুনরায় উদ্দেশ্য এটা হতে পারে।

বাইনারি সত্যিই সঙ্গে প্যাচ করা যেতে পারে dd? এর কি কোন historicalতিহাসিক তাত্পর্য আছে?


3
নিশ্চিত - শুধু odবাইট হেক্স কোডগুলি একটি ফাইল, অফসেট আপনার যা দরকার, আপনার সম্পাদনাটি সিদ্ধান্ত নেন, এবং bs=$patchsize count=1 seek=$((offset/bs)) conv=notruncমধ্যে আপনার প্যাচ ঠিক আছে।
mikeserv

3
কেউ কখনও বুট সেক্টরকে ওভাররাইট করে না। ;)
পার্থিয়ান শট

@ পার্থিয়ানশট আসলে আমি একবারে দেবিয়ান লাইভসিডি-র অংশ নিয়ে আমার বুট ড্রাইভের প্রথম + 260MB (+ মূল) ওভাররোট করেছিলাম। ও_ও তবে আমি মনে করি না যে এটি সত্যিই
প্যাচ করছে, হিহেহে

1
বা বরং, এটি ডিস্ক ধ্বংসকারীটির প্রত্যাশিত এবং সম্পূর্ণ স্বাভাবিক আচরণ: ডি
আমজিরারো

উত্তর:


73

চল এটা চেষ্টা করি. এখানে একটি তুচ্ছ সি প্রোগ্রাম রয়েছে:

#include <stdio.h>
int main(int argc, char **argv) {
    puts("/usr/tmp");
}

আমরা এটিকে তৈরি করব test:

$ cc -o test test.c

আমরা যদি এটি চালনা করি তবে এটি "/ usr / tmp" মুদ্রণ করে।

/usr/tmpবাইনারিটিতে " " কোথায় রয়েছে তা খুঁজে বার করুন :

$ strings -t d test | grep /usr/tmp
1460 /usr/tmp

-t d এটি খুঁজে পাওয়া প্রতিটি স্ট্রিংয়ের ফাইলে দশমিকায় অফসেট প্রিন্ট করে

এখন /tmp\0এটিতে কেবল " " দিয়ে একটি অস্থায়ী ফাইল তৈরি করা যাক :

$ printf "/tmp\x00" > tmp

সুতরাং এখন আমাদের কাছে বাইনারি রয়েছে, আমরা জানি যে স্ট্রিংটি আমরা পরিবর্তন করতে চাই সেখানে আমরা এটির প্রতিস্থাপনের স্ট্রিং সহ একটি ফাইল রেখেছি।

এখন আমরা ব্যবহার করতে পারি dd:

$ dd if=tmp of=test obs=1 seek=1460 conv=notrunc

এই থেকে তথ্য সার্চ tmp(আমাদের " /tmp\0" ফাইল), এটা আমাদের বাইনারি মধ্যে লেখা, 1 বাইট একটি আউটপুট ব্লক আকার ব্যবহার করে, এর অফসেট আমরা আগেই পাওয়া আগেই কিছু লিখেছেন, এবং স্পষ্টভাবে ফাইল ছিন্ন না যখন এটি সম্পন্ন করা কুঁদন।

আমরা প্যাচড এক্সিকিউটেবল চালাতে পারি:

$ ./test
/tmp

প্রোগ্রামটি প্রিন্ট করে দেয় আক্ষরিক স্ট্রিং পরিবর্তন করা হয়েছে, সুতরাং এটিতে এখন " /tmp\0tmp\0" রয়েছে , তবে স্ট্রিং ফাংশনগুলি প্রথম নাল বাইটটি দেখার সাথে সাথেই বন্ধ হয়ে যায়। এই প্যাচিংটি কেবল স্ট্রিংকে আরও ছোট বা একই দৈর্ঘ্যের তৈরি করতে দেয় এবং আরও দীর্ঘ নয় তবে এই উদ্দেশ্যে এটি পর্যাপ্ত।

সুতরাং আমরা ব্যবহার করে জিনিসগুলি কেবল প্যাচ করতে পারি না dd, আমরা কেবল এটি সম্পন্ন করেছি।


1
এটি দুর্দান্ত ... এবং এমন কিছু যা আমি দৃ strongly়ভাবে আশা করি যে আমি কখনই উত্পাদন পরিবেশে মুখোমুখি হই না! মাইক্রোকন্ট্রোলারদের জন্য হেক্স চিত্রগুলিতে সিরিয়াল নম্বর পেতে আমি অতীতে অনুরূপ পদ্ধতি ব্যবহার করেছি, যদিও পায়ে নিজেকে গুলি করা খুব সহজ।
মাইকেল শ

যদি আমি কাউকে কোনও নির্দিষ্ট বাইনারি কীভাবে প্যাচ করতে হয় তার জন্য লিখিত নির্দেশ দিতে চাই, তবে আমি তাদের বলার চেয়ে কপি / পেস্ট করার জন্য একটি কমান্ড লাইন দেব "হেক্স সম্পাদকের মধ্যে ফাইলটি খুলুন, /usr/tmpস্ট্রিংটি সন্ধান করুন, এর সাথে প্রতিস্থাপন করুন /tmp, ডন পেছনের \0বাইটটি ভুলে যাবেন না , ফাইলটি সংরক্ষণ করুন এবং আপনার আঙ্গুলগুলি ক্রস করুন। বা আরও ভাল, একটি শেল স্ক্রিপ্ট যা প্রথমে কিছুটা স্যানিটি পরীক্ষা করে, তারপরে কল করে dd। দুর্ভাগ্যবশত, এই ভালো জিনিস প্রয়োজনীয়তার ঘন ঘন দেখা দেয় দুটো কারণে যখন একটি অধুনা-লুপ্ত বিক্রেতা দ্বারা সফ্টওয়্যার এর একটি পুরোনো টুকরা মাত্র হয়েছে একটি নতুন সিস্টেম চলে আসেন করতে হবে।
গুন্ট্রাম ব্লহম

হ্যাঁ, এই ধরণের জিনিসটির জন্য সেড ভাল। তবে আপনি পুরো সম্পর্কে পুরোপুরি ঠিক নন "এই প্যাচিংটি কেবল স্ট্রিংকে আরও ছোট বা একই দৈর্ঘ্য তৈরি করতে দেয়, এবং আর" নয়। আপনি ধরে নিচ্ছেন যে আপনি যে স্ট্রিংটি সংশোধন করতে চান তার সাথে সাথেই আপনি ডেটা সম্পর্কে যত্নশীল হন বা আপনার পরবর্তী স্ট্রিংটি মূল স্ট্রিংয়ের একটি স্ট্রিং হিসাবে নাও থাকতে পারে। অন্য কথায়, আপনি যদি মেমরির। স্ট্রিং বিভাগে থাকেন এবং আপনি "/ usr \ 0 / bin / bash \ 0" পেয়ে থাকেন তবে আপনি প্রথমটি পরিবর্তন করে / usr / bin / bash এ পরিণত করতে পারেন নাল বাইট এবং এটিকে "/ usr // bin / bash" তৈরি করা (উদাহরণস্বরূপ)।
পার্থিয়ান শট

2
@ParthianShot - sed's না ভাল জিনিস এই ধরনের - আপনি পারেন না, তাই expliciltly এবং অবিকল সীমা sed' র পড়া / পথ আপনার সাথে হয়তো লিখতে বাফার dd- যা পুরো কারণ এটি আগের প্রথম স্থানে এই জন্য ব্যবহার করা হয়। সঙ্গে ddআপনি ইচ্ছামত নির্বিচারে বাইটের একটি অবাধ গণনা স্থাপন করতে পারেন। এটি সম্পর্কেও বলা যায় না sed। যদি ddএখানে স্ক্যাল্পেলের মতো ব্যবহার করা হয় তবে আপনি sedরেকিং বলের মতো প্রয়োগ করতে পারেন ।
মাইক্রজারভ

এটি একটি ফর্সা (যদিও মোটামুটি বিরল!) পয়েন্ট - এমন কোনও অনুষ্ঠান হবে যখন আপনি ফলাফল বা অন্য কোনও স্বেচ্ছাসেবক, তবে নির্দিষ্ট, ডেটা টুকরো যত্ন না করে স্ট্রিংটি দীর্ঘতর করতে পারেন। যদিও আমি সাধারণ বিবৃতি দিয়ে দাঁড়াব।
মাইকেল হোমার

9

এটি "বাইনারি প্যাচ" বলতে আপনি কী বোঝাতে চান তার উপর নির্ভর করে।

আমি ddমাঝে মাঝে ব্যবহার করে বাইনারিগুলি পরিবর্তন করি । অবশ্যই এতে কোনও বৈশিষ্ট্য নেই dd, তবে এটি ফাইলগুলি খুলতে পারে এবং নির্দিষ্ট অফসেটগুলিতে জিনিসগুলি পড়তে এবং লিখতে পারে, তাই যদি আপনি কী লিখতে জানেন তবে ভয়েলা আপনার প্যাচ রয়েছে।

উদাহরণস্বরূপ আমার কাছে এই বাইনারি ছিল যাতে কিছু পিএনজি ডেটা ছিল। binwalkঅফসেট সন্ধান করার জন্য, এটি ddবের করার জন্য ব্যবহার করুন (সাধারণত বিনওয়াক জিনিসগুলিও বের করে দেয় তবে আমার অনুলিপিটি বগি ছিল), এটি সম্পাদনা করুন gimp, নিশ্চিত করুন যে সম্পাদিত ফাইলটি মূল ফাইলের চেয়ে একই আকার বা ছোট (অফসেট পরিবর্তন করা আপনি সহজেই করতে পারেন এমন কিছু নয়) ), এবং তারপরে ddপরিবর্তিত চিত্রটি আবার জায়গায় রাখতে ব্যবহার করুন।

$ binwalk thebinary
[…]
4194643    0x400153     PNG image, 800 x 160, 8-bit/color RGB, non-interlaced
[…]
$ dd if=nickel bs=1 skip=4194641 count=2 conv=swab | od -i
21869 # file size in this case - depends on the binary format
$ dd if=thebinary bs=1 skip=4194643 count=21869 of=theimage.png
$ gimp theimage.png
$ pngcrush myimage.png myimage.crush.png
# make sure myimage.crush.png is smaller than the original
$ dd if=myimage.crush.png of=thebinary bs=1 seek=4194643 conv=notrunc

কখনও কখনও আমি বাইনারিগুলিতে স্ট্রিংগুলি প্রতিস্থাপন করতে চাই (যেমন পথ বা ভেরিয়েবলের নাম)। ddএটি ব্যবহার করেও করা যায় , এটি ব্যবহার করে করা সহজ sed। আপনাকে কেবল নিশ্চিত করতে হবে যে আপনি যে স্ট্রিংটি প্রতিস্থাপন করেছেন তার মূল দৈর্ঘ্যের সমান দৈর্ঘ্য রয়েছে যাতে আপনি অফসেট পরিবর্তন না করে।

sed -e s@/the/old/save/path@/the/new/save/path@ -i thebinary

বা @ মাইকেলহোমের উদাহরণটি 0-বাইট যুক্ত যুক্ত করে বেছে নিতে:

sed -e 's@/usr/tmp@/tmp\x00tmp@' -i test

অবশ্যই এটি পরে কাজ করে কিনা তা যাচাই করতে হবে।


... ধরে নিচ্ছি আপনার কাছে sedবাইনারি ফাইলগুলি ভালভাবে পরিচালিত হয়েছে, এটি gnu-র ক্ষেত্রে দেখা যায় sed, তবে sedকেবলমাত্র এসকিআই ফাইলগুলিতে কাজ করা পুরানো অনেকের সাথেই নয় , অন্য কোনও কিছুর সাথে বিভ্রান্ত হয়ে পড়ে (বিশেষত \0ইনপুটটিতে), এবং সর্বাধিক লাইনের দৈর্ঘ্যের উপর বিধিনিষেধ ছিল।
গুন্ট্রাম ব্লহম

1
ব্যস্তবক্সটি sedবাইনারি ফাইলগুলি সূক্ষ্মভাবে পরিবর্তন করতে সক্ষম হয়েছে বলে মনে হয় তবে এটি \x00জিএনইউ sedযেভাবে প্রতিস্থাপনের স্ট্রিংয়ের মধ্যে তা বুঝতে পারে না । এটা তোলে পরীক্ষা প্রয়োজন কিন্তু আমিও তেমনি এটা মূল্য উল্লেখ যেহেতু এটা এত বেশি সহজ মনে dd- কিছু কিছু ক্ষেত্রে জন্য। বাইনারিগুলি প্যাচিং করা কোনওভাবেই ফ্লেকি ব্যবসা business
frostschutz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.