6. 랑그릿사2 텍스트 데이터 (2)
이번에는 랑그릿사2의 실행파일(langpc2.exe) 안에 있는 텍스트를 찾아봅시다. 이를 위해서 2번 글에서 찾아낸 Memory map이 필요합니다.
실행파일에서 게임 관련 텍스트가 들어갈 수 있는 곳은 .rdata와 .data 섹션입니다. 따라서 실행파일의 00_03_E4_00 부터 00_04_A1_FF 까지 살펴보면 됩니다.
그리고 한글을 볼 수 있는 헥스에디터가 필요합니다. (저는 CrystalTile2 을 사용하였습니다.)헥스에디터로 langpc2.exe 파일을 열어서 살펴본 결과, 00_03_F1_78 부터 00_03_F7_5F 까지 클래스 이름이 있으며, 00_03_FB 60 부터 00_03_FE_77 까지 캐릭터 이름이 있습니다.
위의 Memory map을 이용하여 메모리 주소로 변환하면 다음과 같습니다.
Ghidra를 실행해서 langpc2.exe를 살펴봅시다. 위에서 알아낸 메모리 주소인 00_44_03_78로 이동해서(Navigation > Go to..., 단축키 : g) 해당 Label 이름을 "class_name_1"으로 바꿔놓습니다. (우클릭 > Edit Label..., 단축키 : l) 그리고 Label을 참조하는 곳을 검색합니다. (우클릭 > References > Show References to class_name_1, 단축키 : Ctrl+Shift+f) 참조하고 있는 곳은 3군데이며, 그 근처에 클래스 이름에 대한 참조들이 많이 있는 것을 알 수 있습니다.
이를 분석해본 결과는 이렇습니다. 00_03_F1_78 부터 00_03_F7_5F 까지 클래스/용병 이름의 실제 문자열 데이터가 저장돼있고, 00_03_F7_60 부터 00_03_FB_5B 까지에 해당되는 배열에 문자열 데이터의 주소값들이 저장돼있습니다. 즉, 00_03_F7_60 부터 00_03_FB_5B 까지는 (C언어의) 문자열 포인터 배열에 해당되며 다음과 나타낼 수 있습니다.
Offset(h)
00440964 : => 00440378 ("파이터")
00440968 : => 00440378 ("파이터")
0044096C : => 00440378 ("파이터")
00440970 : => 00440380 ("글래디에이터")
00440974 : => 00440390 ("뱀파이어")
00440978 : => 004403A0 ("나이트")
0044097C : => 004403A0 ("나이트")
00440980 : => 004403A8 ("파이어러트")
00440984 : => 004403B8 ("호크나이트")
...
이를 이용하면, 01번부터 FE번까지의 클래스 이름을 알아낼 수 있습니다.
마찬가지 방식으로 캐릭터 이름도 알아낼 수 있습니다.
다음 글에서는 클래스 데이터를 살펴보겠습니다.
Name
|
Memory Address
|
Raw Data
|
||
Start
|
End
|
Start
|
End
|
|
.text
|
00_40_10_00
|
00_43_EE_B4
|
00_00_04_00
|
00_03_E2_B4
|
.rdata
|
00_43_F0_00
|
00_43_F9_7F
|
00_03_E4_00
|
00_03_ED_7F
|
.data
|
00_44_00_00
|
00_44_B3_FF
|
00_03_EE_00
|
00_04_A1_FF
|
.idata
|
00_48_10_00
|
00_48_1A_B7
|
00_04_A2_00
|
00_04_AC_B7
|
.rsrc
|
00_48_20_00
|
00_48_23_BB
|
00_04_AE_00
|
00_04_B1_BB
|
실행파일에서 게임 관련 텍스트가 들어갈 수 있는 곳은 .rdata와 .data 섹션입니다. 따라서 실행파일의 00_03_E4_00 부터 00_04_A1_FF 까지 살펴보면 됩니다.
그리고 한글을 볼 수 있는 헥스에디터가 필요합니다. (저는 CrystalTile2 을 사용하였습니다.)헥스에디터로 langpc2.exe 파일을 열어서 살펴본 결과, 00_03_F1_78 부터 00_03_F7_5F 까지 클래스 이름이 있으며, 00_03_FB 60 부터 00_03_FE_77 까지 캐릭터 이름이 있습니다.
위의 Memory map을 이용하여 메모리 주소로 변환하면 다음과 같습니다.
Name
|
Memory Address
|
Raw Data
|
||
Start
|
End
|
Start
|
End
|
|
클래스 이름
|
00_44_03_78
|
00_44_09_5F
|
00_03_F1_78
|
00_03_F7_5F
|
캐릭터
이름
|
00_44_0D_60
|
00_44_10_77
|
00_03_FB_60
|
00_03_FE_77
|
Ghidra를 실행해서 langpc2.exe를 살펴봅시다. 위에서 알아낸 메모리 주소인 00_44_03_78로 이동해서(Navigation > Go to..., 단축키 : g) 해당 Label 이름을 "class_name_1"으로 바꿔놓습니다. (우클릭 > Edit Label..., 단축키 : l) 그리고 Label을 참조하는 곳을 검색합니다. (우클릭 > References > Show References to class_name_1, 단축키 : Ctrl+Shift+f) 참조하고 있는 곳은 3군데이며, 그 근처에 클래스 이름에 대한 참조들이 많이 있는 것을 알 수 있습니다.
이를 분석해본 결과는 이렇습니다. 00_03_F1_78 부터 00_03_F7_5F 까지 클래스/용병 이름의 실제 문자열 데이터가 저장돼있고, 00_03_F7_60 부터 00_03_FB_5B 까지에 해당되는 배열에 문자열 데이터의 주소값들이 저장돼있습니다. 즉, 00_03_F7_60 부터 00_03_FB_5B 까지는 (C언어의) 문자열 포인터 배열에 해당되며 다음과 나타낼 수 있습니다.
Offset(h)
00440964 : => 00440378 ("파이터")
00440968 : => 00440378 ("파이터")
0044096C : => 00440378 ("파이터")
00440970 : => 00440380 ("글래디에이터")
00440974 : => 00440390 ("뱀파이어")
00440978 : => 004403A0 ("나이트")
0044097C : => 004403A0 ("나이트")
00440980 : => 004403A8 ("파이어러트")
00440984 : => 004403B8 ("호크나이트")
...
이를 이용하면, 01번부터 FE번까지의 클래스 이름을 알아낼 수 있습니다.
번호
|
이름
|
번호
|
이름
|
00
|
N/A
|
10
|
겔갸자
|
01
|
파이터
|
11
|
고스트
|
02
|
파이터
|
12
|
스큐라
|
03
|
파이터
|
13
|
록
|
04
|
글래디에이터
|
14
|
로드
|
05
|
뱀파이어
|
15
|
로드
|
06
|
나이트
|
16
|
로드
|
07
|
나이트
|
17
|
어세신
|
08
|
파이어러트
|
18
|
어세신
|
09
|
호크나이트
|
19
|
실버나이트
|
0A
|
호크나이트
|
1A
|
실버나이트
|
0B
|
시스터
|
1B
|
실버나이트
|
0C
|
셔먼
|
1C
|
캡틴
|
0D
|
워록
|
1D
|
캡틴
|
0E
|
워록
|
1E
|
호크로드
|
0F
|
워울프
|
1F
|
호크로드
|
마찬가지 방식으로 캐릭터 이름도 알아낼 수 있습니다.
번호
|
이름
|
번호
|
이름
|
00
|
N/A
|
10
|
에그베르트
|
01
|
엘윈
|
11
|
에스트
|
02
|
리아나
|
12
|
오스트
|
03
|
라나
|
13
|
레아드
|
04
|
쉐리
|
14
|
제시카
|
05
|
헤인
|
15
|
다크프린세스
|
06
|
스콧트
|
16
|
베른하르트
|
07
|
키스
|
17
|
보젤
|
08
|
아론
|
18
|
수수께끼기사
|
09
|
레스터
|
19
|
발드
|
0A
|
라나
|
1A
|
조름
|
0B
|
로우가
|
1B
|
모건
|
0C
|
소니아
|
1C
|
기남
|
0D
|
레온
|
1D
|
크레이머
|
0E
|
발가스
|
1E
|
세이갈
|
0F
|
이멜다
|
1F
|
폴가
|
다음 글에서는 클래스 데이터를 살펴보겠습니다.
Hex는 완전 초짜라 활용을 절대 못할거라생각했는데 덕분에 전직, 아이템 능력, 클래스 능력, 초기능력치를 제 맛에 맞게 고칠수있었습니다 정말 감사드립니다
답글삭제물론 글을 전부 이해한건 아닙니다만 올려주신 데이타만으로도 그덕에 성공했습니다!!