Trong hai vấn đề cuối cùng, chúng tôi giới thiệu đang làm hoang mang và đi sâu vào cấu trúc dữ liệu làm hoang mang. Trong vấn đề này chúng ta nhìn vào kiểm soát rối, một lớp học của các kỹ thuật hoang mang mà mục tiêu kiểm soát dòng chảy trong một chương trình Mã Obfuscation trong hai vấn đề cuối cùng, chúng tôi giới thiệu đang làm hoang mang và đi sâu vào cấu trúc dữ liệu làm hoang mang. Trong vấn đề này chúng ta nhìn vào kiểm soát rối, một lớp học của các kỹ thuật hoang mang mà mục tiêu kiểm soát dòng chảy trong một chương trình. Những biến đổi phá vỡ tính liên quan một cách hợp lý hoặc hợp nhất một cách hợp lý những người không liên quan, ngẫu nhiên thứ tự của các tính toán, chèn các tính toán mới hoặc không liên quan. Trước khi chúng ta nhìn vào các phương pháp điều khiển khác nhau gây rối, để chúng tôi hiểu khái niệm về một vị ngữ - một thuật ngữ sẽ được sử dụng rất nhiều trong các trang này. Một vị là một chức năng hoặc điều kiện để đánh giá đúng hay sai. Các vị từ có nguồn gốc từ các câu lệnh điều kiện trong chương trình, cũng như từ kiểm tra an toàn thời gian chạy ngầm. PT là một vị từ đó sẽ luôn luôn đánh giá đúng, PF là một vị từ đó sẽ luôn luôn đánh giá sai và P? là một vị mà đôi khi sẽ đánh giá đúng sự thật và đôi khi để sai. Một vị là đục nếu giá trị của nó được biết đến obfuscator nhưng rất khó để xác định cho một deobfuscator. Do đó các vị từ đục là hữu ích cho việc làm hoang mang. Chèn Dead or Mã không liên quan Sự phức tạp của mã phụ thuộc vào số lượng các vị từ nó chứa. Chúng tôi có thể chèn một PT vị tách một khối vào một nửa. Các vị là mã không thích hợp vì nó luôn luôn đánh giá đúng sự thật, nhưng nó làm tăng sự phức tạp. (Trong sơ đồ dưới đây, S1, S2, vv là báo cáo rằng chúng tôi xáo trộn bằng cách điều khiển luồng điều khiển.) Hình 1 Tương tự như vậy, chúng ta có thể chia nhỏ một khối thành hai phần, và hai phiên bản khác nhau của một phần có thể được tạo ra mà thực hiện các chức năng tương tự nhưng Thực tế đó là không rõ ràng để các kỹ sư ngược lại. Một vị P? có thể được dùng để chọn giữa hai người. Hình 2 biến thể khác là đặt một khối lỗi của mã nhưng đảm bảo nó không được gọi bằng cách sử dụng một PT vị. Hình 3 Thêm Redundant Phép toán Hình 4 toán hạng Redundant có thể được thêm vào số học biểu thức để làm cho chúng phức tạp hơn. Kỹ thuật này, tuy nhiên, ảnh hưởng đến hiệu suất của chương trình kể từ khi chúng tôi đang giới thiệu chế biến thêm vì những hoạt động mới. Di chuyển các cuộc gọi thư viện phổ biến và trình Idioms chức năng thư viện tiêu chuẩn cũng được biết đến và vì vậy các cuộc gọi để họ làm cho mã dễ dàng để đảo ngược kỹ sư. Để chống lại điều này, phiên bản làm rắc rối của các thư viện chuẩn có thể được sử dụng. Trong trường hợp này có sự gia tăng trong chi phí về kích thước chương trình. Tương tự như vậy, mô hình lập trình phổ biến hay thành ngữ đó xảy ra thường xuyên trong một ngôn ngữ cụ thể làm cho mã dễ dàng hơn để đảo ngược kỹ sư. Ví dụ, Java không có một lớp học tiêu chuẩn cung cấp danh sách liên kết. Vì vậy, hầu hết các lập trình trong Java thực hiện bằng cách sử dụng danh sách liên kết một lĩnh vực kế tiếp. Sự lặp lại máng một danh sách như vậy là một mô hình phổ biến mà có thể dễ dàng xác định. Một giải pháp này là để thay thế mô hình như vậy phổ biến với những người ít được biết đến. Khử mã không khử mềm ăn cắp công việc bằng cách chuyển đổi các mã máy trở lại mã nguồn. Nếu một biến đổi là ngôn ngữ phá nếu nó giới thiệu các đoạn mã trong ngôn ngữ máy mà không có ngôn ngữ nguồn tương đương, ví dụ như câu lệnh goto, đó là một lệnh hợp lệ trong Java bytecode nhưng không có một đối tác trong ngôn ngữ Java. Parallelize mã tăng song song trong các mã làm cho nó khó khăn hơn để tôn sư như nó ẩn luồng thực sự kiểm soát. Chúng ta có thể tạo ra các quy trình dummy mà không thực hiện công việc hữu ích và chạy chúng song song với việc hướng dẫn thực tế. Hình 5 Chúng tôi cũng có thể chia một phần tuần tự của ứng dụng vào nhiều phần thi song song. Một khối mã mà không có bất kỳ phụ thuộc dữ liệu có thể dễ dàng được song song. Hình 6 Một khối mã đó có phụ thuộc dữ liệu có thể được song song bằng cách sử dụng chức năng đồng bộ hóa. Hình 7 parallelizing có thể có một thời gian trên không đáng kể liên quan để đảm bảo các chủ đề song song là đúng đồng bộ để các chức năng chương trình vẫn không thay đổi. Tuy nhiên, khả năng phục hồi và tiềm năng của phương pháp này là rất cao như giới thiệu những con đường song song làm phân tích khó khăn cho cả một chương trình deobfuscator cũng như một kỹ sư ngược lại. Inline và Outline Phương pháp nội tuyến là một quá trình trong đó các cuộc gọi phương pháp được thay thế bằng thực tế cơ thể của phương pháp. Nó được sử dụng truyền thống như là một kỹ thuật tối ưu hóa mã vì nó loại bỏ các chi phí của cuộc gọi. Đề cương là quá trình ngược của biến một tập các câu lệnh thành một phương pháp. Đây có thể được sử dụng như là các kỹ thuật hoang mang. Nội tuyến là rất kiên cường vì nếu một cuộc gọi chức năng được thay thế với các cơ quan chức năng và các chức năng được loại bỏ, các cấu trúc ban đầu có thể không được truy trở lại. Cương có thể được kết hợp với nội tuyến để tăng sự nhầm lẫn. Ví dụ, giả sử chúng ta có hai chức năng P và Q được gọi là một sau khi khác. Họ có thể được inlined tại địa điểm gọi điện thoại và loại bỏ khỏi các mã. Sau này, phần cuối của mã P và phần đầu của mã Q có thể được vạch ra vào một chức năng không có thật R. Interleave Phương pháp Nếu có nhiều phương pháp được dệt lại với nhau thành một, nó có thể làm cho chương trình khó hiểu hoặc đảo ngược. Toàn bộ mã xuất hiện để được kết nối, trong khi đó có thực sự là không có tương quan. Hình 8 Clone Phương pháp Chúng ta có thể hiểu được một chức năng tốt hơn bằng cách nhìn vào những nơi khác nhau, trong đó nó được gọi. Các kỹ thuật nhân bản vô tính sẽ cố gắng để che giấu thông tin này bằng cách tạo ra nhiều phiên bản (bản sao) của hàm có dạng khác nhau nhưng có cùng chức năng và kêu gọi các phiên bản khác nhau ở những nơi khác nhau, làm cho nó xuất hiện như là nếu các chức năng khác nhau được gọi là. Mở rộng vòng Condition Confusion có thể được bổ sung bằng cách làm cho vòng lặp điều kiện phức tạp hơn. An PT ngữ thêm hoặc PF được sử dụng, mà không ảnh hưởng đến số lần vòng lặp thực hiện. Trong ví dụ này, chúng tôi đã thêm vị luôn luôn đánh giá là True kể từ x2 (x + 1) 2 mod 4 = 0. Hình 9 đảo ngược vòng lặp phản Trật tự của một vòng lặp có thể được thay đổi cho ví dụ bằng cách làm cho nó bị thụt lùi. Đây là một chuyển đổi, hiệu lực thấp đơn giản vì nó không thêm quá nhiều rắc rối. Vòng Transformations Vòng biến đổi ban đầu được thiết kế để tối ưu hóa hiệu suất, nhưng một số trong số đó là kỹ thuật obfuscation hữu ích cũng kể từ khi họ thay đổi cấu trúc của một chương trình. Chúng ta hãy xem xét một vài ví dụ. Vòng unrolling tái tạo cơ thể của một vòng lặp nhiều lần và do đó làm giảm số lần nó được gọi. Hình 10 Vòng phân hạch chuyển đổi một vòng lặp thành phần thành nhiều vòng. Hình 11 Báo cáo Reorder và những biểu hiện báo cáo Lập lại trật tự và biểu thức là một kỹ thuật hiệu lực thấp, mặc dù khả năng phục hồi của nó là cao vì nó là khó khăn để đặt lại các báo cáo theo thứ tự ban đầu. Hiệu quả như một kỹ thuật gây rối có thể được tăng lên bằng cách kết hợp nó với các phương pháp khác như nội tuyến-phác thảo, hoặc bằng cách sắp xếp lại các biểu hiện ở mức độ bytecode để nó phá vỡ các liên kết giữa các bytecode và nguồn. Bảng Giải thích này là một trong những nhất hiệu quả cũng như biến đổi tốn kém. Một phần của bytecode được chuyển đổi thành một mã máy ảo khác nhau. Mã mới này sau đó được thực hiện bởi một thông dịch máy ảo bao gồm với các ứng dụng khó hiểu. Một ứng dụng đặc biệt có thể chứa một số thông dịch viên để thực hiện các phần khác nhau của ứng dụng khó hiểu. Do chi phí cao về tốc độ xử lý, chuyển đổi này chỉ nên dành cho các phần của mã mà tạo nên một phần nhỏ của thời gian chạy tổng hoặc cần một mức độ rất cao của bảo vệ.
đang được dịch, vui lòng đợi..
