# Manual Unpacking

## Tóm tắt
Khi thực hiện unpacking thì thông thường sẽ thực hiện các bước sau:
- Xác định EOP (Original Entry Point), khi một chương trình được packed thì khi thực thi thì chương trình sẽ được unpack và địa chỉ câu lệnh đầu tiên( nơi đoạn mã độc hại được thực thi) trước khi được pack. Chúng ta xác định được câu lệnh ở trong packed binary jump tới OEP
- Bước tiếp theo ta sẽ thực thi chương trình cho tới khi chương trình `jump` tới OEP. Ý tưởng ở đây là thực thi chương trình cho phép phần Malware stub unpack toàn bộ phần chương trình bị pack lại và đặt break point tại OEP ngay trước khi chương trình được thực thi.
- Tiếp theo ta chỉ cần dump unpacked process từ memory và sửa lại bảng IAT.
## Ví dụ
Trong ví dụ này ta unpack 1 ứng dụng được packed bởi `UPX` (https://upx.github.io/).

- Trước khi pack:


- Sau khi pack:
Ta thấy có 2 section là UPX0 và UPX1 nằm cùng 1 địa chỉ thật ra cả phần unpack stub và chương trình bị packed đều nằm ở UPX1. UPX0 raw size bằng 0. Khi code được unpack thì sẽ được ghi vào phần UPX0 nhằm tránh ghi đè lên phần code đang thực thi.


Chương trình chỉ bao gồm 1 hàm duy nhất
Phân tích file ta thấy chương trình sau khi unpack sẽ nhảy tới địa chỉ 0x40422D

Đặt breakpoint tại đây:

Run chương trình:

Memory tại UPX0:

Sau khi unpack thành công

Sử dụng Scylla có sẵn như 1 plugin trong x64dbg

Sau đây là cách unpack 1 file dựa trên sự tìm hiều và hiểu biết của tác giả. Cảm ơn các bạn đã bỏ thời gian đọc <3