2011-09-26 15 views
8

Tôi có một số tập tin perl đã được "tẩy trắng" (không biết nếu nó là từ ACME :: Bleach, hoặc một cái gì đó tương tự). Không phải là rất thông thạo trong perl, tôi muốn hiểu những gì một lót mà bắt đầu tập làm để giải mã các khoảng trắng mà sau:Dòng perl này từ tệp "tẩy trắng" làm gì?

$_=<<'';y;\r\n;;d;$_=pack'b*',$_;$_=eval;[email protected]&&[email protected];$_ 

Phần còn lại của tập tin là ký tự khoảng trắng, và các tập tin là thực thi bởi chính nó (nó được đặt trong thư mục/bin).

[Giải pháp], nhờ @JB.

Phần pack điều này có vẻ phức tạp nhất và tôi mất một lúc để nhận thấy những gì đang diễn ra. Gói đang sử dụng LSB chỉ trong mỗi 8 ký tự và giải nén nó dưới dạng ký tự lớn trong nhị phân. Vì vậy, các tab trở thành '0' và dấu cách trở thành '1'.

'\t\t \t ' => '#' 
in binary: 
    00001001 00001001 00100000 00100000 00100000 00001001 00100000 0100000 
every LSB: 
    1 1 0 0 0 1 0 0 
convert from from big-endian format: 
    0b00100011 == 35 == ord('#') 

Trả lời

10
  • $_ = << ''; đọc phần còn lại của tập tin vào accumulator.
  • y;\r\n;;d; dải trả về vận chuyển và nguồn cấp dữ liệu đường kẻ.
  • $_ = pack 'b*', $_; chuyển đổi ký tự thành bit theo số $_, trước tiên là LSB.
  • $_ = eval; thực hiện $_ làm mã Perl.
  • [email protected] && die [email protected]; $_ xử lý ngoại lệ và mã trả về một cách duyên dáng.
+0

OK, tôi nghĩ rằng đó là chức năng 'gói' đang vấp ngã tôi. Bạn có thể làm rõ một cái gì đó như ''\ t \ t \ t'' dịch thành ''#'' không? – JimB

+0

Xin lỗi, có vẻ như các ký tự thô vẫn có dấu cách bị thu hẹp, chuỗi đó phải là tab tab sp sp sp sp sp sp. – JimB

+0

'tab' là' chr (9) ', lẻ; 'sp' là' chr (32) ', thậm chí. Vì vậy, chuỗi của bạn dịch sang bit chuỗi 1, 1, 0, 0, 0, 1, 0, 0, 0, mà (LSB đầu tiên) là 0x23, mã ASCII cho ''#''. (bạn có thêm một chút) –

3

Bạn có thể sử dụng unbleach.pl để xóa tẩy trắng, nếu đó là những gì bạn thực sự đang cố gắng thực hiện.

+2

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp để tham khảo. Nó cũng bảo vệ chống lại thối liên kết. –

+0

@ 0A0D, Tốt, đã sửa. Tôi nghĩ rằng nó đã đi mà không nói trong trường hợp này. – ikegami

+0

Bạn đang bị bỏ phiếu xuống bc Tôi không bao giờ hỏi làm thế nào để unbleach các tập tin (cộng với unbleach.pl sẽ không làm việc trực tiếp trên các tập tin mà không cần một số tinh chỉnh). Tôi đã nói rằng tôi muốn tìm hiểu cách dòng perl bắt đầu mỗi tệp hoạt động. – JimB