2009-12-19 14 views
7

hệ điều hành MacOS 10,6, nếu tôi có một tập tin "unwanted.c", trong đó có:Làm thế nào để thực sự lột một nhị phân trong hệ điều hành MacOS

class secret_thing { 
public: 
secret_thing() {} 
void revealing_method_name() {} 
}; 

main() 
{ 
    secret_thing obj; 
    obj.revealing_method_name(); 
} 

Bây giờ tôi làm:

$ g++ unwanted.c -o unwanted 
$ strip unwanted 
$ nm unwanted | grep secret 
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv 
0000000100000eae T __ZN12secret_thingC1Ev 

Nếu tôi chia ra giao diện và thực hiện lớp bí mật, như hầu hết mọi người làm khi viết mã C++, thì không có biểu tượng không mong muốn nào trong tệp thực thi bị tước bỏ. Đáng buồn thay, tôi đã đưa ra một cơ sở mã hiện có của hàng ngàn dòng mã và đây không phải là một trong những lựa chọn của tôi.

Tôi đã thử -fno-rtti, như một dự đoán hoang dã và điều đó không khắc phục được gì. Tôi đã cầu nguyện với các vị thần của Google và tìm thấy nhiều tài liệu tham khảo cho các câu lạc bộ thoát y, nhưng không có liên kết hữu ích. Tôi đã lướt qua các trang của người đàn ông cho dải, g ++, và ld trên mac, và không có những điều rõ ràng để thử, mặc dù cụm từ "private externs" là hấp dẫn, tôi không thể tìm ra những gì để làm về điều đó.

[cập nhật] Đáng buồn thay, hóa ra là một vấn đề với nỗ lực của tôi để tạo một ví dụ nhỏ. Đây là một ví dụ phức tạp hơn, gần hơn với vấn đề thực sự là gì, mà vẫn còn có những biểu tượng không mong muốn nếu nó được xây dựng tối ưu.

Tôi xin lỗi vì những ví dụ xấu. Hóa ra khó có thể tìm ra vấn đề thực tế nhỏ nhất. Rất cám ơn câu trả lời, mặc dù, mỗi câu trả lời đẩy tôi đến gần một giải pháp.

class base { 
public: 
    virtual int revealing_method_name() = 0; 
    virtual ~base() {}; 
}; 

class secret_thing : public base { 
public: 
    int revealing_method_name() { return 0; }; 
}; 

class other_thing : public base { 
public: 
    int revealing_method_name() { return 1; }; 
}; 

int main(int argc, char**) 
{ 
    base *object = 0; 
    if(argc > 1) object = new secret_thing; 
    else object = new other_thing; 

    return object->revealing_method_name(); 
} 

Trả lời

8

Sử dụng dòng biên dịch sau tôi dải thành những biểu tượng từ các thực thi:

$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp 
$ strip executable 

Với tệp mẫu mới nhất, điều này kết quả bằng:

$ nm executable 
       U __ZTVN10__cxxabiv117__class_type_infoE 
       U __ZTVN10__cxxabiv120__si_class_type_infoE 
       U __ZdlPv 
       U __Znwm 
       U ___cxa_pure_virtual 
       U ___gxx_personality_v0 
0000000100000000 A __mh_execute_header 
       U _exit 
       U dyld_stub_binder 
1

Điều này dường như làm việc như mong muốn ...:

$ strip unwanted 
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove 
$ strip -R /tmp/remove unwanted 
+0

Tôi đã đăng sai mã. Với mã ví dụ chính xác, như câu hỏi bây giờ đọc, với việc thực hiện cho các phương thức INSIDE định nghĩa lớp, dải cho biết: dải: biểu tượng được tham chiếu bởi các mục bảng biểu tượng gián tiếp không thể bị tước trong:/Users/michael. đồ chơi/không mong muốn __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy

+0

tuy nhiên câu trả lời là khá hữu ích, vì nó cho tôi thêm google thức ăn, chuỗi lỗi đó tiết lộ một số lĩnh vực điều tra thú vị hơn. – mtoy

1

Với mã ví dụ bạn đã đăng, thêm kết quả tối ưu hóa cờ '-O' trong những biểu tượng không được hiển thị bởi nm sau khi biên dịch.

+0

Đã đăng một ví dụ gần giống với vấn đề thực tế hơn mà vẫn hiển thị sự cố. Ứng dụng ban đầu giúp tôi đến thời điểm này được xây dựng tối ưu. Cảm ơn vi đa trả lơi. – mtoy

2

Có vẻ như những gì bạn thực sự muốn không phải là loại bỏ tệp thực thi, mà là làm xáo trộn bảng biểu tượng của nó. Tôi không chắc chắn, nhưng có lẽ một cái gì đó như this sẽ hữu ích. Ít nhất, "biểu tượng C++ bảng obfuscator" có lẽ là một chuỗi tìm kiếm của Google tốt hơn ..

+0

Tôi thực sự muốn thực thi. Tuy nhiên, điều này có thể đi trong máy tính xách tay dưới tiêu đề "giải pháp sao lưu tôi hy vọng tôi không bao giờ cần phải thực hiện". Nó đi ngay trên "viết bộ xử lý bài viết của riêng tôi liên kết những gì đã từng được hủy liên kết mà cần những biểu tượng đó và sau đó cắt các biểu tượng" – mtoy