In the last two issues we introduced code obfuscation and went in-dept dịch - In the last two issues we introduced code obfuscation and went in-dept Việt làm thế nào để nói

In the last two issues we introduce

In the last two issues we introduced code obfuscation and went in-depth into data structure obfuscation. In this issue we look at control obfuscation, a class of obfuscation techniques that targets the control flow in a program


Code Obfuscation
In the last two issues we introduced code obfuscation and went in-depth into data structure obfuscation. In this issue we look at control obfuscation, a class of obfuscation techniques that targets the control flow in a program. These transformations break up logically related computations or merge logically unrelated ones, randomize the order of computations, insert new or irrelevant computations. Before we look at different methods of control obfuscation, let us understand the concept of a predicate – a term that will be used a lot in these pages. A predicate is a function or condition that evaluates to true or false. Predicates are derived from the conditional statements in a program, as well as from implicit run-time safety checks. PT is a predicate that will always evaluate to true, PF is a predicate that will always evaluate to false and P? is a predicate that will sometimes evaluate to true and sometimes to false. A predicate is opaque if its value is known to the obfuscator but is difficult to determine for a deobfuscator. Hence opaque predicates are useful for obfuscation.

Insert Dead or Irrelevant Code
The complexity of code depends on the number of predicates it contains. We can insert a predicate PT that splits a block into half. The predicate is irrelevant code since it always evaluates to true, but it increases the complexity. (In the diagram below, S1, S2 etc are statements that we obfuscate by manipulating control flows.)

Figure 1
Similarly, we can split a block into two parts, and two different versions of one part can be created which perform the same function but that fact is not obvious to the reverse engineer. A predicate P? can be used to select between the two.

Figure 2
Another variation is to insert a buggy block of code but ensure it is not called by using a predicate PT.

Figure 3
Add Redundant Operands
Figure 4
Redundant operands can be added to arithmetic expressions to make them more complex. This technique, however, affects the performance of the program since we are introducing extra processing because of the new operations.

Remove common library calls and Programming Idioms
Standard library functions are well known and so calls to them make code easy to reverse engineer. To counter this, obfuscated versions of the standard libraries can be used. In this case there is an increase in cost in terms of program size. Similarly, common programming patterns or idioms that occur frequently in a particular language make code easier to reverse engineer. For example, Java does not have a standard class that provides linked list. So, most programmers in Java implement linked lists using a next field. Iteration trough such a list is a common pattern that can be easily identified. A solution to this is to replace such common patterns with lesser known ones.

Reducible to Non-reducible code
Decompilers work by converting the machine code back into source code. If a transformation is language-breaking if it introduces code segments in machine language that have no source language equivalent, e.g. the goto statement, which is a valid instruction in Java bytecode but doesn’t have a counterpart in Java language.

Parallelize Code
Increasing parallelism in the code makes it more difficult to revere engineer as it hides the actual flow of control. We could create dummy processes that perform no useful task and run them in parallel with the actual instructions.

Figure 5
We could also split a sequential section of the application into multiple sections executing in parallel. A code block that does not have any data dependencies can easily be parallelized.

Figure 6
A code block that has data dependencies can be parallelized by using synchronization functions.

Figure 7
Parallelizing can have a considerable time overhead associated for making sure the parallel threads are properly synchronized so that the program functionality stays unchanged. However, the resilience and potency of this method is very high as the introduction of parallel paths makes analysis difficult both for a deobfuscator program as well as a reverse engineer.

Inline and Outline Methods
Inlining is a process in which method calls are replaced by the actual body of the method. It is used traditionally as a code optimization technique since it removes the overhead of the call. Outlining is the reverse process of turning a set of statements into a method. These can be used as obfuscation techniques. Inlining is highly resilient since if a function call is replaced with the function body and the function is removed, the original structure cannot be traced back.
Outlining can be paired with inlining to increase the confusion. For example, suppose we have two functions P and Q called one after the other. They can be inlined at the calling location and removed from the code. Following this, the end of P’s code and the beginning of Q’s code can be outlined into a bogus function R.

Interleave Methods
If multiple methods are woven together into one, it can make the program difficult to understand or reverse engineer. The entire code appears to be connected, whereas there was actually no correlation.

Figure 8
Clone Methods
We can understand a function better by looking at the different places in which it is called. The cloning technique tries to hide this information by creating multiple versions (clones) of the function that look different but have the same functionality and calling the different versions at different places, making it appear as if different functions are being called.

Extend Loop Condition
Confusion can be added by making loop conditions more complex. An extra predicate PT or PF is used, that does not affect the number of times the loop executes.
In this example the predicate we have added always evaluates to True since x2(x+1)2 mod 4 = 0.

Figure 9
Reverse the Loop counter
The ordering of a loop can be changed for example by making it go backward. This is a simple low-potency transformation since it does not add too much confusion.

Loop Transformations
Loop transformations were originally designed for performance optimization, but some of them are useful obfuscation techniques as well since they change the structure of a program. Let us look at a couple of examples.
Loop unrolling replicates the body of a loop multiple times and hence reduces the number of times it is called.

Figure 10
Loop fission converts a compound loop into multiple loops.

Figure 11
Reorder Statements and Expressions
Reordering statements and expressions is a low potency technique, though its resilience is high since it is difficult to put back the statements in the original order. The effectiveness as an obfuscation technique can be increased by combining it with other methods like inlining-outlining, or by reordering the expressions at a bytecode level so that it breaks the link between the bytecode and the source.

Table Interpretation
This is one of the most effective as well as expensive transformations. A section of the bytecode is converted into a different virtual machine code. This new code is then executed by a virtual machine interpreter included with the obfuscated application. A particular application can contain several interpreters for executing different sections of the obfuscated application. Due to the high cost in terms of processing speed, this transformation should be reserved for sections of code that make up a small part of the total runtime or which need a very high level of protection.
0/5000
Từ: -
Sang: -
Kết quả (Việt) 1: [Sao chép]
Sao chép!
Ở cuối hai vấn đề, chúng tôi giới thiệu mã obfuscation và đi sâu vào dữ liệu cấu trúc obfuscation. Trong vấn đề này, chúng tôi xem xét kiểm soát obfuscation, một lớp kỹ thuật obfuscation nhắm mục tiêu dòng điều khiển trong một chương trìnhMã ObfuscationỞ cuối hai vấn đề, chúng tôi giới thiệu mã obfuscation và đi sâu vào dữ liệu cấu trúc obfuscation. Trong vấn đề này, chúng tôi xem xét kiểm soát obfuscation, một lớp kỹ thuật obfuscation nhắm mục tiêu dòng điều khiển trong một chương trình. Những biến đổi chia một cách hợp lý có liên quan tính toán hoặc hợp nhất những người hợp lý không liên quan, chọn ngẫu nhiên để tính toán, chèn tính toán mới hoặc không thích hợp. Trước khi chúng tôi xem xét các phương pháp khác nhau của kiểm soát obfuscation, cho chúng tôi hiểu các khái niệm về một vị ngữ-một thuật ngữ đó sẽ sử dụng rất nhiều trong các trang này. Một vị ngữ là một chức năng hoặc tình trạng đánh giá đúng hay sai. Predicates có nguồn gốc từ những điều khoản có điều kiện trong một chương trình, cũng như từ tiềm ẩn thời gian chạy an toàn kiểm tra. PT là một vị ngữ sẽ luôn luôn đánh giá thành true, PF là một vị ngữ sẽ luôn luôn đánh giá sai và P? là một vị ngữ sẽ đôi khi đánh giá đúng sự thật và đôi khi sai. Một vị ngữ là đục nếu giá trị của nó được biết là obfuscator nhưng là khó khăn để xác định cho một deobfuscator. Do đó đục predicates là hữu ích cho obfuscation.Chèn mã chết hoặc không thích hợpSự phức tạp của mã phụ thuộc vào số lượng các predicates nó chứa. Chúng tôi có thể chèn một vị ngữ PT mà chia tách một khối vào một nửa. Vị ngữ là mã không thích hợp vì nó luôn luôn đánh giá đúng, nhưng nó làm tăng sự phức tạp. (Trong biểu đồ dưới đây, S1, S2 vv là báo cáo mà chúng tôi làm thành tối tăm bởi thao tác kiểm soát dòng chảy.)Hình 1Tương tự như vậy, chúng tôi có thể chia 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 mà thực tế là không rõ ràng để đảo ngược kỹ sư. Một vị ngữ P? có thể được sử dụng để lựa chọn giữa hai.Hình 2Một biến thể là chèn một khối mã lỗi nhưng đảm bảo nó không được gọi là bằng cách sử dụng một vị ngữ PT.Hình 3Thêm dự phòng OperandsHình 4Operands dự phòng có thể được thêm vào các biểu thức số học để làm cho họ 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 phụ xử lý vì các hoạt động mới.Loại bỏ phổ biến các thư viện cuộc gọi và các lập trình thành ngữChức năng tiêu chuẩn thư viện đang nổi tiếng và vì vậy các cuộc gọi để họ làm cho mã dễ dàng để đảo ngược kỹ sư. Để truy cập này, obfuscated Phiên bản của các thư viện tiêu chuẩn có thể được sử dụng. Trong trường hợp này, đó là sự gia tăng các chi phí trong điều khoản của chương trình kích thước. Tương tự như vậy, mô hình lập trình phổ biến hoặc 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 liên kết danh sách. Vì vậy, hầu hết các lập trình viên trong Java thực hiện liên kết danh sách bằng cách sử dụng một lĩnh vực kế tiếp. Máng lặp đi lặp lại các 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 cho điều này là để thay thế các mô hình phổ biến với những người ít được biết đến.Reducible để reducible phòng không mãDecompilers làm việc bằng cách chuyển đổi mã máy trở lại vào mã nguồn. Nếu một biến đổi ngôn ngữ-phá vỡ nếu nó giới thiệu mã phân đoạn trong ngôn ngữ máy mà có không có ngôn ngữ nguồn tương đương, ví dụ như có tuyên bố goto, trong đó là một hướng dẫn 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 xử lý song song trong mã làm cho nó khó khăn hơn để revere kỹ sư như nó ẩn dòng chảy thực tế kiểm soát. Chúng tôi có thể tạo ra quá trình giả thực hiện không có nhiệm vụ hữu ích và chạy song song với các hướng dẫn thực tế.Hình 5Chúng tôi cũng có thể chia ra đoạn tuần tự của ứng dụng thành nhiều phần thực hiện song song. Một khối mã mà không có bất kỳ dữ liệu quan hệ phụ thuộc có thể dễ dàng được parallelized.Hình 6Một khối mã có dữ liệu phụ thuộc có thể được parallelized bằng cách sử dụng chức năng đồng bộ hóa.Hình 7Parallelizing có thể có một thời gian đáng kể chi phí liên quan để đảm bảo rằng các chủ đề song song đúng cách đồng bộ hoá để cho các chức năng chương trình vẫn không thay đổi. Tuy nhiên, khả năng đàn hồi và tiềm năng của phương pháp này là rất cao như sự ra đời của những con đường song song làm cho phân tích khó khăn cả cho một chương trình deobfuscator cũng như một kỹ sư đảo ngược.Nội tuyến và phác thảo phương phápInlining là một quá trình trong phương pháp mà các cuộc gọi được thay thế bằng cơ thể thực tế của phương pháp. Nó được sử dụng theo truyền thống như là một kỹ thuật tối ưu hóa mã kể từ khi nó loại bỏ chi phí của cuộc gọi. Phác thảo là đảo ngược quá trình quay bộ báo cáo vào một phương pháp. Chúng có thể được sử dụng như là kỹ thuật obfuscation. Inlining là rất đàn hồi vì nếu một chức năng gọi thay thế với chức năng cơ thể và các chức năng được lấy ra, cấu trúc nguyên bản không thể được ngược trở lại.Phác thảo có thể được kết hợp với inlining để tăng sự nhầm lẫn. Ví dụ, giả sử chúng tôi có hai chức năng P và Q gọi là một sau khi khác. Họ có thể được inlined tại vị trí gọi và loại bỏ từ các mã. Sau đó, vào cuối của P mã và bắt đầu của Q mã có thể được nêu ra vào một chức năng không có thật R.Interleave phương phápNếu nhiều phương pháp được dệt với nhau thành một, nó có thể làm cho chương trình khó khăn để hiểu hoặc đảo ngược kỹ sư. Toàn bộ mã xuất hiện để được kết nối, trong khi có thực sự là không có sự tương quan.Hình 8Sao chép các phương phápChúng tôi có thể hiểu một hoạt độ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 là. Kỹ thuật nhân bản cố gắng để ẩn thông tin này bằng cách tạo nhiều phiên bản (bắt chước) của các chức năng mà nhìn khác nhau nhưng có chức năng tương tự và kêu gọi các phiên bản khác nhau tại các địa điểm khác nhau, làm cho nó xuất hiện như nếu chức năng khác nhau đang được gọi là.Mở rộng vòng lặp tình trạngSự nhầm lẫn có thể được thêm bằng cách vòng điều kiện phức tạp hơn. Một vị ngữ phụ PT hoặc PF được sử dụng, mà không ảnh hưởng đến số lần thực hiện một vòng lặp.Trong ví dụ này vị ngữ chúng tôi đã thêm luôn luôn đánh giá thành True từ x 2(x+1) 2 mod 4 = 0.Hình 9Đảo ngược truy cập LoopĐặt hàng một vòng lặp có thể được thay đổi ví dụ bằng cách làm cho nó đi lạc hậu. Đây là một biến đổi tiềm năng thấp đơn giản vì nó không có thêm quá nhiều rắc rối.Biến đổi vòng lặpBiến đổi vòng lặp được thiết kế cho hiệu suất tối ưu hóa, nhưng một số người trong số họ là hữu ích obfuscation kỹ thuật là tốt kể từ khi họ thay đổi cấu trúc của một chương trình. Chúng ta hãy nhìn vào một số ví dụ.Loop co 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 là.Hình 10Phân hạch Loop chuyển đổi một vòng lặp hợp chất vào nhiều vòng.Hình 11Sắp xếp lại các báo cáo và biểu hiệnSắp xếp lại các báo cáo và biểu hiện là một kỹ thuật tiềm năng thấp, mặc dù khả năng đàn hồi của nó là cao vì nó là khó khăn để đưa trở lại những điều khoản theo thứ tự ban đầu. Hiệu quả như là một kỹ thuật obfuscation 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ư inlining 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 do đó nó phá vỡ liên kết giữa bytecode và nguồn gốc.Bảng giải thíchĐây là một biến đổi hiệu quả cũng như đắt tiền nhất. Một phần của bytecode được chuyển 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 viên máy ảo bao gồm trong các ứng dụng obfuscated. Một ứng dụng cụ thể 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 obfuscated. Do chi phí cao về tốc độ xử lý, chuyển đổi này nên được dành riêng cho các phần của mã tạo nên một phần nhỏ của thời gian tất cả hoặc mà cần một mức độ rất cao của bảo vệ.
đang được dịch, vui lòng đợi..
Kết quả (Việt) 2:[Sao chép]
Sao chép!
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..
 
Các ngôn ngữ khác
Hỗ trợ công cụ dịch thuật: Albania, Amharic, Anh, Armenia, Azerbaijan, Ba Lan, Ba Tư, Bantu, Basque, Belarus, Bengal, Bosnia, Bulgaria, Bồ Đào Nha, Catalan, Cebuano, Chichewa, Corsi, Creole (Haiti), Croatia, Do Thái, Estonia, Filipino, Frisia, Gael Scotland, Galicia, George, Gujarat, Hausa, Hawaii, Hindi, Hmong, Hungary, Hy Lạp, Hà Lan, Hà Lan (Nam Phi), Hàn, Iceland, Igbo, Ireland, Java, Kannada, Kazakh, Khmer, Kinyarwanda, Klingon, Kurd, Kyrgyz, Latinh, Latvia, Litva, Luxembourg, Lào, Macedonia, Malagasy, Malayalam, Malta, Maori, Marathi, Myanmar, Mã Lai, Mông Cổ, Na Uy, Nepal, Nga, Nhật, Odia (Oriya), Pashto, Pháp, Phát hiện ngôn ngữ, Phần Lan, Punjab, Quốc tế ngữ, Rumani, Samoa, Serbia, Sesotho, Shona, Sindhi, Sinhala, Slovak, Slovenia, Somali, Sunda, Swahili, Séc, Tajik, Tamil, Tatar, Telugu, Thái, Thổ Nhĩ Kỳ, Thụy Điển, Tiếng Indonesia, Tiếng Ý, Trung, Trung (Phồn thể), Turkmen, Tây Ban Nha, Ukraina, Urdu, Uyghur, Uzbek, Việt, Xứ Wales, Yiddish, Yoruba, Zulu, Đan Mạch, Đức, Ả Rập, dịch ngôn ngữ.

Copyright ©2024 I Love Translation. All reserved.

E-mail: