한글패치 관련 짧은 글들

global-metadata.dat이 없는 경우의 덤프법 (frida 이용)

Snowyegret 2025. 3. 23. 18:53
const kernel32 = Process.getModuleByName('kernel32.dll');
const GetModuleHandleW = new NativeFunction(Module.getExportByName('kernel32.dll', 'GetModuleHandleW'), 'pointer', ['pointer']);
const FindResourceW = new NativeFunction(Module.getExportByName('kernel32.dll', 'FindResourceW'), 'pointer', ['pointer', 'pointer', 'pointer']);
const LoadResource = new NativeFunction(Module.getExportByName('kernel32.dll', 'LoadResource'), 'pointer', ['pointer', 'pointer']);
const LockResource = new NativeFunction(Module.getExportByName('kernel32.dll', 'LockResource'), 'pointer', ['pointer']);
const SizeofResource = new NativeFunction(Module.getExportByName('kernel32.dll', 'SizeofResource'), 'uint', ['pointer', 'pointer']);

const hModule = GetModuleHandleW(ptr(0));
const hResource = FindResourceW(hModule, ptr(0x65), ptr(0xA)); // 0x65는 리스소 ID, 0xA는 타입입니다. 리소스 ID는 변경될 수 있으니 찾아서 쓰십셔

if (hResource.isNull()) {
    console.log('리소스를 찾을 수 없습니다.');
} else {
    const hGlobal = LoadResource(hModule, hResource);
    const lpResource = LockResource(hGlobal);
    const size = SizeofResource(hModule, hResource);

    console.log('리소스 주소:', lpResource);
    console.log('리소스 크기:', size);

    // 리소스 덤프
    const resourceData = Memory.readByteArray(lpResource, size);
    const filePath = 'D:\\Games\\testgame\\global-metadata.dat';
    const file = new File(filePath, 'wb');
    file.write(resourceData);
    file.flush();
    file.close();
    console.log('리소스를 덤프했습니다:', filePath);
}

 

위 코드를 frida에 물리면 된다.

frida -f ".\게임이름.exe" -l simple_dumper.js