HOOK 설정
일반 설정
코드 페이지
INFO
이 설정은 게임에서 추출한 텍스트가 HOOK 엔진 내부에서 인코딩이 지정되지 않은 멀티바이트 문자열인 경우에만 의미가 있습니다. HOOK 엔진 내부에서 이미 코드 페이지가 지정되었거나 텍스트가 와이드 문자 문자열 또는 UTF32 문자열인 경우 이 설정은 아무런 의미가 없습니다.
이 설정은 일반적으로 수정할 필요가 없습니다. 일부 오래된 엔진(예: Yuris)의 공식 중국어 버전에서만 GBK/BIG5/UTF8 인코딩이 사용될 수 있습니다. 올바른 텍스트를 찾을 수 없는 경우, issue를 보내주세요. 이 설정을 변경하는 것은 대부분 소용이 없습니다.
새로 고침 지연 시간
다음 상황 중 하나에 해당하는 경우:
1. 텍스트가 한 번에 한두 글자씩만 추출되는 경우; 2. 텍스트가 한 줄씩 추출되면서 이전 줄을 덮어쓰고, 결국 마지막 줄만 표시되는 경우; 3. 텍스트는 정확하지만 추출 속도가 매우 느린 경우;
이 옵션을 조정해야 합니다.
1, 2의 경우 게임 텍스트 표시 속도가 너무 느리고 새로 고침 지연 시간이 너무 낮아서 한두 글자 또는 한 줄의 텍스트가 추출될 때마다 즉시 새로 고쳐지기 때문입니다. 이 경우 새로 고침 지연 시간을 늘리거나 게임의 텍스트 표시 속도를 높여야 합니다.
3의 경우 적절히 새로 고침 지연 시간을 줄일 수 있습니다. 값을 줄이는 동안 1, 2의 상황이 발생하지 않도록 주의해야 합니다.
최대 버퍼 길이
때로는 텍스트가 반복해서 계속 새로 고쳐지는 경우가 있습니다. 이때 새로 고침 지연 시간이 높고 줄일 수 없는 경우, 텍스트가 버퍼를 가득 채울 때까지 계속 수신하거나 새로 고침이 중단되어 새로 고침 지연 시간을 충족하게 됩니다(일반적으로 게임이 포커스를 잃을 때 새로 고침이 중단되므로 대부분 버퍼가 가득 찰 때까지 기다리게 됩니다).
이 문제를 해결하기 위해 버퍼 길이를 적절히 낮출 수 있으며, 버퍼 길이가 실제 텍스트 길이보다 작아지지 않도록 주의해야 합니다.
최대 캐시 텍스트 길이
수신된 이력 텍스트는 캐시됩니다. 텍스트 선택 창에서 특정 텍스트 내용을 확인할 때 이력 캐시 텍스트를 조회합니다. 텍스트 항목이 너무 많거나 텍스트가 반복적으로 새로 고쳐지면 캐시된 텍스트가 과도해져 텍스트 확인 시 지연이 발생할 수 있습니다(때로는 확인하지 않을 때도 지연될 수 있음). 실제로 여기 캐시된 대부분은 무의미한 텍스트이며, 유용한 이력 텍스트는 이력 텍스트 창에서 확인할 수 있습니다. 이 값을 자유롭게 낮출 수 있습니다(기본값은 1000000이지만 실제로 1000으로 조정해도 충분합니다).
게임 전용 설정
추가 후크
Win32 일반 후크
활성화하면 게임에 Win32 일반 함수 후크를 주입하게 됩니다. 여기에는 GDI 함수, D3DX 함수, 문자열 함수가 포함됩니다.
너무 많은 후크를 주입하면 게임 속도가 느려질 수 있으므로 기본적으로 이러한 후크는 주입되지 않습니다.
올바른 텍스트를 추출할 수 없을 때 이 두 옵션을 활성화해 볼 수 있습니다.
특수 코드
특수 코드 삽입 후 특수 코드의 텍스트를 선택해야만 해당 특수 코드가 기록되며, 다음 시작 시 자동으로 이 특수 코드가 삽입됩니다. 이 설정에는 이전에 기록된 모든 특수 코드가 저장되어 있으며, 여기서 특수 코드를 추가하거나 삭제할 수 있습니다.
지연 주입
때로는 게임이 후킹을 삽입해야 할 위치가 DLL에 있으며, 게임이 약간 실행된 후에야 DLL이 로드되는 경우가 있습니다. 우리는 DLL이 로드될 때까지 기다린 후에 주입을 수행해야 합니다.
전용 HOOK 설정
설정 인터페이스 -> HOOK 설정에서 이루어지는 설정은 기본 설정으로, 게임에 대한 전용 HOOK 설정이 지정되지 않은 경우 기본 설정이 적용됩니다.
게임에 대한 전용 HOOK 설정을 하려면 게임 관리에서 게임 설정 인터페이스를 열고, 게임 설정 탭에서 HOOK 하위 탭으로 전환한 후 기본값 따르기를 해제하면 게임 전용 HOOK 설정을 할 수 있습니다.
Details
특수 코드 형식
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
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는 에뮬레이트된 주소입니다.
내장
E[D][S][N|O]HOOKCODE
E는 내장된 주석을 사용하며, HOOKCODE는 JIT 특수 코드 또는 HOOK 특수 코드입니다.
D:쓰기 시 중문 문자를 일본어 문자 집합으로 변환
S:추출 시 HOOKCODE로 지정된 텍스트 추출 방식 사용
N:쓰기 시 새로운 문자열 생성 후 문자열 포인터 교환
O:쓰기 시 원본 문자열 위에 덮어쓰기
직접 메모리 읽기
R{S|Q|V|U}[codepage#]@addr
R은 직접 메모리 읽기 플래그
S는 기본 ASCII 문자열, Q는 UTF16, U는 UTF32, V는 UTF8