Làm thế nào tôi có thể lật một bit trong một tập tin?


35

Tôi muốn cố ý làm hỏng một tập tin để kiểm tra các khiếu nại mà btrfs có thể tự chữa lành . Bài báo nói về việc tắt hệ thống tập tin, làm hỏng ảnh bằng cách "lật" một bit và sau đó kể lại. Trong các hệ thống tập tin cũ hơn, điều này sẽ bị hỏng nhưng nó được cho là tự sửa trong btrfs. Về lý thuyết, điều này có ý nghĩa nhưng tôi thực sự muốn kiểm tra nó.

Vấn đề là bài viết không giải thích làm thế nào để làm điều đó.
Làm thế nào tôi có thể thay đổi một bit trong một phần rất cụ thể của hệ thống tập tin?

Tôi cũng nên chỉ ra rằng điều này phải được thực hiện trên một hệ thống tệp ngoại tuyến để btrfs không xem việc viết của tôi là cố ý.

Chỉnh sửa: Mặc dù câu hỏi (và thảo luận) nói rất nhiều về btrfs, tôi muốn biết liệu có phương pháp độc lập hệ thống tập tin nào để thực hiện loại tham nhũng này không (để có thể so sánh giữa các loại / bộ điều khiển RAID / vv khác nhau).


@Dan Ý tôi là nếu tôi chỉnh sửa tệp trực tiếp, btrfs (hoặc bất kỳ hệ thống tệp nào cho vấn đề đó) sẽ tính đó là một ghi hợp lệ. Nó sẽ không cho tham nhũng mà tôi đang tìm kiếm.
Oli

Đây có phải là hệ thống tệp thử nghiệm không (nghĩa là bạn không quan tâm đến nội dung hoặc hoàn toàn ổn với việc khôi phục từ bản sao lưu? Ngoài ra, bạn có đang sử dụng một phân vùng btrfs trên một ổ đĩa hoặc một phân vùng duy nhất trên một mảng RAID , hoặc một số cấu hình khác?
Darth Android

1
Nếu btrfs hỗ trợ đúng ioctls (không chắc là có), bạn có thể sử dụng filefrag -vđể tìm hiểu chính xác vị trí của tệp.
derobert

3
@Oli Tôi nghi ngờ rằng bạn sẽ tìm thấy một đối tượng quan tâm hơn trên U & L, cả về phiếu bầu và về câu trả lời. cộng, này .
strugee

1
Bắn một tia vũ trụ vào đúng chỗ.
smcg

Câu trả lời:


20

Tôi không phải là một chuyên gia, nhưng btrfs-progsgói thực sự bao gồm một công cụ đặc biệt để làm điều này, mặc dù bạn có thể phải xây dựng từ nguồn. Trong mọi trường hợp, một khi bạn đã cài đặt hoặc xây dựng btrfs-progs, bạn sẽ có thể sử dụng công cụ btrfs-corrupt-blockđược các nhà phát triển btrfs sử dụng để kiểm tra hệ thống tập tin.

Bây giờ, như tôi đã nói, tôi không có nhiều thời gian để chơi với btrfs, vì vậy tôi không biết cách sử dụng chính xác của công cụ này. Nhưng với nó, bạn sẽ có thể làm hỏng hệ thống tệp ngoại tuyến, sẽ được sửa khi tệp bị hỏng được đọc (giả sử rằng bạn đã thiết lập RAID hoặc một cái gì đó để có bản sao khác sử dụng).


2
Tìm thấy tuyệt vời! Giả sử rằng btrfs-corrupt-blockthực sự được viết là một thử nghiệm chính hãng và không phải là một "mánh khóe" của các nhà phát triển btrfs, thì điều này sẽ phù hợp với dự luật một cách chính xác.
allquixotic

@allquixotic nếu bạn muốn tìm hiểu thêm về btrfs, có một cuộc nói chuyện tuyệt vời từ linux.conf.au 2012 . như tôi đã nói, btrfs-corrupt-blockđược sử dụng bởi các nhà phát triển, vì vậy nó sẽ không hữu ích nếu đó là một mánh khóe :)
strugee

3
@allquixotic Đó là vẻ đẹp của nguồn mở: bạn có thể xem mã nguồn của btrfs và kiểm tra nó! Chắc chắn, đây sẽ không phải là một nhiệm vụ dễ dàng, nhưng nếu bạn thực sự muốn, bạn có thể làm điều đó.
Bakuriu

@Bakuriu Tôi hoàn toàn ý thức được điều đó. Tôi chưa bao giờ nghi ngờ nghiêm túc rằng đó btrfs-corrupt-blockkhông phải là một thử nghiệm chân thành, vì nó sẽ được phát hiện rất nhanh bởi ai đó chọc vào nguồn và sử dụng làm PR tiêu cực chống lại Oracle (ít nhất là, cũng như bất kỳ nhà phát triển / cộng tác viên btrfs nào khác). Đó chỉ là một bình luận trái chiều.
allquixotic

Tôi tự hỏi nếu OP (@Oli) muốn làm hỏng một khối (nghĩa là cấu trúc hệ thống tệp) hoặc tệp (nghĩa là nội dung của tệp ??) ... Và tôi tin rằng yêu cầu tự phục hồi của btrfs là về cái trước chứ không phải cái sau? [làm thế nào một hệ thống tập tin biết bit nào được lật trong một tập tin? một số loại CRC?]. Câu trả lời này có lẽ ở bên phải, tuy nhiên, vì vậy +1. [nhưng nó có thể thay đổi nhiều hơn một "bit đơn"? hoặc thay đổi thứ gì đó có thể được chữa lành dễ dàng hơn một chút ngẫu nhiên xảy ra "ở bất cứ đâu"?]
Olivier Dulac

16
  1. Lấy giá trị của một cung trên một thiết bị khối (ví dụ /dev/sda1) với phần bù là 1 triệu phần bù (chỉ là một ví dụ):

    sudo dd if=/dev/sda1 of=/root/mysector bs=512 count=1 skip=1M
    

    Tùy chọn bù 1M * 512 byte tùy ý này chỉ để đảm bảo bạn ra khỏi phần siêu dữ liệu của hệ thống tệp và thực sự trên một khu vực có chứa dữ liệu.

  2. Chỉnh sửa dữ liệu khu vực thô bằng cách thay đổi nội dung bằng trình soạn thảo hex. Xem ví dụ Cần một trình soạn thảo hex tốt cho Linux .

  3. Đặt lại khu vực trên ổ đĩa với ifvà các ofđối số đảo ngược:

    sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
    

2
Điều này sẽ không giúp anh ta kiểm tra trừ khi khối 1 triệu thực sự là một phần của tệp. Làm thế nào anh ta có thể tìm kiếm những gì một tập tin cụ thể bắt đầu trên?
Darth Android

3
Đó là hầu hết ở đó. Nếu bạn có thể khóa lệnh dd vào vị trí chính xác của tệp, đây có lẽ là cách tốt nhất để tiếp cận điều này.
Oli

@Oli Vâng, tôi biết cách thực hiện điều đó cho Gia đình hệ thống tập tin Ext, nhưng tôi không có nhiều kinh nghiệm với btrfs. Hãy để tôi xem nếu tôi có thể tìm thấy một cách.
gertvdijk

2
@Oli: bạn có thể chỉ cần có một vòng lặp, xuất ra từng khối theo từng khối (ví dụ như ở trên, nhưng "Skip = N", N ở trong 1..max) cho đến khi bạn có thể grep một dòng từ tệp bạn muốn chỉnh sửa [cố gắng tạo một dòng sẽ không xảy ra ở bất kỳ nơi nào khác ... ví dụ: lấy nó từ một trình tạo mật khẩu, và đủ lâu?]. Sau đó, bạn chỉnh sửa khối cụ thể đó. nhắc lại, kiểm tra xem sự thay đổi đã được hoàn nguyên (mà tôi nghi ngờ, hãy xem nhận xét của tôi trong câu trả lời hàng đầu ... dường như có sự nhầm lẫn giữa dữ liệu tệp (= nội dung) và chính cấu trúc hệ thống tệp (= cách các tệp và nội dung của chúng được tổ chức )?)
Olivier Dulac

16

@Oli - xin chào, tôi là Jim Salter, người thực sự viết bài báo đó. Tôi đã làm việc với một máy ảo, điều này làm cho mọi thứ đơn giản hơn. Những gì tôi đã làm được bắt đầu với một tệp JPEG và mở nó ra trong trình chỉnh sửa hex. Một cái đặc biệt mà tôi đã sử dụng là Bless, mà bạn có thể cài đặt trong Ubuntu với một phước lành cài đặt apt-get đơn giản .

Sau khi mở JPEG trong Bless, tôi đã nhấn trang xuống một vài lần để tìm hiểu kỹ về "thịt" của JPEG, và sau đó chỉ tô sáng khoảng năm mươi byte dữ liệu, và sao chép và dán nó vào trình soạn thảo văn bản (trong tôi trường hợp, gEdit). Điều này đã cho tôi một cái gì đó để tìm kiếm.

Bây giờ tôi đã lưu JPEG vào từng mảng trên VM. Lưu trữ đằng sau các mảng là một loạt các tệp .qcow2. Khi tôi đã lưu JPEG vào các mảng, tôi có thể tải các tệp .qcow2 được liên kết với từng mảng vào Bless và tìm kiếm chúng - chúng không lớn lắm, không là gì ngoài JPEG và một số siêu dữ liệu - cho mẫu năm mươi byte đó Tôi đã tô sáng và sao chép ra khỏi JPEG. Voila, tôi đã có khối để tham nhũng! Tại thời điểm này, tôi chỉ có thể chỉnh sửa thủ công từng byte JPEG được lưu trữ trên đĩa ảo của VM bằng Bless - và quan trọng là làm như vậy theo cách chính xác trên mỗi mảng.

Nếp nhăn duy nhất là trong trường hợp mảng RAID5 được thử nghiệm trong bài viết, tôi phải đảm bảo rằng tôi đã chỉnh sửa bản sao thực sự của dữ liệu trong sọc và không phải là chẵn lẻ cho chính dải đó - đó là một hình ảnh nhỏ trên một mặt khác, mảng trống, do đó, không có bất kỳ dữ liệu nào trong khối FOLLOWING trong dải, làm cho khối chẵn lẻ chứa dữ liệu không bị thay đổi khỏi khối dữ liệu. Nếu tôi vô tình chỉnh sửa khối chẵn lẻ thay vì khối dữ liệu, hình ảnh sẽ hiển thị dưới dạng không thay đổi.

Một lưu ý cuối cùng - bạn KHÔNG CẦN máy ảo để làm điều này - bạn có thể làm những điều tương tự theo cùng một cách với kim loại trần; nó sẽ chỉ là một nỗi đau ở mông vì bạn cần phải làm việc với toàn bộ ổ đĩa thô thay vì với các tệp .qcow2 nhỏ xinh, và bạn sẽ phải kéo các ổ đĩa và đặt chúng vào một máy khác, hoặc khởi động vào một môi trường sống (hoặc chỉ thay thế) để gây rối với chúng. (Tôi đã thử nghiệm khả năng chữa lành dữ liệu của ZFS theo cách này, nhưng trên các máy kim loại thực, cách đây 7 năm khi tôi bắt đầu quan tâm đến các hệ thống tệp thế hệ tiếp theo.)

Hi vọng điêu nay co ich!


4

Bạn có thể thử một chương trình nhỏ sẽ thực hiện trên tệp đã mở.FIBMAP ioctl(2)

Bằng cách tìm kiếm trên web nhanh chóng, tôi đã tìm thấy bài đăng trên blog này http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html chi tiết cách thực hiện việc này - thậm chí nó sẽ cung cấp cho bạn một liên kết đến một chương trình mẫu mà bạn có thể biên dịch và tự chạy.

$ git clone git://kernel.ubuntu.com/cking/debug-code
$ cd debug-code/block-mapper-fibmap
$ make
$ sudo ./fibmap /path/to/your/image-file.jpg

Đây chính xác là cách hdparm --fibmap(được đề cập bởi @falconer) được thực hiện.

Sau khi tìm thấy số khối, bạn có thể sử dụng ddgongfu để sửa đổi tệp, như @gertvdijk đã phác thảo. Hoặc có thể bạn chỉ cần sửa đổi fibmap.cchương trình ở trên để thực hiện thao tác lật bit, ghi trực tiếp vào tệp thiết bị bỏ qua lớp hệ thống tệp (ba tham số cho chương trình: 1. đường dẫn đến tệp, 2. tệp thiết bị chứa tệp hệ thống, 3. bù và bit bạn muốn sửa đổi).

( Tuyên bố miễn trừ trách nhiệm: Tôi chưa kiểm tra và không thể đảm bảo rằng nó FIBMAP ioctl(2)sẽ hoạt động cho một tệp trong thiết bị loopback hoặc hệ thống tệp btrfs, nhưng tôi rất mong đợi nó. Tôi đoán hdparm sẽ kiểm tra loại thiết bị trước khi thực hiện ioctl(2)trên tệp và do đó thất bại.)


3
sudo hdparm --fibmap /PATH/TO/FILE

sẽ cung cấp cho bạn các LBA nơi đặt tệp. Sau này, bạn có thể sử dụng câu trả lời của @gertvdijk.


Thật không may, điều này dường như không hoạt động. Nó phun ra 0,39: device not found in /devNó là bởi vì đó là btrfs hoặc (nhiều khả năng hơn) bởi vì tôi đang sử dụng nó trên các tệp được giữ lại. Tôi sẽ thử và hoàn thành việc này với một VM "phù hợp".
Oli

@Oli Hmm. Tôi nghĩ rằng nó hdparmhoạt động trên mọi hệ thống tập tin nhưng có lẽ nó không phải như vậy.
chim ưng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.