xác. Đề làm điều này, PECompact sẽ tạo một section mới trong bộ nhớ để lưu trữ một vài đoạn mã dùng vào việc unpack và giải mã. Hãy xác minh lại điểu này, xem Map Memory trước và sau khi thực thi: Ảnh trên chỉ ra bộ nhớ trước khi thực thi, ảnh sau đây chỉ cho ta biết bộ nhớ sau khi thực thi: Tôi đã đánh dấu vùng trên mà đã được thêm vào. Bạn nên nhớ rằng không phải section mới nào cũng được tạo bởi PECompact, Chúng có thể được tạo bởi những Dll khác, và những chương trình điểu hành trong không gian bộ nhớ của PECompact. Có bạn sẽ thắc mắc nó làm như thế nào? Bạn hãy vào nơi này: http://msdn.microsoft.com/library/default.asp?url=/library/en- us/memory/base/virtual_memory_functions.asp Microsoft sẽ giải thích về những hàm bộ nhớ ảo được dùng để định vị, cấp phát, giải phóng bộ nhớ ảo cho ứng dụng. Vì thế, Trình unpacker đang chỉ định vùng nhớ mới, để unpack mã gốc của chương trình. Vậy, nó sẽ dùng hàm nào ? Những Chương trình khác cũng hay dùng kết hợp hai hàm trên. Sau khi bộ nhớ được chỉ định và đuợc sử dụng , nó sẽ được giải phóng để giảm thiểu dấi vết của chương trình đã để lại. Bạn sẽ tự hỏi : “Vì sao tôi phải chú tâm vào điều này?” Lý do là, nếu biết bộ nhớ được tạo ra, sử dụng và giải phóng như thế nào sẽ cho phép chúng ta đoán được PECompact sẽ điều hành như thế nào khi nó đang sử dụng bộ nhớ. Pecompact gần như là dùng hàm VirtualAlloc và sau khi dùng bộ nhớ cho hoạt động gì đó, nó sẽ giải phóng bộ nhớ bằng VirtualFree . Nó sẽ định vị vùng nhớ lưu trữ mã dùng cho unpack, và sẽ giải phóng bộ nhớ hi nó không cần đến nữa. Như vậy, khi nó giải phóng bộ nhớ, nó sẽ không làm gì thêm (unpack). Hãy kiểm tra giả thuyết của chúng ta heng. Quay trở lại Olly, và hãy chắc chắn rằng PECompact được load và chúng ta thấy trước mắt là EntryPoint. Hãy đặt BreakPoint (BP) trên VirtualFree . Hy vọng là PECompact sẽ hoàn thành việc unpack của nó, và chuẩn bị tới OEP. F9 để chạy chương trình. Nó sẽ thực thi một chút, và chúng ta sẽ nhìn lên ngăn xếp khi Olly ngắt. Thú vị đây, hàm này được gọi từ vị trí 00330877 vả nó sẽ giải phóng bộ nhớ ở 003A0000 , Chọn Execute-Till-Return , rồi F8 để đến vị trí của lời gọi hàm. Tốt lắm, chúng ta nhìn qua một section mà không thuộc phần mã gốc của chương trình. Tôi sẽ giúp bạn một ít step, một ít cú gõ phím, và nói với bạn rằng chúng ta không ở đúng vị trí. Nếu bạn tiếp tục thăm dò thông qua đoạn mã này bạn sẽ thấy rằng mã gốc chưa được unpack hoàn toàn. Vì thế hãy tiếp tục F9 và sẽ ngắt tại VirtualFree lần nữa, tiếp tục F9 bạn sẽ ngắt tại hàm này một lần nữa, lần này tham số trên ngăn xếp s4 là: Lúc này vị trí lời gọi là 00330B95, Press Execute-Till-Return , nhấn Step into để đến vị trí của lời gọi hàm này. Tiếp tục thăm dò, bạn sẽ đến được đây: Cái lệnh JMP EAX này chính là lệnh nhảy đến OEP. Hãy Đến vị trí của lệnh nhảy trên và F8 để tới vị trí 0041B6C3, ừm ta đã đến đựơc OEP của PECompact GUI. Dùng OllyDump dump nó Nhớ đừng chọn Rebuild Import,r ồi Dump. Giờ thì chỉ chỉ cần xây dựng lại Import thôi. Rebuild thì khá là đơn giản. Dùng Imprec và attach pec2gui.exe . Sau đó đánh vào Offset của OEP = 1B6C3 , rồi chọn IAT Autosearch, nó sẽ báo là nó tìm thấy một vị trí mà có thể là Import Table, Nhấn OK. Rồi GetImports, bạn sẽ có một lọat danh sách import, hãy kiểm tra xem tất cả import đã là hợp lệ chưa, bằng việc nhìn “Valid:Yes” sau mỗi thunk. Cuối cùng fix dump. Chạy file vừa mới dump. Nó hoạt động tốt. 3. Advance Features Không phải tất cả những chương trình PECompact đều giống nhau. Có cái sẽ dùng những tính năng cao cấp như anti-debug hay import protection. Ở đây tôi sẽ trình bày một số tình năng cao cấp heng. - Đầu tiên, ta sẽ thấy tính năng anti-debug: Nếu bạn thử unpack file được nén bởi PECompact , thì sẽ có cảnh báo dành cho bạn. Nhưng dầu sao, tính năng này rất đơn giản. Nó sử dụn hàm IsDebuggerPresent , mà sẽ cho EAX = 1 (khi phát hiện Debugger), eax = 0 (khi ko có Debugger). Tính năng này rất dễ bị qua mặt bằng cách sửa EAX = 1 EAX = 0. Hãy load chương trình đựơc bảo vệ bởi PECompact và đến vị trí hàm trên: Chọn dòng này: MOVZX EAX,BYTE PTR DS:[EAX+2] Hãy sửa nó thành như sau: PECompact còn nhiều tính năng liên quan đến IAT: Bạn sẽ băt gặp những chương tình sử dụng những tính năng này khi bạn dùng Imprec mà có Thunks invalid: Hãy xem xét các invalid thunk, chọn dấu + , Ta sẽ thấy một loạt những import không hợp lệ vì chúng đã được tái điều hướng (redirected) = Chúng được điều hướng tới đoạn mã được PECompact xác định rổi sau đó mới tới được API call. Chúng ta sẽ thấy được nơi mà chúng sẽ điều hướng tới, làm như sau: . nhìn lên ngăn xếp khi Olly ngắt. Thú vị đây, hàm này được gọi từ vị trí 00 3 308 77 vả nó sẽ giải phóng bộ nhớ ở 00 3A 000 0 , Chọn Execute-Till-Return , rồi F8 để đến vị trí của lời gọi hàm. Tốt. IsDebuggerPresent , mà sẽ cho EAX = 1 (khi phát hiện Debugger), eax = 0 (khi ko có Debugger). Tính năng này rất dễ bị qua mặt bằng cách sửa EAX = 1 EAX = 0. Hãy load chương trình đựơc bảo. JMP EAX này chính là lệnh nhảy đến OEP. Hãy Đến vị trí của lệnh nhảy trên và F8 để tới vị trí 00 41B6C3, ừm ta đã đến đựơc OEP của PECompact GUI. Dùng OllyDump dump nó Nhớ đừng chọn Rebuild