|
스카이림 스페셜 에디션 |
개인적으로 자유도가 높은 게임을 선호하다보니 '스카이림' 에도 푹 빠졌었는데요...
이 게임이 공식적으로 '한글' 을 지원하지 않다보니 국내 유저들이 제작한 '한글화 모드' 를 설치해서...
게임을 즐기곤 했습니다 :)
저 같은 영어 Looser 에게 '한글화 모드' 는 없어서는 안될 필수 모드랄까요..? ^^;;;
( 모드 만세.... ioi )
10월 28일 !! '스카이림 스페셜 에디션' 이 출시가 됐습니다. @_@ !!!
64비트 OS 를 지원하고~ 그래픽도 더 좋아지고~ 기존 버전의 세이브 파일 호환도 되고~
....그런데
모드 적용시 '도전 과제' 를 달성할 수 없다는 희안한 기능이 추가가 되었더군요 oTL;;;
|
모드 적용하지 않은 상태의 'New Game' 메시지 |
|
모드 적용한 상태의 'New Game' 메시지 |
'도전 과제' 달성 상태를 보면서 뿌듯함을 얻는 스타일인데 '한글화 모드' 적용하면 그게 안된다니... oTL;;;
직업 정신(?)이 스믈스믈 발동하면서... 호기심이 생겨 (*-_-*) 디버거를 붙여서 저 부분을 한 번 살펴봤습니다...;;;
|
모드 적용 시 도전 과제 달성 불가 메시지 |
먼저 화면에 뿌려주는 메시지를 찾아봤더니... 떡하니 2개가 보이더군요. @_@
위의 메시지는 게임을 로드할 때 뿌려주는 메시지고...
아래의 메시지는 새 게임을 시작할 때 뿌려주는 메시지입니다.
일단은 새 게임을 시작할 때의 메시지부터~~ :)
|
모드 적용한 상태의 'New Game' 메시지 출력 코드 |
해당 코드를 보니 AL 값이 0 이면 다른 곳(skyrimse.7FF63AF93498)으로 점프하고...
아니면 모드 적용시 도전 과제를 달성할 수 없다는 메시지를 보여주도록 되어있더군요.
혹시나 싶어 다른 곳(skyrimse.7FF63AF93498)의 코드도 봤습니다.
|
모드 적용하지 않은 상태의 'New Game' 메시지 출력 코드 |
어라...!? @_@... AL 값이 0 일 때 점프하는 곳에
모드를 적용하지 않은 상태의 'New Game' 메시지를 출력하는 코드가 있었습니다.
AL 값이 뭐길래... !? =_=;;;
AL 값을 확인하는 코드 조~금 위에 CALL 명령이 있습니다. (skyrimse.7FF63A489019 호출)
일반적으로 함수 실행이 끝날 때... 리턴값이 EAX 에 담기게 되는데요.
여기선 skyrimse.7FF63A489019 의
리턴값이 0 이면 '모드 적용하지 않은 상태'로 처리하고...
0 이 아니면 '모드 적용한 상태'로 처리하고 있군요... @_@
즉, skyrimse.7FF63A489019 쪽에서 뭔가~ 모드 적용 여부를 검사한다고 볼 수 있겠죠~? :)
|
skyrimse.7FF63A489019 |
|
skyrimse.7FF63A6C1800 |
일단...
skyrimse.7FF63A6C1800 이 함수 안에서 모드 적용 여부를 검사하는 것으로
강하게 의심됩니다 :)
; skyrimse.7FF63A6C1800
00007FF63A6C1800 | PUSH RDI |
00007FF63A6C1802 | PUSH R14 |
00007FF63A6C1804 | SUB RSP, 28 |
00007FF63A6C1808 | XOR DIL, DIL |
00007FF63A6C180B | MOV R14, RCX |
00007FF63A6C180E | TEST DL, DL |
00007FF63A6C1810 | JE skyrimse.7FF63A6C1836 |
00007FF63A6C1812 | MOV RAX, QWORD PTR DS:[7FF63DDB4CB8] |
00007FF63A6C1819 | MOVZX EDI, BYTE PTR DS:[RAX+BD5] |
00007FF63A6C1820 | SHR DIL, 3 |
00007FF63A6C1824 | AND DIL, 1 |
00007FF63A6C1828 | JE skyrimse.7FF63A6C1836 |
00007FF63A6C182A | MOVZX EAX, DIL |
00007FF63A6C182E | ADD RSP, 28 |
00007FF63A6C1832 | POP R14 |
00007FF63A6C1834 | POP RDI |
00007FF63A6C1835 | RET |
00007FF63A6C1836 | MOV QWORD PTR SS:[RSP+40], RBX |
00007FF63A6C183B | MOV QWORD PTR SS:[RSP+48], RBP |
00007FF63A6C1840 | MOV EBP, DWORD PTR DS:[RCX+D70] |
00007FF63A6C1846 | MOV QWORD PTR SS:[RSP+20], R15 |
00007FF63A6C184B | MOV R15D, 1 |
00007FF63A6C1851 | MOV EBX, R15D |
00007FF63A6C1854 | CMP EBP, EBX |
00007FF63A6C1856 | JBE skyrimse.7FF63A6C18C6 |
00007FF63A6C1858 | MOV QWORD PTR SS:[RSP+50], RSI |
00007FF63A6C185D | NOP DWORD PTR DS:[RAX] |
00007FF63A6C1860 | TEST DIL, DIL |
00007FF63A6C1863 | JNE skyrimse.7FF63A6C18A6 |
00007FF63A6C1865 | TEST EBX, EBX |
00007FF63A6C1867 | JS skyrimse.7FF63A6C18A0 |
00007FF63A6C1869 | CMP EBX, FE |
00007FF63A6C186F | JA skyrimse.7FF63A6C18A0 |
00007FF63A6C1871 | MOVSXD RAX, EBX |
00007FF63A6C1874 | MOV RSI, QWORD PTR DS:[R14+RAX*8+D78] |
00007FF63A6C187C | TEST RSI, RSI |
00007FF63A6C187F | JE skyrimse.7FF63A6C18A0 |
00007FF63A6C1881 | MOV RCX, RSI |
00007FF63A6C1884 | CALL skyrimse.7FF63A46639D |
00007FF63A6C1889 | CMP AL, FF |
00007FF63A6C188B | JE skyrimse.7FF63A6C18A0 |
00007FF63A6C188D | LEA RCX, QWORD PTR DS:[RSI+58] |
00007FF63A6C1891 | CALL skyrimse.7FF63A4BCFF9 |
00007FF63A6C1896 | TEST AL, AL |
00007FF63A6C1898 | MOVZX EDI, DIL |
00007FF63A6C189C | CMOVE EDI, R15D |
00007FF63A6C18A0 | INC EBX |
00007FF63A6C18A2 | CMP EBX, EBP |
00007FF63A6C18A4 | JB skyrimse.7FF63A6C1860 |
00007FF63A6C18A6 | MOV RSI, QWORD PTR SS:[RSP+50] |
00007FF63A6C18AB | MOVZX EAX, DIL |
00007FF63A6C18AF | MOV RBP, QWORD PTR SS:[RSP+48] |
00007FF63A6C18B4 | MOV RBX, QWORD PTR SS:[RSP+40] |
00007FF63A6C18B9 | MOV R15, QWORD PTR SS:[RSP+20] |
00007FF63A6C18BE | ADD RSP, 28 |
00007FF63A6C18C2 | POP R14 |
00007FF63A6C18C4 | POP RDI |
00007FF63A6C18C5 | RET |
00007FF63A6C18C6 | MOVZX EAX, DIL |
00007FF63A6C18CA | JMP skyrimse.7FF63A6C18AF |
00007FF63A6C18CC | INT3 |
00007FF63A6C18CD | INT3 |
00007FF63A6C18CE | INT3 |
00007FF63A6C18CF | INT3 |
확인 결과...
7FF63A6C1840 코드에서 현재 로드된 모드의 개수를 가져오고... (EBP)
7FF63A6C188D 코드에서 현재 로드된 모드 파일의 이름을 가져와서... (RCX)
모드의 개수 만큼 루프를 돌면서 7FF63A6C1891 코드에서 파일 이름을 비교하고 있었습니다.
|
모드 파일 이름 비교 대상 |
파일 이름이
Dawnguard.esm, HearthFires.esm, Dragonborn.esm, Update.esm 인 경우에 한해서는...
도전 과제 달성이 가능하도록 허용을 해주고 있더군요...;;; 그 외에는 불가능~ oTL;;;
어쨌든,
skyrimse.7FF63A6C1800 이 함수가 모드를 검사하는 함수라는 것과
검사 방식은 모드의 파일 이름 비교라는 걸 알아냈습니다 :)
이 모드 검사를 우회할 방법이야 여러가지지만...
그냥 간단하게(?) 함수 호출 시 무조건 0 을 리턴하도록 코드를 조작해봤습니다.
|
skyrimse.7FF63A6C1800 코드 조작 |
이렇게 조작해둔 상태에서 게임을 진행해보니...
'한글화 모드' 를 적용한 상태에서도 '도전 과제' 가 제대로 달성이 되더군요... ( 오예!! =_=v )
|
모드 적용 한 상태에서 '도전 과제' 달성 |
게임 실행할 때 저 함수 부분을 자동으로 조작해주는 툴을 만들면 조금 더 편하겠네요~ :)
ps... 어우.. 64비트 어셈블리 코드를 보니 머리가 어질어질하네요...