요즘 한패 하시는 분들도 많고 하니, 앞으로 더 많은 사람들이 한패를 성공시킬 수 있도록 짧은 지식이나마 공유해 볼까함
참고로 본인은 이제 갓 30대 들어설락 말락 하는 6년차 프로그래먼데, 리버싱 쪽은 아직 시작한지 1년도 안되는 왕초보 리린이임;;
혹시나 고수님들이 보시게 되면 그냥 한패 해본적 없는 일반인 대상으로 쓴 팁 정도라 생각하고 귀엽게 봐주셨음 좋겠음
미연시 한패는 보통 2~3가지 문제만 해결하면 만들 수 있고, 화려한 3D게임 한패에 비해 추가로 요구되는 지식이 상대적으로 적음
오늘은 내가 작업하는 3단계에 대해 간단히 소개해 보겠음
1. 언팩 / 리팩
- 사실상 한패의 알파이자 오메가.
먼저 한패를 하려면 게임에서 일본어 대사나 이미지 같은 리소스를 얻어내야 하는데, 그걸 게임 파일에서 추출하는게 언팩이고 다시 게임 파일로 만드는게 리팩임
LC-ScriptEngine도 그렇지만, 제법 좀 알려졌다 싶은 미연시 엔진들은 짱개들이 이미 리버싱을 다 해놨음.. github같은 곳 찾아보면 언팩 / 리팩 소스를 올려놓는 경우가 꽤 많음.
참고로 ONE이랑 MOON 작업에서 쓰고있는 LC-ScriptEngine용 툴은 https://github.com/Inori/FuckGalEngine 여기에 있던 언팩 소스 참고해서 만든 것임
Reallive 게임을 한글화 하고 싶은 경우엔 이미 강력한 툴인 RLDev가 있으므로 이걸 사용하는걸 추천함. RLDev는 코드도 깔끔하고 매뉴얼도 잘 써져있어서 접근성이 좋은 편임
RLDev를 제대로 써보고자 하는 사람들은 쿠드와후타/리버 한패 제작자분이 자세하게 써두신 글이 있으니 아래 글을 참고 하길 바람
만약 아무리 검색해봐도 다른 사람이 분석해놓은 코드가 없다든지, 리소스 파일에 암호화가 걸려있는데 암호키를 구하기 힘들다든지 하는 경우는 직접 exe를 어셈블리 디버거로 트레이스해가면서 파일 읽는 과정을 리버싱 해야하는데..
이런 경우 초보자들에겐 그냥 깔끔히 포기를 추천함..
검색능력이 정말 중요한 과정인데, 개인적으로는 이 과정이 한패를 할 수 있느냐 없느냐를 가장 크게 좌우하지 않을까 생각함
2. exe 한글 출력
- 일본 게임들은 대부분 문자를 읽어들이거나 폰트를 생성해서 그릴 때, Shift-JIS 문자셋을 사용함.
그래서 대사같은 걸 아무리 한글로 작성해봤자 게임 실행해보면 반각 카타카나같은 글씨로 깨져서 나오게 됨
이런 문제를 해결하기 위한 방법은 보통 2가지 방법이 있음
하나는 dll 인젝션을 통한 API 후킹인데, 이건 exe가 로드하는 dll중 하나를 내가 만든 dll로 교체해버리는 방법임.
RLDev의 rlbabel같은게 이 방식을 이용하고 있고, 이건 exe를 굳이 뜯지 않더라도 쓸 수 있다는 점, 여러 개 dll을 플러그인마냥 붙일 수도 있다는 점에서 상당히 강력한 방법임
다만 API 후킹은 dll 참조관계나 함수호출규약 같은 걸 잘 알아야해서 아무래도 내공이 좀 많이 필요한 분야임
exe에서 한글 출력하는 정도는 굳이 이렇게까지 안해도 되므로 나는 두번째 방법을 설명하겠음
두번째 방법은 exe를 직접 리버싱해서 수정하는 건데, 생각보다 과정이 단순해서 좀 오래된 게임이다 싶으면 이 방법을 추천함 (2010년판 LC-ScriptEngine, Reallive 1.4.8.8 까진 일단 잘먹혔음)
※ 리버싱은 자칫 잘못 건드리면 수정중이던 exe가 손상되기 쉬우니 미리 원본을 백업해두는 것이 좋음
먼저 exe를 ollydbg같은 디버거로 열어서 CreateFontA 혹은 CreateFontIndirectA로 심볼 검색을 해야 함
얘네들은 charset 값이 포함된 구조체 포인터를 파라미터로 받는데, 이 charset 값이 HEX로 80이면 Shift-JIS, 81이면 CP949임.
그래서 디버거 트레이스로 CreateFontA 혹은 CreateFontIndirectA를 호출하기까지의 스택들을 보다보면 특정 위치에서 80을 파라미터로 넣는 걸 볼 수 있음.
(CreateFontA의 경우 운좋으면 API 파라미터로 상수를 바로 넣는 경우도 있지만, 대부분은 스택을 조사해가면서 따라가야 하는 경우가 많음)
이런 함수들의 인풋값들을 다 찾아서 숫자 80을 81로 수정한 후에 저장하면 우선 한글 지원자체는 성공한 셈인데, 아직 이걸로 끝난게 아님.
일본 애들은 Shift-JIS를 출력 처리할때 반/전각 검사를 해서 글자 출력폭을 결정하므로, 이걸 한국어에 맞게 수정해주는 작업이 필요함..
(분명 전각문자를 썼는데 글자가 반씩 겹쳐버린다면 100% 이 문제라고 봐도 됨)
해당 게임이 Shift-JIS를 사용한다면 거의 대부분 아래와 같은 x86 명령어셋이 있을 것임
대충 코드를 설명하자면, 2byte를 읽어들인 후 상위 1바이트가 81~9F, 혹은 E0~FC 범위에 있고 하위 1바이트가 40~7E, 혹은 80~FC에 있다면 전각, 아니면 반각 처리하겠다는 의미임. (경우에 따라 여기 적힌 범위값이 조금 차이날 수 있긴 함, 근본적으론 Shift-JIS 코드 테이블에서 전각 범위를 어디로 지정하느냐에 따른 차이)
CP949같은 경우엔 81이하만 아니면 전부 전각 처리 코드로 해도 상관 없으므로 아래처럼 바로 JMP하도록 코드 수정하면 모든 한글 셋을 전각 크기로 정상 인식시킬 수 있음
물론 꼭 이렇게만 해야하는 건 아니고 저 값을 직접 편집한다든지 해도 되지만 나같은 경우는 이게 속편했음
여튼 이런 코드가 아마 한두개가 아닐테지만 거의 다 비슷하게 생겨먹었으므로 전부 찾아가서 수정하면 됨
근데 사실 이 방법은 요즘 나오는 게임일 수록 안 될 확률이 높음.. exe나 dll같은 파일을 PE 파일이라고 하는데, 최근엔 PE파일들을 다 암호화키로 패킹해버리기때문에 뜯는 것부터가 일이라고 보면 됨..
물론 그렇다 해도 최악의 경우 API 후킹을 쓰면 어떻게든 한글을 보이게 할 순 있기 때문에 1번보다는 상대적으로 해볼만한 과정이 아닐까 생각함..
3. exe 텍스트 영역 수정
- 가끔 Win32API나 AFX 형식으로 짜여진 프로그램들은 종료 버튼 같은 걸 누를때 Msgbox가 출력되는데, 이런 곳에 일본어가 박혀있을 때 유용하게 쓸 수 있는 방법임
나같은 경우엔 한패 exe 파일이 읽어들이는 파일 경로나 이름을 바꿔서, 한패 파일과 기존 리소스 파일, 세이브 파일들을 공존시키기 위한 목적으로도 씀
이건 앞서 설명한 다른 방법보다 훨씬 쉬운데, 대부분의 경우 아래처럼 exe를 UltraEdit나 HXD 같은 헥스 에디터로 열어서 string 검색 후 수정하는 걸로 바로 해결 할 수 있음
간혹 Reallive.exe처럼 2byte짜리 유니코드 영문자를 들고 있어서 string 검색이 어려운 애들이 있는데, 이런 애들은 BinText라는 프로그램을 쓰면 해당 부분의 HEX 주소값을 쉽게 얻어낼 수 있음
오늘은 대충 여기까지..
이 외에 필수는 아니지만 한패할 때 써먹기 좋은 지식들이라고 하면 SVN, GIT같은 형상관리나 Google Sheet를 이용한 한패 협업 방법, NSIS 인스톨러 제작 방법 정도가 있을 것 같은데 이것들은 담에 또 시간날때 한번 풀어보도록 하겠음
뭔진 모르겠어도 개추
아주 도움 됨 추
개추박고갑니다!
해당 댓글은 삭제되었습니다.
맞네요. 백업 주의는.본문에 확실히 쓰는게 좋을 게 같습니다. 말씀하신 createfontindirectA라든지, 요즘 게임은 리버싱이 어렵다는 이야기는 이미 언급해놓긴 했습니다.. 결국은 api 후킹이 상책이지 않을까 싶어요
이런 복잡한 과정을 통해 한패가 만들어지는군요
뭔진 모르지만 개추
모름