Saya telah membaca kutipan ini (di bawah) beberapa kali, paling baru di sini , dan saya terus-menerus bingung bagaimana dd
bisa digunakan untuk menambal apa pun apalagi kompiler:
Sistem Unix yang saya gunakan di sekolah, 30 tahun yang lalu, sangat terbatas dalam ruang RAM dan Disk. Terutama,
/usr/tmp
sistem file sangat kecil, yang menyebabkan masalah ketika seseorang mencoba menyusun program besar. Tentu saja, siswa tidak seharusnya menulis "program besar"; program besar biasanya kode sumber disalin dari "suatu tempat". Banyak dari kita disalin/usr/bin/cc
ke/home/<myname>/cc
, dan digunakandd
untuk menambal biner untuk menggunakan/tmp
bukan/usr/tmp
, yang lebih besar. Tentu saja, ini hanya memperburuk masalah - ruang disk yang ditempati oleh salinan ini memang penting hari itu, dan sekarang/tmp
terisi penuh, mencegah pengguna lain bahkan mengedit file mereka. Setelah mereka mengetahui apa yang terjadi, para sysadmin melakukanchmod go-r /bin/* /usr/bin/*
yang "memperbaiki" masalah, dan menghapus semua salinan kami dari kompiler C.
(Penekanan milikku)
Halaman dd
manual tidak mengatakan apa-apa tentang menambal dan tidak berpikir itu bisa bertujuan ulang untuk melakukan hal ini.
Bisakah binari benar-benar ditambal dd
? Apakah ada signifikansi historis untuk ini?
od
file untuk kode hex byte, menemukan offset yang Anda butuhkan, memutuskan mengedit, danbs=$patchsize count=1 seek=$((offset/bs)) conv=notrunc
patch Anda tepat di dalam.Jawaban:
Ayo kita coba. Berikut ini adalah program C sepele:
Kami akan membangunnya menjadi
test
:Jika kita menjalankannya, ia mencetak "/ usr / tmp".
Mari kita cari tahu di mana "
/usr/tmp
" ada dalam biner:-t d
mencetak offset dalam desimal ke dalam file dari setiap string yang ditemukannya.Sekarang mari kita membuat file sementara hanya dengan "
/tmp\0
" di dalamnya:Jadi sekarang kita memiliki biner, kita tahu di mana string yang ingin kita ubah adalah, dan kita memiliki file dengan string pengganti di dalamnya.
Sekarang kita bisa menggunakan
dd
:Ini membaca data dari
tmp
(/tmp\0
"file " kami ), menulisnya ke dalam biner kami, menggunakan ukuran blok keluaran 1 byte, melompati ke offset yang kami temukan sebelumnya sebelum menulis apa pun, dan secara eksplisit tidak memotong file ketika selesai.Kita dapat menjalankan executable yang ditambal:
String literal yang dicetak oleh program telah diubah, jadi sekarang berisi "
/tmp\0tmp\0
", tetapi fungsi string berhenti segera setelah mereka melihat byte nol pertama. Penambalan ini hanya memungkinkan membuat string lebih pendek atau sama panjang, dan tidak lebih lama, tetapi cukup untuk keperluan ini.Jadi kita tidak hanya dapat menambal menggunakan sesuatu
dd
, kita baru saja melakukannya.sumber
/usr/tmp
string, ganti dengan/tmp
, don lupakan\0
byte trailing , simpan file, dan silangkan jari Anda ". Atau, bahkan lebih baik, skrip shell yang melakukan pengecekan kewarasan terlebih dahulu, lalu menelepondd
. Sayangnya, kebutuhan untuk hal-hal seperti ini sering muncul ketika sepotong tua software oleh vendor sekarang sudah tidak berfungsi hanya memiliki untuk bermigrasi ke sistem baru.sed
Ini tidak baik untuk hal semacam ini - Anda tidak bisa begitu expliciltly dan tepat batassed
's read / write buffer dalam cara Anda mungkin dengandd
- yang merupakan seluruh alasan itu pernah digunakan untuk ini di tempat pertama. Dengandd
Anda dapat secara sewenang-wenang menempatkan jumlah byte yang sewenang-wenang. Ini juga tidak bisa dikatakansed
. Jikadd
digunakan seperti pisau bedah di sini, Anda akan berlakused
seperti bola perusak.Itu tergantung pada apa yang Anda maksud dengan "menambal biner".
Saya mengubah biner menggunakan
dd
kadang - kadang. Tentu saja tidak ada fitur seperti itu didd
dalamnya, tetapi dapat membuka file, dan membaca dan menulis hal-hal di offset tertentu, jadi jika Anda tahu apa yang harus ditulis di mana, voila ada tambalan Anda.Misalnya saya punya biner ini yang berisi beberapa data PNG. Gunakan
binwalk
untuk menemukan offset,dd
untuk mengekstraknya (biasanya binwalk juga mengekstraksi sesuatu tetapi salinan saya buggy), mengeditnya dengangimp
, pastikan file yang diedit berukuran sama atau lebih kecil dari yang asli (mengganti offset bukan sesuatu yang dapat Anda lakukan dengan mudah ), dan kemudian gunakandd
untuk meletakkan gambar yang diubah kembali ke tempatnya.Terkadang saya juga ingin mengganti string dalam binari (seperti path atau nama variabel). Meskipun ini juga bisa dilakukan menggunakan
dd
, lebih mudah untuk melakukannya menggunakansed
. Anda hanya perlu memastikan string yang Anda ganti memiliki panjang yang sama dengan string asli sehingga Anda tidak akhirnya mengganti offset.atau untuk mengambil contoh @ MichaelHomer dengan 0 byte ditambahkan pada:
Tentu saja Anda harus memverifikasi apakah itu benar-benar berfungsi setelahnya.
sumber
sed
file biner yang dapat ditangani dengan baik, yang tampaknya merupakan masalah dengan gnused
, tetapi tidak dengan banyak file lamased
yang hanya bekerja pada file ascii, bingung dengan hal lain (terutama\0
dalam input), dan memiliki batasan panjang garis maksimum.sed
tampaknya dapat mengubah file biner dengan baik tetapi tidak mengerti\x00
dalam string pengganti seperti cara GNUsed
. Ini membutuhkan pengujian tetapi meskipun demikian saya pikir itu layak disebutkan karena jauh lebih sederhana daripadadd
- untuk beberapa kasus. Menambal binari adalah bisnis yang rapuh.