hdvd2309
14-03-25, 07:47 AM
Như các bạn đã biết để có được danh sách file thuộc file pak thì phải tự mày mò khá lâu nếu không biết cách.
Nay mình viết 1 chương trình python tự động chạy game và bắt những file mà game gọi tới. Bạn chỉ cần bật script là game sẽ tự chạy và chơi 1 lúc là đã có danh sách file để unpack rồi.
Script cũng khá đơn giản nên mình không giải thích nhiều. Nếu ai chưa hiểu script (không phải dân code) thì có thể hỏi trên đây mình sẽ chỉ đầy đủ.
Script có 1 nhược điểm là không lấy được chính xác tên file Trung Quốc do file Trung Quốc đặt encoding kiểu gì đó, mình thử decode nhưng không ra đúng ký tự.
Python code:
import frida
import sys
import os
# Định nghĩa phần prefix cần loại bỏ
PREFIX_TO_REMOVE = r"D:\Kiem-the-client"
# Tên file lưu kết quả
OUTPUT_FILE = "file_paths.txt"
# Đảm bảo file được tạo mới (nếu cần) với mã hóa UTF-8
if not os.path.exists(OUTPUT_FILE):
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
pass
# Tạo tập hợp lưu các đường dẫn đã ghi
saved_paths = set()
if os.path.exists(OUTPUT_FILE):
with open(OUTPUT_FILE, "r", encoding="utf-8") as f:
for line in f:
saved_paths.add(line.strip())
# Hàm callback xử lý message từ Frida script
def on_message(message, data):
if message['type'] == 'send':
path = message['payload']
# Loại bỏ phần prefix nếu có
if path.startswith(PREFIX_TO_REMOVE):
path = path[len(PREFIX_TO_REMOVE):]
# Nếu đường dẫn chưa được lưu thì ghi vào file
if path not in saved_paths:
saved_paths.add(path)
with open(OUTPUT_FILE, "a", encoding="utf-8") as f:
f.write(path + "\n")
elif message['type'] == 'error':
print("[!] Lỗi từ script:", message['stack'])
# Khởi chạy game.exe qua Frida
pid = frida.spawn(["game.exe"])
session = frida.attach(pid)
# Script hook hàm CreateFileA trong kernel32.dll
script = session.create_script("""
const CreateFileA = Module.getExportByName("kernel32.dll", "CreateFileA");
Interceptor.attach(CreateFileA, {
onEnter: function (args) {
var lpFileName = Memory.readAnsiString(args[0]);
send(lpFileName);
}
});
""")
script.on("message", on_message)
script.load()
# Tiếp tục tiến trình game.exe
frida.resume(pid)
print(" Đang theo dõi CreateFileA... Nhấn Ctrl+C để dừng.")
try:
sys.stdin.read()
except KeyboardInterrupt:
print("\n[!] Kết thúc theo dõi.")
session.detach()
Nay mình viết 1 chương trình python tự động chạy game và bắt những file mà game gọi tới. Bạn chỉ cần bật script là game sẽ tự chạy và chơi 1 lúc là đã có danh sách file để unpack rồi.
Script cũng khá đơn giản nên mình không giải thích nhiều. Nếu ai chưa hiểu script (không phải dân code) thì có thể hỏi trên đây mình sẽ chỉ đầy đủ.
Script có 1 nhược điểm là không lấy được chính xác tên file Trung Quốc do file Trung Quốc đặt encoding kiểu gì đó, mình thử decode nhưng không ra đúng ký tự.
Python code:
import frida
import sys
import os
# Định nghĩa phần prefix cần loại bỏ
PREFIX_TO_REMOVE = r"D:\Kiem-the-client"
# Tên file lưu kết quả
OUTPUT_FILE = "file_paths.txt"
# Đảm bảo file được tạo mới (nếu cần) với mã hóa UTF-8
if not os.path.exists(OUTPUT_FILE):
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
pass
# Tạo tập hợp lưu các đường dẫn đã ghi
saved_paths = set()
if os.path.exists(OUTPUT_FILE):
with open(OUTPUT_FILE, "r", encoding="utf-8") as f:
for line in f:
saved_paths.add(line.strip())
# Hàm callback xử lý message từ Frida script
def on_message(message, data):
if message['type'] == 'send':
path = message['payload']
# Loại bỏ phần prefix nếu có
if path.startswith(PREFIX_TO_REMOVE):
path = path[len(PREFIX_TO_REMOVE):]
# Nếu đường dẫn chưa được lưu thì ghi vào file
if path not in saved_paths:
saved_paths.add(path)
with open(OUTPUT_FILE, "a", encoding="utf-8") as f:
f.write(path + "\n")
elif message['type'] == 'error':
print("[!] Lỗi từ script:", message['stack'])
# Khởi chạy game.exe qua Frida
pid = frida.spawn(["game.exe"])
session = frida.attach(pid)
# Script hook hàm CreateFileA trong kernel32.dll
script = session.create_script("""
const CreateFileA = Module.getExportByName("kernel32.dll", "CreateFileA");
Interceptor.attach(CreateFileA, {
onEnter: function (args) {
var lpFileName = Memory.readAnsiString(args[0]);
send(lpFileName);
}
});
""")
script.on("message", on_message)
script.load()
# Tiếp tục tiến trình game.exe
frida.resume(pid)
print(" Đang theo dõi CreateFileA... Nhấn Ctrl+C để dừng.")
try:
sys.stdin.read()
except KeyboardInterrupt:
print("\n[!] Kết thúc theo dõi.")
session.detach()