  | 
| 스카이림 스페셜 에디션 | 
개인적으로 자유도가 높은 게임을 선호하다보니 '스카이림' 에도 푹 빠졌었는데요...
이 게임이 공식적으로 '한글' 을 지원하지 않다보니 국내 유저들이 제작한 '한글화 모드' 를 설치해서...
게임을 즐기곤 했습니다 :)
저 같은 영어 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비트 어셈블리 코드를 보니 머리가 어질어질하네요...