mirror of
https://github.com/HIllya51/LunaTranslator.git
synced 2025-11-28 09:00:23 +08:00
117 lines
7 KiB
Markdown
117 lines
7 KiB
Markdown
# HOOK 설정
|
||
|
||
## 일반 설정
|
||
|
||
1. #### 코드 페이지
|
||
|
||
::: info
|
||
이 설정은 게임에서 추출한 텍스트가 **HOOK 엔진 내부에서 인코딩이 지정되지 않은** **멀티바이트 문자열**인 경우에만 의미가 있습니다. HOOK 엔진 내부에서 이미 코드 페이지가 지정되었거나 텍스트가 **와이드 문자 문자열** 또는 **UTF32** 문자열인 경우 이 설정은 아무런 의미가 없습니다.
|
||
:::
|
||
|
||
이 설정은 일반적으로 수정할 필요가 없습니다. 일부 오래된 엔진(예: Yuris)의 공식 중국어 버전에서만 GBK/BIG5/UTF8 인코딩이 사용될 수 있습니다. 올바른 텍스트를 찾을 수 없는 경우, [issue](https://lunatranslator.org/Resource/game_support)를 보내주세요. 이 설정을 변경하는 것은 대부분 소용이 없습니다.
|
||
|
||
1. #### 새로 고침 지연 시간
|
||
|
||
다음 상황 중 하나에 해당하는 경우:
|
||
|
||
1. 텍스트가 한 번에 한두 글자씩만 추출되는 경우;
|
||
2. 텍스트가 한 줄씩 추출되면서 이전 줄을 덮어쓰고, 결국 마지막 줄만 표시되는 경우;
|
||
3. 텍스트는 정확하지만 추출 속도가 매우 느린 경우;
|
||
|
||
이 옵션을 조정해야 합니다.
|
||
|
||
**1, 2**의 경우 게임 텍스트 표시 속도가 너무 느리고 새로 고침 지연 시간이 너무 낮아서 한두 글자 또는 한 줄의 텍스트가 추출될 때마다 즉시 새로 고쳐지기 때문입니다. 이 경우 **새로 고침 지연 시간을 늘리거나** 게임의 텍스트 표시 속도를 높여야 합니다.
|
||
|
||
**3**의 경우 **적절히 새로 고침 지연 시간을 줄일 수 있습니다**. 값을 줄이는 동안 **1, 2**의 상황이 발생하지 않도록 주의해야 합니다.
|
||
|
||
1. #### 최대 버퍼 길이
|
||
|
||
때로는 텍스트가 반복해서 계속 새로 고쳐지는 경우가 있습니다. 이때 새로 고침 지연 시간이 높고 줄일 수 없는 경우, 텍스트가 버퍼를 가득 채울 때까지 계속 수신하거나 새로 고침이 중단되어 새로 고침 지연 시간을 충족하게 됩니다(일반적으로 게임이 포커스를 잃을 때 새로 고침이 중단되므로 대부분 버퍼가 가득 찰 때까지 기다리게 됩니다).
|
||
|
||
이 문제를 해결하기 위해 버퍼 길이를 적절히 낮출 수 있으며, 버퍼 길이가 실제 텍스트 길이보다 작아지지 않도록 주의해야 합니다.
|
||
|
||
1. #### 최대 캐시 텍스트 길이
|
||
|
||
수신된 이력 텍스트는 캐시됩니다. 텍스트 선택 창에서 특정 텍스트 내용을 확인할 때 이력 캐시 텍스트를 조회합니다. 텍스트 항목이 너무 많거나 텍스트가 반복적으로 새로 고쳐지면 캐시된 텍스트가 과도해져 텍스트 확인 시 지연이 발생할 수 있습니다(때로는 확인하지 않을 때도 지연될 수 있음). 실제로 여기 캐시된 대부분은 무의미한 텍스트이며, 유용한 이력 텍스트는 이력 텍스트 창에서 확인할 수 있습니다. 이 값을 자유롭게 낮출 수 있습니다(기본값은 1000000이지만 실제로 1000으로 조정해도 충분합니다).
|
||
|
||
1. #### 최대 허용 출력 텍스트 길이
|
||
|
||
게임에서 스킵이나 기록된 텍스트를 볼 때 많은 텍스트가 한 번에 출력될 수 있지만, 실제로는 이러한 텍스트에 관심이 없을 수 있습니다. 이 값을 적절한 수준으로 조정하면 갑작스러운 대량 텍스트 출력을 필터링할 수 있습니다.
|
||
|
||
## 게임 전용 설정
|
||
|
||
1. #### 추가 후크
|
||
1. #### Win32 일반 후크
|
||
활성화하면 게임에 Win32 일반 함수 후크를 주입하게 됩니다. 여기에는 GDI 함수, D3DX 함수, 문자열 함수가 포함됩니다.
|
||
|
||
너무 많은 후크를 주입하면 게임 속도가 느려질 수 있으므로 기본적으로 이러한 후크는 주입되지 않습니다.
|
||
|
||
올바른 텍스트를 추출할 수 없을 때 이 두 옵션을 활성화해 볼 수 있습니다.
|
||
1. #### 특수 코드
|
||
**특수 코드 삽입** 후 **특수 코드의 텍스트를 선택**해야만 해당 특수 코드가 기록되며, 다음 시작 시 자동으로 이 특수 코드가 삽입됩니다. 이 설정에는 이전에 기록된 모든 특수 코드가 저장되어 있으며, 여기서 특수 코드를 추가하거나 삭제할 수 있습니다.
|
||
|
||
1. #### 지연 주입
|
||
때로는 게임이 후킹을 삽입해야 할 위치가 DLL에 있으며, 게임이 약간 실행된 후에야 DLL이 로드되는 경우가 있습니다. 우리는 DLL이 로드될 때까지 기다린 후에 주입을 수행해야 합니다.
|
||
|
||
1. #### 전용 HOOK 설정
|
||
설정 인터페이스 -> HOOK 설정에서 이루어지는 설정은 기본 설정으로, 게임에 대한 전용 HOOK 설정이 지정되지 않은 경우 기본 설정이 적용됩니다.
|
||
|
||
게임에 대한 전용 HOOK 설정을 하려면 **게임 관리**에서 **게임 설정** 인터페이스를 열고, 게임 설정 탭에서 HOOK 하위 탭으로 전환한 후 **기본값 따르기**를 해제하면 게임 전용 HOOK 설정을 할 수 있습니다.
|
||
|
||
::: details
|
||

|
||
|
||

|
||
:::
|
||
|
||
## 특수 코드 형식
|
||
|
||
1. #### HOOK
|
||
|
||
`{H|B}{A|B|C|W|I|S|Q|U|V}[F][N][codepage#][padding+]data_offset[*deref_offset][:split_offset[*deref_offset]]@addr[:module[:func]]`
|
||
|
||
H는 inlineHook, B는 vehhook입니다.
|
||
|
||
단일 문자: A/B는 리틀 엔디안/빅 엔디안 mbcs, C는 UTF8, W는 UTF16, I는 UTF32입니다.
|
||
|
||
문자열: S는 기본 ASCII 문자열, Q는 UTF16, U는 UTF32, V는 UTF8입니다.
|
||
|
||
F: 문자열을 읽을 때마다 줄 바꿈 문자 추가
|
||
|
||
N: 컨텍스트 무시
|
||
|
||
寄存器的data_offset:
|
||
* 32비트 EAX -4, ECX -8, EDX -C, EBX -10, ESP -14, EBP -18, ESI -1C, EDI -20
|
||
* 64비트 RAX -C, RBX -14, RCX -1C, RDX -24, RSP -2C, RBP -34, RSI -3C, RDI -44, R8 -4C, R9 -54, R10 -5C, R11 -64, R12 -6C, R13 -74, R14 -7C, R15 -84
|
||
|
||
1. #### JIT HOOK
|
||
|
||
`{H|B}{A|B|C|W|I|S|Q|M|U|V}[F][N][codepage#][padding+]arg_index[*deref_offset][:split_offset[*deref_offset]]@{info}:JIT:{UNITY|YUZU|PPSSPP|VITA3K|RPCS3}`
|
||
|
||
arg_index是JIT函数的参数index。M为C#字符串,仅UNITY可用。
|
||
|
||
UNITY의 info는: [어셈블리]:[네임스페이스]:[클래스명]:[함수명]:[매개변수 수]
|
||
|
||
YUZU/PPSSPP/VITA3K/RPCS3의 info는 에뮬레이트된 주소입니다.
|
||
|
||
1. #### 내장
|
||
|
||
`E[D][S][N|O]HOOKCODE`
|
||
|
||
E는 내장된 주석을 사용하며, HOOKCODE는 JIT 특수 코드 또는 HOOK 특수 코드입니다.
|
||
|
||
D:쓰기 시 중문 문자를 일본어 문자 집합으로 변환
|
||
|
||
S:추출 시 HOOKCODE로 지정된 텍스트 추출 방식 사용
|
||
|
||
N:쓰기 시 새로운 문자열 생성 후 문자열 포인터 교환
|
||
|
||
O:쓰기 시 원본 문자열 위에 덮어쓰기
|
||
|
||
1. #### 직접 메모리 읽기
|
||
|
||
`R{S|Q|V|U}[codepage#]@addr`
|
||
|
||
R은 직접 메모리 읽기 플래그
|
||
|
||
S는 기본 ASCII 문자열, Q는 UTF16, U는 UTF32, V는 UTF8
|