Với mỗi phƣơng pháp trong một ứng dụng nhất định, chúng tôi trích xuất một đồ thị luồng điều khiển (CFG – Control Flow Graph) từ bytecode. Một CFG là một biểu diễn trừu tƣợng của một chƣơng trình, trong đó các đỉnh đại diện cho các khối nguyên tử của các lệnh không chứa lệnh nhảy và các cạnh biểu thị các đƣờng có thể có của dòng chƣơng trình. Mỗi đỉnh đƣợc gắn nhãn dựa trên lệnh cuối cùng trong khối, vì chính lệnh này quyết định cách dòng chƣơng trình rời khỏi khối. Ví dụ, một bƣớc nhảy không điều kiện đƣợc biểu diễn dƣới dạng một cạnh duy nhất; một bƣớc nhảy có điều kiện
đƣợc biểu diễn dƣới dạng sự cố hai cạnh trên cùng một nút bắt đầu.
Tuy nhiên, nhiều virus sử dụng kỹ thuật biến hình để tạo ra các bản sao sửa đổi với mã có cùng ngữ nghĩa, nhƣng với luồng điều khiển khác nhau. Để chống lại những đột biến này, chúng tôi áp dụng các quy tắc viết lại biểu đồ của:
• Hợp nhất các khối lệnh liên tiếp
• Hợp nhất các bƣớc nhảy vô điều kiện với khối lệnh mà chúng nhảy tới • Hợp nhất các bƣớc nhảy có điều kiện liên tiếp
Việc viết lại hoặc rút gọn này có thêm lợi ích là giảm kích thƣớc của đồ thị đƣợc trích xuất mà không phá hủy thông tin ngữ nghĩa quan trọng về luồng chƣơng trình. Khi chúng tôi đã trích xuất và xử lý các biểu đồ này, chúng tôi sẽ loại bỏ các biểu đồ có năm nút trở xuống, vì chỉ có tƣơng đối ít CFG có thể có từ năm nút trở xuống (và do đó chúng mã hóa ít thông tin ngữ nghĩa) và việc loại bỏ chúng cho phép tăng tốc độ đáng kể trong quá trình xử lý. Sau đó, chúng tôi kết hợp các đồ thị này thành một đồ thị lớn không kết nối.