APK → libgame.so → game

Từ một APK cũ đến game có thể chơi lại

Không có mã nguồn gốc để sử dụng. Chúng tôi lấy dữ kiện từ APK, viết lại bằng TypeScript và kiểm tra kết quả trên Cocos Creator.

Phần 1

APK cho chúng ta những gì?

Giải nén một lần để tách tài nguyên, phần Java được decompile từ package ứng dụng và thư viện native.

Cách làm

  1. Kiểm tra hash để chắc chắn APK không đổi.
  2. Chạy scripts/inventory-apk.sh extract; script dùng JADX cho classes.dex và tách libgame.so.
  3. Giữ nguyên đầu ra làm nguồn đối chiếu cho các bước sau.
Một lát cắt của dữ liệu đã tách
jadx/resources/…
java/app-owned/PencilBlade.java
java/app-owned/R.java
native/libgame.so

Kết quả: 862 tài nguyên, 3 file Java được decompile từ package ứng dụng và 1 libgame.so.

Phần 2

Đọc libgame.so và nối với resource

Tìm function, hằng số và chuỗi đường dẫn; sau đó đối chiếu đường dẫn đó với tài nguyên đã tách ở Phần 1.

Cách làm

  1. Dùng readelfnm -C để xác định kiến trúc, symbol và địa chỉ.
  2. Chạy scripts/analyze-native-static.sh để lập bản đồ function, call, hằng số và string xref.
  3. Ghép string xref với file resource cùng tên, rồi ghi hành vi thành contract có test.
Trích từ function map
0x00145538  Bomb::onEnter()
string_xref → "Bomb/bomb_X.png"
string_xref → "Sounds/boomsound.wav"

Kết quả: hàm xử lý Bomb::onEnter() được nối với sprite bomb_X.png và âm thanh boomsound.wav. Cùng cách đó được dùng cho các phần còn lại.

Xem phân tích libgame.so chi tiết

Phần 3

Chơi thử game

Contract được viết lại bằng TypeScript, gắn với resource đã phục hồi và chạy trong Cocos Creator 3.8.8. Đây là bản phục dựng, không phải môi trường chạy gốc; bản game không nạp hay liên kết libgame.so.

Cách làm

  1. Mở bản Web H5.
  2. Bấm Chơi để tải game.
  3. Chọn chế độ và thử cắt trái cây.
Main Menu của bản phục dựng Pencil Blade trên Web H5.
Ảnh chụp từ bản H5 hiện tại.Chơi thử

Kết quả: bản phục dựng chạy trực tiếp trong trình duyệt và có đủ 6 chế độ chơi.