Apakah ada orang di luar sana yang tahu cara brute force nilai pada offset tertentu dalam file? Ini 4 byte berturut-turut yang harus dipaksa paksa. Saya tahu SHA-1 yang benar dari file yang rusak. Jadi, yang ingin saya lakukan adalah membandingkan file SHA-1 yang lengkap, setiap kali ia mengubah nilai byte.
Saya tahu persis 4 byte yang diubah, karena file itu diberikan kepada saya oleh seorang ahli pemulihan data, sebagai tantangan pemulihan. Bagi mereka yang tertarik untuk mengetahui, file rar memiliki 4 byte yang sengaja diubah. Saya diberitahu offset 4 byte yang diubah dan SHA-1 asli. Orang itu mengatakan TIDAK MUNGKIN untuk memulihkan file yang tepat dalam arsip setelah 4 byte diubah. Bahkan jika itu hanya beberapa byte dan Anda tahu persis di mana korupsi itu berada. Karena tidak memiliki catatan pemulihan. Saya mencoba untuk melihat apakah ada cara untuk 4 byte tertentu untuk diisi dengan benar sehingga file akan didekompresi tanpa kesalahan. Ukuran file sekitar 5mb.
contoh :
Saya mengunggah foto sehingga lebih jelas apa yang ingin saya lakukan. Saya percaya seseorang dapat mempostingnya di sini untuk saya dengan lebih banyak perwakilan.
Contoh offset yang saya fokuskan adalah di 0x78
mana gambar pertama menunjukkan nilai karena CA
saya ingin skrip mengambil nilai hingga 1 sehingga menjadi CB
seperti yang ditunjukkan pada gambar kedua. Saya ingin terus meningkatkan nilainya 1
dan kemudian membandingkan seluruh file SHA-1 setiap kali. Hanya membuat perubahan pada 4 byte tersebut pada offset yang ditentukan.
Ini akan mencoba CAC5C58A
dan membandingkan SHA-1. Jika tidak cocok, maka akan mencoba. CBC5C58A
Kemudian setelah nilai pertama mencapai FF
itu kemudian akan pergi ke 00C6C58A
dan seterusnya. Pada dasarnya, saya ingin dapat pergi dari 00000000-FFFFFFFF
tetapi juga memiliki pilihan untuk memilih di mana Anda ingin memulai dan mengakhiri. Saya tahu itu bisa memakan waktu tetapi saya masih ingin mencobanya. Perlu diingat saya tahu offset yang tepat dari byte yang rusak. Saya hanya perlu nilai yang benar.
Jika Anda mencari di Google: "Cara memperbaiki file yang rusak dengan kekerasan" Ada orang yang menulis program Linux. Namun, itu hanya berfungsi terhadap file yang disertakan dengan program. Saya mencari beberapa cara untuk menggunakan proses yang sama dengan file saya.
sumber
Jawaban:
Berikut adalah program Python kecil yang melakukan apa yang Anda uraikan.
UnHanya diuji sebentar ; tolong ping saya jika Anda menemukan kesalahan ketik.The
base
menspesifikasikan di mana untuk mencoba menerapkan empat byte, dan string yang panjang'996873
... adalah representasi hex dari SHA1 diharapkan. Garisfor seq in
... mendefinisikan byte untuk dicoba; dan tentu saja ganti'binaryfile'
dengan jalur ke file yang ingin Anda coba selamatkan.Anda dapat mengganti daftar literal
[[0xCA, 0xC5,
...]]
dengan sesuatu untuk benar-benar mengulang semua nilai yang mungkin tetapi pada dasarnya hanya pengganti untuk sesuatu yang lebih berguna karena saya tidak benar-benar yakin apa yang sebenarnya Anda inginkan di sana.Sesuatu seperti
for seq in itertools.product(range(256), repeat=4)):
akan mengulang semua nilai yang mungkin dari 0 hingga 2 32 -1. (Anda perlu menambahkan diimport itertools
dekat bagian atas itu.) Atau mungkin Anda bisa menambahkan offset; perbarui skrip untuk mengganti yang sekarangfor seq in
dengan yang berikut (di mana lagiimport
harus pergi sebelum program utama);Saya membalik urutan byte sehingga secara alami bertambah dari 0x8AC5C5CA ke 0x8AC5C5CB tapi kemudian kenaikan berikutnya adalah 0x8AC5C5CC dll. Sihirnya
struct
adalah mengonversinya ke urutan byte (harus mencarinya dari https: // stackoverflow. com / a / 26920983/874188 ). Ini akan mulai dari 0x8AC5C5CA dan pergi ke 0xFFFFFFFF, kemudian membungkus ke 0x00000000 dan naik kembali ke 0x8AC5C5C9.Jika Anda memiliki beberapa rentang kandidat yang ingin Anda periksa dalam urutan tertentu, mungkin semacam itu
tapi kemudian Anda harus memastikan diri bahwa (awal, akhir) pasang di
rge
sampul semua ruang antara 0x00000000 dan 0xFFFFFFFF jika Anda benar-benar ingin memeriksa semua itu. (Dan lagi, perhatikan bahwa rentang meningkatkan byte terakhir dan yangseq
menerapkan byte nilai secara terbalik, sesuai dengan persyaratan yang Anda nyatakan.)Jika Anda ingin menggunakan dua
base
alamat yang berbeda , Anda dengan cepat berlari melampaui batas dari apa yang layak dilakukan dalam hidup Anda dengan kekuatan kasar; tetapi Anda dapat, misalnya, membagi angka 4-byte menjadi dua bagian 2-byte dan menerapkannya pada offset yang berbeda.sumber
Tidak, tidak, tidak, dan lagi TIDAK!
Jarang jawaban yang Anda dapatkan bukanlah yang Anda harapkan.
Beberapa pertanyaan untuk Anda:
Terus? ... Waktu.
Intinya adalah Anda harus mengubah sedikit byte ... hanya 4!
Apa artinya? 256 4 yaitu 256x256x256x256 kemungkinan, jumlah yang sangat besar.
Jika komputer Anda dapat memproses 1 operasi per detik (substitusi dalam file + sha1) ...
Anda harus menunggu lebih dari 136 tahun , atau jika Anda lebih suka lebih dari 49710 hari.
Anda cukup beruntung, file pre-cache 5MB (sudah dimuat dalam ram dan cache) hanya meminta sekitar 0,03 detik (min 0,025 detik), pada komputer lama. Itu menyusutkan waktu perkiraan Anda menjadi 1242-1492 hari (lebih dari 3 tahun).
Memang benar, BTW, bahwa secara statistik Anda harus memiliki jawaban positif di separuh waktu . Meskipun demikian Anda harus menunggu sampai Anda akan mencoba semua kemungkinan untuk memastikan bahwa hanya ada 1 subtitusi yang akan memberi Anda checksum SHA-1 yang sama ...
Sekarang IMPOSSIBLE terdengar sebagai "tidak mungkin dalam jumlah waktu yang SANGAT BAIK ".
Bagaimana cara melanjutkan
Sebuah jawaban yang lebih tepat untuk pertanyaan teknis Anda: ketika Anda berbicara tentang kekuatan kasar itu tidak harus menjadi kekuatan kasar buta.
Itu hanya dinyatakan dalam komentar di jawaban lain bahwa Anda tidak perlu menghitung checksum sha1 pada bagian sebelum korupsi. Anda melakukan yang pertama kali dan Anda menghemat waktu untuk setiap iterasi yang berurutan (mungkin faktor 2 tergantung dari posisi).
Sesuatu yang dapat mengubah upaya yang tidak berharga adalah menulis kode paralel yang akan berjalan pada GPU. Jika Anda memiliki kartu grafis yang baik, Anda mungkin memiliki sekitar 1000 core yang dapat dihitung untuk Anda secara paralel (bahkan lebih tetapi mereka memiliki frekuensi lebih rendah dari cpu, tetapi masih banyak). Jika Anda dapat mengurangi waktu dari 1400 menjadi 1,4 hari mungkin Anda bahkan dapat melakukannya.
Sebuah pendekatan yang berbeda dapat membawa Anda ke solusi yang lebih cepat.
Anda bilang itu file rar. The struktur file rar dibagi menjadi blok-blok. Jika Anda menghitungnya, Anda dapat melihat di mana korupsi berada. Jika ada di bagian data, di bagian header atau di keduanya. Maka Anda dapat bertindak secara konsekuen. Demi kesederhanaan mari kita anggap itu atas data:
Anda dapat melakukan brute force dari offset Anda, periksa untuk setiap CRC positif dari blok itu jika itu bahkan positif SHA1 pada seluruh file. Sekali lagi Anda dapat melakukan kode paralel.
Catatan akhir
Jika mereka 6 byte bukannya 4 Anda keluar dari permainan dengan teknologi saat ini.
sumber
;-)
. Cari (jika nvidia)Cuda, brute force, sha1
dan Anda akan memiliki banyak petunjuk, misalnya kode sumber . BTW menjaga perhatian tinggi Anda karena browsing dari google jalan, oh anakku, dapat menyebabkan Anda pada salah satu sisi gelap dari net ...:-)
. (Tidak di github ... di situs lain yang dapat Anda temui dengan jenis penelitian ini). PS> Ada banyak makalah ilmiah tentang topik terkait, misalnya yang ini ...