[ 리버싱 / 프로그래밍 / 음악 / 게임 / 그 외... ]

레이블이 도전과제인 게시물을 표시합니다. 모든 게시물 표시
레이블이 도전과제인 게시물을 표시합니다. 모든 게시물 표시


수요일, 1월 11, 2017



일전에 '스카이림 스페셜 에디션' 관련된 내용을 올린 적이 있습니다.

http://www.xeronichs.com/2016/11/SkyrimSE-Achievements-with-MOD.html ]


모드 적용 시 업적 달성 가능하도록 해주는 툴을 만들어야지... 만들어야지... 하다가

요 며칠간 뚝딱뚝딱 만들어봤습니다.


UI 작업할 땐 개인적으로 C++ Builder 를 더 좋아하는데~

스카이림 스페셜 에디션이 64비트 클라이언트라서 어쩔 수 없이 Visual Studio 로..;;;;

( 현재 보유 중인 C++ Builder 스타터 에디션은 64비트를 지원하지 않다보니.. oTL;;; )

예전에는 MFC 도 그럭저럭 썼던거 같은데... 오랜만에 만져보니 뭔가 번거롭더군요..

특히 컨트롤 크기나 배치 등 설정을 세밀하게 하는게 C++ Builder 에 비해서 귀찮습니다;;;




스카이림 실행 파일("SkyrimSE.exe") 파일의 경로를 지정해주고~

"Patch (with Run)" 버튼을 누르면 게임 실행과 동시에 패치를 해줍니다.


참고로 실행 파일을 직접 패치하는 게 아니라 실행된 프로세스의 메모리 코드를 패치하는거라서...

매번 -_-;;; 실행을 해줘야 합니다...

일단 제가 원하는 선에서는 잘 동작하는 관계로 기능 추가가 있을지는 모르겠네요..ㅋㅋ ^^;;;


[ SkyrimSE_AE_Patch 다운로드 ]

[ Visual Studio 2015 재배포 패키지 ]




금요일, 11월 04, 2016



스카이림 스페셜 에디션

개인적으로 자유도가 높은 게임을 선호하다보니 '스카이림' 에도 푹 빠졌었는데요...

이 게임이 공식적으로 '한글' 을 지원하지 않다보니 국내 유저들이 제작한 '한글화 모드' 를 설치해서...

게임을 즐기곤 했습니다 :)

저 같은 영어 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비트 어셈블리 코드를 보니 머리가 어질어질하네요...






카테고리

가장 많이 본 글

통계

Copyright © XeroNic(HS) BLOG | Powered by Blogger
Design by WP Lift | Blogger Template by NewBloggerThemes.com