Category Archives: 삽질

Extracting official firmware image of Casio G’zOne LTE (C811)

Most stock rom of Casio G’zOne 4G LTE (C811) is extracted from stock devices after uploading corresponding firmware. Verizon also supports firmware restoration tool from PC. There were some efforts to extract real stock firmware from that image but that never happened. I analyzed the Verizon firmware restoration tool and how to extract (not flash) firmware images uploaded on NEC Casio server.

There are some INI files bundled with Verizon tool (TL-Bootstrap). It specifies base address where all required tools are uploaded. When executed, the program checks all required tools’ version from http://baseaddress/ToolVersion.txt, downloads newer version when available. Real upgrade processes are hidden in the tool downloaded by bootstrap. Latest version of firmware is checked via /files.txt which contains version, size and some other information. Downloading firmware itself is straightforward by using filename from the text file, but only latest version is available from official server. All previous versions were deleted.

The firmware consists of single ZIP file, which then contains single MBN file for flashing. Despite same extension as Qualcomm tools, it uses proprietary format to encode and encrypt the image. Metadata is located at the last 2KB of MBN file. It starts with header, something like version and number of partitions. Each partition record basic information of partition and “flags”. EXT4 partition images are stored in standard sparce format which could be restored using simg2img. Other images stored with trailing zero bytes stripped, with separate original size information. All binary data except header is XOR encrypted, which differs among partition and even among firmware version.

I deduced XOR keys by comparing “extracted” file system images with encrypted images, which share same header bytes. XOR key of EXT4 sparce partition is also easily deducible since they use standard Android magic numbers. Attached source code calculates XOR key and extracts file system image. Probably works on Linux and OS X.

eut_extract.c code is here: https://gist.github.com/peremen/71330cbb4a6556358b938e0e353255a6

Using the attached source code, you can obtain “pure” stock ROM which is not altered by flashing and dumping.

Jolla/Sailfish OS용 한글 입력기, 돛단배

Jolla를 사자마자 준비 땅! 하고 한 일은 한글 입력기 제작이긴 했지만, 만들어 놓고 테스팅하느라 공개를 미룬 덕분에 다른 누군가가 한글 입력기를 먼저 공개하는 불상사가 터졌다. 먼저 공개된 입력기의 소스를 분석해 보니 뭐 그렇게 나쁜 것 같지는 않지만, 바퀴를 다시 발명할 필요는 없지 않은가. 그래서 한글 두벌식 입력 쪽은 바퀴를 다시 발명하는 대신 온라인 한글 입력기의 소스를 사용하였다. 돛단배 입력기는 두벌식 및 나랏글을 지원하는 Sailfish OS용 입력기이며, 개발 관련 이야기를 읽지 않고 싶다면 End 키를 누른 다음 맨 아래에 있는 다운로드 링크를 보면 된다.

Sailfish OS의 키보드 레이아웃은 QML로 작성되며, 여기에 사용자 정의 InputHandler를 붙이는 방식으로 단어를 입력하기 전에 조합하는 것과 같은 처리를 할 수 있다. 공식적인 InputHandler를 추가할 수 있는 API가 따로 없기 때문에 Sailfish OS용 일본어 입력기는 Hack에 가까운 방법으로 InputHandler를 전환하고 있었다. 먼저 공개된 일본어 입력기의 경우 Anthy 라이브러리를 QML 플러그인으로 만들어서 붙인 방식을 취하고 있었기 때문에 libhangul을 같은 방식으로 붙일까 생각했으나, 네이티브 코드를 쓰지 않는 것이 덜 번거로울 것이라고 판단하여 온라인 한글 입력기 기반으로 소스 코드를 전환하였다. InputHandler를 붙이는 것은 입력기 소스 코드의 ko_2set.qml, ko_naratgeul.qml 파일을 참고하면 된다.

아무튼 공개 시간을 놓쳐 버린 사태가 일어나고 나서, 바퀴를 다시 발명하는 것이 안타깝기도 하고 많은 ‘한국에서 개발되고 사용된’ 한글 입력기의 구현체와는 거리가 있기 때문에 내 소스 코드를 그냥 묻어 버릴 수는 없다고 판단하여 기능을 하나 더 추가하여 공개하기로 결심하였다. 눈에 들어온 것은 10키 방식 키보드였다. 서드파티 키보드 API를 사용할 수 있는 OS 중 안드로이드로는 키보드 제작이 활발하지만, 다른 모바일 OS의 경우에는 두벌식 키보드 하나 구현해 놓고 끝내는 일이 많아서 10키 키보드 제작에 신호탄을 쏘는 게 좋지 않을까 하는 생각이 들었다. 게다가 Sailfish OS용 키보드 레이아웃을 만드는 사람들도 10키 레이아웃에는 그다지 관심이 없는 것 같아서 내가 직접 레이아웃을 구현하는 게 더 빠를 것 같았다.

현재 국내 표준으로 지정된 모바일 입력기는 크게 천지인, 나랏글, SKY 한글이다. 이 중 나랏글을 먼저 구현한 데에는 감정적 및 기술적인 이유가 있다. 2004년부터 지금까지 휴대폰을 써 오면서 QWERTY 키보드가 없는 환경에서 가장 오랫동안 사용한 키보드 레이아웃이 나랏글이기 때문에 지금도 나랏글 자판에서는 손이 쭉쭉 나가고, 천지인은 그렇게 오랜 기간을 사용하지 않아서 그런지 아직까지 그렇게 익숙하지 않다. 또한 나랏글의 경우 자음을 입력하는 데 같은 키를 여러 번 누르는 것이 아니라 자음+획추가 방식을 사용하기 때문에 자음을 입력한 후 잠시 기다리거나 방향 키를 누를 필요가 없다. (모음은 아쉽게도 제외되지만 완전히 조합된 한글을 입력할 때 모음을 연속으로 입력하는 경우는 없다) 컴퓨터로 이것을 구현하려면 타이머 이벤트를 붙여서 조합 중 상태를 해제시켜 주어야 하는데 이것이 지원되는 지 여부를 확신할 수 없었다. 천지인의 경우 자음 충돌 문제 때문에 이 기능이 필수적이고 SKY 한글의 경우에는 ‘ㅢ’를 입력하는 경우에 모음 충돌이 발생할 수도 있지만 2번 키를 3회 연타하는 식으로 ㅢ를 입력하는 경우도 있다. 그래서 키보드 입력과 조합된 글자를 1:1 대응시키기 가장 쉬운 나랏글부터 먼저 구현하기로 했다.

표준으로 지정된 모바일 입력기 소스 코드를 구하려면 TTA에 연락하면 된다고는 하지만, 거기에서 제공하는 소스에 어떤 NDA가 걸려 있을지도 모르고 F/OSS 호환성도 확신할 수 없기 때문에 바닥에서부터 새로 구현하기로 결심했다. 모바일 입력기 중 천지인 입력기는 F/OSS로 구현한 게 몇 개 있는 것 같지만, 나랏글의 경우에는 자유 소프트웨어로 구현한 게 없는 것 같았다. 그래서 맨땅에 헤딩했다. 하나의 글자를 길이가 6인 배열로 자소별로 나누었고, 키를 입력하면 이 임시 배열에 자소별로 채워진 다음 최종적으로 음절로 변환하는 단계를 거쳐서 preedit 문자열이 생긴다.

한 글자를 입력하고 바로 커밋하는 방식을 취하기보다는 긴 preedit 문자열을 사용하여 단어 단위로 입력하게 만든 것은 나랏글 입력기의 특성 때문이다. (소스 코드의 inputQ 부분에 해당한다.) 예를 들어서 ‘안’이라는 글자를 입력한 다음 ‘ㄴ녕’을 입력하게 되면 ‘안ㄴ녕’이 나오게 되는데, 이 글자들을 입력하는 중간 과정에서 preedit 문자열에 최대 2개의 독립된 자음이 들어가게 된다. 받침이 있는 글자를 입력한 다음 또 다른 자음을 입력하면 그 자음이 이전에 입력한 글자와 결합되어 겹받침이 될 수도 있고, 다른 글자로 분리될 수도 있기 때문이다. 가령 ‘삭신’을 입력한다고 했을 때 중간 상태로는 ‘삯’이 존재하는데 이 경우 입력기는 사용자가 앞으로 여기에 자음을 입력할지 모음을 입력할지 모르기 때문에 최소 하나의 자음 정보는 더 달고 있어야 한다. 겹받침만 따로 상태를 관리할 수도 있겠냐고 생각할 수도 있지만, ‘앉다’와 같이 ㄵ 받침을 입력하는 경우에는 중간에 ㄴㅅ 상태를 거쳐야 하지만 이것은 올바른 겹받침이 아니기 때문이다. 따라서 종성 부분을 길이 2인 배열로 관리하며 이 배열에는 임의의 두 자음이 올 수 있도록 설계하였지만, 글자를 조합하는 과정에서 올바른 겹받침이 아닌 경우 다음 글자의 초성으로 표시되도록 설계하였고 이렇게 올바른 겹받침이 오지 않은 상태에서 또 다른 자음을 입력하면 중간에 있었던 자음을 별도의 한 글자로 배당한 다음 두 번째 글자의 초성으로 입력한 자음을 배당시켜야 하기 때문에 preedit 문자열의 길이를 충분히 확보해 두어야 한다. 모음 결합 부분은 의외로 구현이 간단하다.

입력 큐에 쌓여 있는 자모를 중간 결합하는 부분에서 첫가끝 대신 한글 호환성 자모를 사용한 것은 글꼴 문제보다는 이 면이 논리적으로 더 맞기 때문이다. 첫가끝 자모는 초성인지 종성인지에 대한 정보를 포함하고 있지만 호환성 자모는 초중종성 정보를 따로 포함하고 있지 않기 때문이다. 기타 commit/preeedit 스트링을 관리하는 부분은 libhangul API의 의미론을 최대한 반영하려고 하였다. 단어 단위로 입력 큐를 들고 있으면 차후에 자동 완성을 구현하는 것이 더 쉬워지는데, 이미 커밋된 글자를 따로 들고 있을 필요 없이 preedit 문자열을 그대로 검색하게 만들면 된다. 아쉽게도 F/OSS로 구현된 한글 단어 완성 라이브러리 및 데이터가 없는 것 같지만, 필요한 경우 나중에 추가하는 것도 가능하다.

나랏글 한글 입력기의 코어 로직은 src/ko_common/naratgeul_handler.js 파일에 포함되어 있다. process 함수에 1~12까지의 숫자를 전달하면(*: 10, 0: 11, #: 12) 이들을 숫자 입력으로 간주하여 해당하는 나랏글 자판에서의 키를 누른 것으로 간주한다. merge_q 함수는 현재 입력 큐에 들어 있는 글자를 보여줄 때 사용할 수 있으며, 입력 큐 길이는 8글자로 되어 있지만 부족하다면 늘일 수 있다. 조합 중 상태에서의 백스페이스 구현은 마지막으로 입력된 자모를 없애고 preedit 문자열을 업데이트하는 것 정도로 충분하다.

입력기의 원본 코드는 GNU General Public License 버전 2 이상으로 공개한다. 다른 오픈소스 입력기에서 이 코드를 사용하고 문제점을 지적하고 Pull Request를 보내는 것은 얼마든지 환영하지만, 소스 코드를 공개하지 않는 무료 및 유료 입력기에 이 코드를 무단 도용하는 것은 컴퓨터 프로그램 보호법에 의하여 대처하겠다. GPL 라이선스는 이 라이선스 하에 배포된 코드를 사용하는 파생 저작물 전체의 소스 코드를 공개할 것을 강제하고 있다. Xvid 코덱을 사용한 PS2 게임 ICO가 이 사실이 발각된 이후 게임 전체의 소스 코드가 공개된 것을 생각해 보면 된다.

돛단배 입력기의 소스 코드는 GitHub에 공개되어 있으며, OpenRepos에도 업로드되어 있어서 다운로드할 수 있다. 나랏글 입력기의 구현체를 다른 GPL 기반 한글 입력기에서 사용하는 것은 얼마든지 환영하며, 입력기 코드를 최초로 작성하는 만큼 소스 코드를 최적화한 Pull Request는 환영한다.

돛단배 입력기를 설치하면 Sailfish OS에서 선택할 수 있는 키보드에 한글(두벌식)과 한글(나랏글)이 추가되며, 다른 언어 키보드처럼 선택하면 된다. 단 한글(두벌식)에서 한글(나랏글)로 바로 가는 것은 API의 한계로 인하여 바로 지원되지 않으며 다른 언어를 경유하면 된다. 나랏글 키보드가 가로 화면에서 일그러지는 것 역시 알고 있는 문제이며 이는 차후 버전에서 개선할 예정이다. SKY 한글 및 천지인 입력기는 차후 버전에서 구현할 예정이다.

아래는 Jolla 휴대폰에서 구동시킨 돛단배 입력기의 스크린샷이며 각각 두벌식과 나랏글 모드이다.

두벌식 입력기

두벌식 입력기

나랏글 입력기

나랏글 입력기

블랙베리 Z10으로 LG U+ LTE 네트워크 사용

펌웨어 장난을 치다가 수리 보낸 Z10이 드디어 돌아왔다. 갈 때는 3G 전용 모델인 STL100-1이 갔으나 돌아올 때에는 북미용 LTE 모델인 STL100-3이 돌아왔다. Z10은 LTE 밴드에 따른 모델이 총 3개가 있는데 이 중 STL100-2는 800/900/1800/2600, STL100-3은 700/850/1700/1900을 지원하며 나머지 하나의 모델은 Verizon 전용이라서 우리와는 인연이 없다. 내 주 회선이 KT라서 STL100-2가 아니면 3G로만 써야 하는 게 좀 아쉽긴 하지만, SKT LTE 네트워크는 정상적으로 붙는 것을 보았고 LG U+도 가능할까 하는 생각이 들었다.

우선 LTE 라우터를 꺼낸 다음 mini SIM을 micro SIM으로 잘랐다. 내 커터가 좀 안 좋아서 그런지 아니면 원래 그런지 모르겠지만 자르고 나서 모서리를 좀 다듬어 주어야 다시 원래 형태로 결합할 수 있었다. 다시 LTE 라우터에 결합했을 때 4G 네트워크를 정상적으로 잡는 것을 확인한 다음 Z10에 물렸다. 그런데 생각대로 LTE 네트워크를 잘 잡지 못했다.

블랙베리 10 OS의 설정 – 네트워크에서 선택 가능한 조합은 STL100-1의 경우 2G, 3G, 3+2G 세 종류였고 STL100-3의 경우 4+3+2G, 4+3G, 3+2G, 3G, 2G가 선택 가능했다. 문제는 4+3G 및 4+3+2G 조합을 선택했을 때 바로 4G부터 연결하는 것이 아니라 3G를 먼저 찾은 다음 4G로 연결하는 것 같았다. 그래서 기본 설정인 4+3+2/4+3을 선택했다 하더라도 LG U+ 네트워크에는 연결하지 못하는 것이다. 이 문제를 해결하려면 우선 APN을 편집하여 “internet.lguplus.co.kr”을 추가한 다음 escreen을 불러와야 한다. escreen을 부르는 방법은 검색 몇 번으로 찾을 수 있어서 생략한다. escreen을 불러온 다음 맨 아래쪽의 General Radio 섹션에서 Enabled RAT에서 LTE_ONLY를 선택한 다음 재부팅해야 LG U+ LTE 네트워크를 인식하였다.

escreen 편집

escreen 편집

한 번 LG U+ LTE 네트워크를 잡으면 네트워크 우선 순위 설정을 건드리지 않으면 계속 연결되어 있다. 하지만 네트워크 우선 순위 설정을 조금이라도 건드리면 LTE 네트워크와 연결이 끊겨 버린다. 위 설정 이후 재부팅하면 네트워크 우선 순위는 4/3/2G처럼 보이지만 이것을 수정하면 인터넷 연결이 끊긴다.

네트워크 우선 순위 관리

네트워크 우선 순위 관리

VoLTE를 어떻게든 뚫어 보려고 음성 통화를 PS Only로 변경도 해 보았지만 114에 연결은 안 되는 것 같았고, SMS나 MMS도 안 된다는 말이 있었다. 어쩌면 이건 라우터 USIM이라서 걸리는 제약인 것 같다. 아래 스크린샷에서도 보는 것처럼 BBM 연결은 4G 망에서 안 되는 것 같다. (어차피 BBM 친구가 얼마 없긴 하지만)

LG U+ LTE

LG U+ LTE

급할 때에는 LTE 라우터 대신 이걸 쓸 수 있다는 것 정도에만 만족해야겠다. 어차피 LTE가 되는 태블릿이 없어서. Q10이나 Q5 같은 다른 블랙베리 10 모델은 가지고 있는 게 없어서 확신하기는 어렵지만, SKT LTE 850MHz에 연결할 수 있다면 LG U+에서 데이터 전용으로 시도해 볼 수는 있을 것이다.

블랙베리 Z10 10.2 업데이트 시 한글 SMS 오류 해결

그 동안 CrackBerry 사이트에 유출되어서 올라오는 10.2 릴리즈를 계속 모니터링하다가, 최근 10.2.0.1767 버전이 정식 릴리즈되었다는 소식을 듣고 과감하게 올렸다. 10.1 MR 버전에서는 escreen을 사용해도 KT APN을 입력할 수 없었던 문제가 있었지만, 10.1 초기 버전에서는 Google 서비스에 로그인할 때 2단계 인증을 지원하지 않아서(애플리케이션별 암호를 생성해야 함) 어차피 데이터 차단을 걸어 둔 마당에 2단계 인증이 더 중요하다는 생각으로 10.1 MR을 계속 유지해 왔다. 하지만 MMS를 못 받는다는 치명적인 문제가 있었기 때문에 10.2를 과감하게 올렸다. 전에 썼던 N9는 데이터와 MMS가 별개로 놀아서 좋았는데, Z10은 데이터가 죽으면 MMS가 같이 죽어서 불편하다.

그러니까 펌웨어 버전별 상태 요약:

  • 10.1.0.1720 (릴리즈 10.1.0.273): KT APN 편집 가능, Google 2단계 인증 미지원
  • 10.1.0.4633 (릴리즈 10.1.0.4181): KT APN 편집 불가, Google 2단계 인증 지원
  • 10.2.0.1767 (릴리즈 10.2.0.415): KT APN 편집 가능, Google 2단계 인증 지원

Google 2단계 인증 지원이 없으면 안 되기 때문에 과감히 10.2.0.1767로 올렸으나, 이번에는 치명적인 SMS 한글 깨짐 문제가 발생했다. 내가 보내는 메시지는 제대로 한글이 보이나, 받는 메시지의 한글이 상당 부분 깨졌다. 일부 메시지는 깨진 부분이 중요하지 않아서 내용을 유추할 수 있으나, 일부는 메시지 전체가 깨져 버리는 경우가 있다. 페이스북에도 올렸던 이 사진을 참고하면 된다.

야이 개새끼들아

야이 개새끼들아

나는 이 기계를 Qt Contributor’s Summit에서 얻은 거라서 징징댈 판매자가 없었고, KT는 블랙베리를 정식 유통했던 적이 없었기 때문에 이 상황에서의 흔한 해결책인 “너님 통신사에 문의하세요”는 “즐”이라는 응답만 돌아올 게 뻔하다. 설상가상으로 BlackBerry 포럼은 공식 지원을 받을 수 있는 창구가 아니고, Incident Report 서비스를 이용하려면 $49가 나간답니다 고갱님. 1599-5119 한국 서비스 센터에 전화해 봤자 Z10은 한국에 안 들어왔기 때문에 FAIL. 이건 분명히 BB 잘못인데 내 돈 나가는 꼴은 보기 싫어서 조금 더 연구를 해 봤다.

10.2가 정식 릴리즈가 되기 전 CrackBerry에 돌던 방법으로는 하이브리드 롬이 있는데, BlackBerry 10 OS의 구조상 가능한 일이다. BB10 OS 릴리즈 10.a.b.c가 존재하면, 라디오 파일 릴리즈는 10.a.b.c+1로 이루어진다. 하이브리드 롬은 OS 10.a.b.c의 롬 파일과 라디오 10.a.b.d를 같이 밀어넣는다는 것이다. (c != d) OS 업그레이드는 크게 두 개의 .bar 파일로 이루어지는데, OS 업그레이드용 .bar 파일은 실제 데이터인 .signed 및 메타데이터를 포함한 zip 파일이기 때문에 오토로더를 만들 때에는 .signed 파일만 있으면 된다. Darcy’s BlackBerry Tools, Sachesi 모두 사용자가 가지고 있는 .signed 파일에서 오토로더 생성을 지원하며, 이 둘은 모두 cap.exe 실행 파일을 사용하여 .signed 파일에서 오토로더를 만든다. (.exe 파일이 튀어나오고 이 파일을 실행하면 펌웨어를 덮어씀)

2013/11/12 업데이트: 이 방법을 쓰고 며칠 후 폰이 제대로 응답하지 않다가, 재부팅 시 블랙베리 로고에서 진행되지 않는 현상이 나왔다. 라디오 버전과 OS 버전 불일치시 발생할 수 있는 증상 중 하나이며, 버전 불일치가 해결되지 않는 한 이 문제를 잡을 수 없다. 덕분에 Z10을 AS 보냈으며, 이와는 별개의 채널로 BB 측에 이 문제를 통보한 상태이다.

CrackBerry 사이트를 뒤지는 중 10.2.0.1767 OS/1048 라디오 롬을 조합해서 쓴다는 보고를 발견하였고, 이 조합이 성공할 것인지 반신반의하는 상태에서 일단 밀어넣었다. 라디오 파일만으로 오토로더를 생성할 수는 있으나, 이렇게 만들어진 오토로더를 사용하면 예상과는 달리 OS가 없다는 듯인지 빨간 불만 계속 깜빡거리고 부팅이 진행되지 않는다. 따라서 오토로더를 만들 때에는 무조건 OS/라디오를 짝지어 주어야 하고, 오토로더 실행 이후에는 휴대폰이 무조건 포맷된다. 백업 해 두길 잘 했지.

라디오 롬 파일은 여기에서 구할 수 있으며, 내 경우에는 Z10 STL100-1을 쓰기 때문에 STL100-1용 10.2.0.1048 라디오 파일을 구했다. Darcy’s BB Tools를 사용하여 미리 받아 둔 10.2.0.1767 OS 이미지와 1048 라디오를 합친 오토로더를 생성하고 이걸로 밀어넣은 결과…

하이브리드 OS/라디오

하이브리드 OS/라디오

escreen을 사용해서 APN 강제 지정도 가능하고 한글 SMS가 지금까지는 깨지지 않았다. OS 버전과 무선 버전이 따로 놀면 이제 성공이다.

노키아 5800 글로벌 펌웨어에 EUC-KR 인코딩 추가

2013/03/05 추가: 현재 저는 노키아 5800을 더 이상 메인으로 사용하지 않습니다. 본문에 나오는 펌웨어는 V60 EURO1을 받아서 한국 펌웨어에 있는 .r65 파일을 결합하고 인코딩 지원만 추가해 두었습니다. 실제 사용할 수 있는 수준과 거리가 멀기 때문에 제 폰에 플래싱한 펌웨어는 따로 제공하지 않습니다.


아직까지도 노키아 5800/X6을 쓰는 사람이 얼마나 있는지는 잘 모르겠지만, 삽질을 기록해 볼 필요성은 있을 것 같아서 글을 써 본다. 노키아 5800 커펌이 유행했을 때, 해결 불가능한 대표적인 두 가지 문제로 EUC-KR 미지원 및 한글 입력기 문제가 있었다. EUC-KR 미지원 문제는 결국 아무도 풀지 못한 문제가 되었고, 한글 입력기 문제는 외부에서 텍스트를 조합해서 붙여 넣는 방식의 한글 입력기나 Swype에 한글 사전을 추가하여 해결하였다. EUC-KR 인코딩 문제를 쉽게 해결할 수 있을 것 같다고 생각해서 과감하게 글로벌 펌웨어 V60 기반으로 올렸지만, 생각만큼 문제 해결이 쉽지 않았다.

인코딩 문제는 생각보다 복잡하다. 노키아 심비안 휴대폰들의 메모리 영역은 보호가 강한 순서대로 (ROM, CORE, ROFS1), ROFS2, ROFS3으로 나뉘며, 오래 전 디브랜딩에 대해서 썼던 글은 ROFS3 영역을 통신사 소프트웨어가 설치되어 있지 않은 파일로 바꿔서 6210의 경우 폰꾸미기 등을 날려 버리는 방법이다. 커펌들은 ROFS3 이상의 영역까지 손을 대며, 글로벌 펌웨어와 한국 펌웨어는 CORE 영역부터가 달라서 쉽게 왔다갔다할 수 없다.

한국 펌웨어에 추가되어 있는 EUC-KR 인코딩 관련 파일은 ROM 영역에 있는데, 이 영역에 있는 실행 파일은 폰에서는 모두 Z: 드라이브에 있는 것으로 보이지만, ROFS 영역에 있는 실행 파일과 형식이 다르다. ROM 영역에 있는 실행 파일 및 DLL 파일은 XIP 형식으로 되어 있기 때문에 일반적인 S60 실행 파일처럼 실행시킬 수 없다. 또한 XIP 형식 실행 파일에서는 외부 참조를 절대 주소로 불러오기 때문에, ROM의 구조가 바뀌어 버리면 실행할 수 없다. 따라서 제아무리 ROM 영역에 있는 DLL 파일을 추출해서 ROFS2 영역에 붙여넣어도 실행되지 않는다. 게다가 모든 커스텀 펌웨어들이 ROM 영역은 건드리지 못하기 때문에 EUC-KR 인코딩을 쉽게 집어넣을 수는 없다.

ROM 영역에 있는 실행 파일을 ROFS 영역에서 실행되게 하려면 XIP 형식 실행 파일을 일반적인 E32 형식으로 바꿔야 하며, 이걸 위해서는 실행 중인 휴대폰에서 ROMPatcher+를 사용하여 뜬 ROM 덤프가 필요하다. 불행히도 이 글을 쓴 시점에서는 V60 CORE를 올려 버린 상태라서 V20 한국 펌웨어의 ROM 덤프를 뜰 수 없었으며, 설상가상으로 주변에 있는 V20 펌웨어가 깔려 있는 5800을 구할 수도 없었다. 되면 좋고 안되면 말고 하는 마음으로 6210 펌웨어에서 ROM 덤프를 떴다. 어차피 한국어 인코딩에 관한 부분은 크게 바뀌지 않았을 것이라고 생각하였다. 그 다음 aRomAT를 사용하여 ROM 덤프에 있는 실행 파일을 E32 형식 실행 파일로 바꿔야 한다. ROM 덤프에서 추출해야 하는 실행 파일은 CP949.dll, cp949table.dll, EUCKR.dll, iso2022kr.dll, ksc5601.dll이다. aRomAT를 실행하고 파일을 찾은 다음 “Convert to EPOC”을 실행하면 ROFS 영역에서 실행할 수 있는 dll 파일로 변환된다.

이제 커스텀 펌웨어의 ROFS2 영역을 열어서 sys\bin 폴더에 5개의 DLL 파일을 추가하고, V20 ROM에 있는 EUCKR.snm, iso2022kr.snm, ksc5601.snm 파일을 추출하여 resource\charconv 폴더에 복사한다. 실행 파일은 아니므로 복사 그대로 해도 무방하다. 그 다음에는 ROFS1 영역에 있는 private\10009d8f\ecom-0-0.spi 파일을 편집하여 인코딩에 관한 정보를 추가해야 한다.

2013/03/05 추가: ROM 영역을 열 수 있는 펌웨어 쿠커로 열지 않으면 snm 파일이 안 보이므로 한국판 V20 펌웨어에서 추출한 snm을 올려 둔다.

3740057327.zip첨부한 파일은 노키아 6210 펌웨어에서 추출 및 가공한 한국어 인코딩 DLL, ecom-0-0.spi 파일에 추가해야 할 부분이다. 5800 V20 펌웨어에 있었던 snm 파일은 펌웨어에서 추출해야 한다. encodings.spi 파일을 열면 위에 있는 DLL 파일의 등록 정보가 있으며, ROFS1 영역에서 저 파일을 추출한 다음 windows-1258 인코딩 정보 다음에 붙여넣은 다음 ROFS2 영역에 같은 파일 이름으로 저장한다. 같은 방법으로 5800 V20 ROFS1에 있는 resource\TopCharacterSet.rsc 파일을 ROFS2 영역에 붙여넣는다. ROFS1 영역을 편집해도 되지만, 이번 작업의 목표가 ROFS2 이상만 건드린다는 것이므로 생략한다.

2734176526.zip

이렇게 하고 플래싱을 실행하면 그 동안 기존 커펌에서 성공시키지 못했던 KT 망에서의 한국어 MMS 디코딩 및 EUC-KR 웹 페이지가 깨지지 않고 보인다. 성공했는지 보려면 웹 브라우저의 옵션->페이지를 열어서 문자 인코딩을 보면 되며, EUC-KR이 추가되었다면 한국어 (EUC-KR) 및 한국어 (ksc5601) 항목이 추가되어 있다.

웹 브라우저 인코딩 설정

웹 브라우저 인코딩 설정

Swype 한국어 지원 추가 및 한국어 입력기 추가에 관한 글은 차후 추가할 예정이다.