Macintosh ROM Hacking I (startup icon change) |
||||||
|
||||||
2016.04.15.(金) | ||||||
ROM을 구울 수 있는 여건이 조성되었기에 롬파일을 조금 수정해 보기로 했다. 천리길도 한걸음부터라고 다들 시작하는 스타트업 아이콘을 변경해 본다. 사전 준비사항 -> 스타트업 아이콘은 롬파일 어디에 위치하는지 알아야 하고 롬파일 체크섬 원리를 알아야 한다. -> 롬파일 디스어셈블이 가능해야 하고, 체크섬 계산프로그램을 만들어야 한다. 필요한 배경지식 - 68K Mac 롬파일 디스어셈블러 툴 FDisasm : Mac 128K ~ Mac II, IIsi, 660AV 까지 정리 된 것을 인터넷에서 구할 수 있다. (롬파일 크기 64KB~256KB, 512KB, 2MB) MacNosy : 응용프로그램은 잘 디스어셈블(?)되나 롬파일은 방법을 모르겠다. IDA : 모든 걸 지원하나... 그만큼 사용하기 어렵다. 정의파일이 있어야 할 것 같은데 알수 없다. (NYCRESISTER ; Ghosts in the ROM) *2016.5.7(토) 구글링해서 IDA pro(v 5.2)로 롬파일 디스어셈블 하는 힌트를 찾았다. - ROM Image 형식을 선택하고 롬파일을 연다. - 프로세서 타입을 68030 으로 선택한다. - 'Create RAM section' 을 선택한다. 시작주소를 0xF00000, 사이즈를 0xFFFF 로 설정한다 - IDA View-A 탭의 'ROM:00000000 을 선택하고 'D' 키를 3번 연속 누른다. - 그러면 dc.l $3C37FC89 같이 롬사이즈가 표시된다. - 그 다음 주소인 'ROM:00000004 를 선택하고 'D' 키를 3번 연속 누른다. - 벡터주소가 리셋되면서 dc.l unk_2A 라고 보이면 'dc.l unk_2A' 를 두번 클릭한다. - 그러면 시작주소 0x2A 로 이동한다. 여기부터 시작이다. 'C' 키를 눌러 디스어쎔블을 시작하자. - 여기까지 했으면 메뉴의 옵션을 선택하고 General 의 Analysis 탭으로 간다. - 'kernel options 1' 버튼을 누른다. - 맨마지막에 있는 'Make final analysis pass'를 체크하고 나와서 'Reanalyze program' 버튼을 누른다! - 확인해본 결과 디스어쎔블이 제대로 된 것 같다. 하지만 해석은 또 다른 문제다. ㅠㅠ 어쨌든 FDisasm으로 롬파일을 분석한 자료가 풍부했다. 그래서 따라 해보려 했지만 잘 안되었다. Findcode 프로그램을 실행하여 코드가 시작되는 곳으로 추정(?)되는 0x2A 주소부터 bin_map, bin_names 파일을 생성했다. 그러나 이미 분석된 SE ROM의 bin_map 과 비교해서 내용이 부실했다. 나중에 알았지만 0x2A 주소 부터의 분석이 끝났으면, 또다른 코드가 있다고 의심(?)되는 곳을 계속 디스어셈블 해나가면서 bin_map 파일을 업데이트 시키는 거라고 한다. 코드가 있다고 의심(?)되는 곳을 찾는 것은 능력밖의 일이었다. 용기를 내서 롬프로그래머를 만든 Brown Doug에게 메일을 보냈다. IIci ROM의 해피맥 아이콘 주소를 알려달라 했다. 친절하게도 답을 매우 빨리 보내주었다. 다시한번 감사드린다! 생뚱맞게 IIci ROM의 해피맥 아이콘 주소를 알려달라고 한 것은 롬파일 크기가 비슷하면 내용이 크게 다르지 않다는 것을 예상했기 때문이다. IIci 와 Classic II의 롬파일 크기는 512K 이다. 예상대로 그 주소에서 IIci 와 동일한 헥사코드를 발견할 수 있어서 아래에 정리해 둔다. Icon Offsets in IIci ROM image (each is 0x80 = 128 bytes): Happy Mac : 0x17F2 ~ 0x1871 Happy Mac Mask : 0x1872 ~ 0x18F1 Disk : 0x18F2 ~ 0x1971 Disk Mask : 0x1972 ~ 0x19F1 Disk w/? : 0x19F2 ~ 0x1A71 Disk w/? Mask : 0x1A72 ~ 0x1AF1 Disk w/! : 0x1AF2 ~ 0x1B71 Disk w/! Mask : 0x1B72 ~ 0x1BF1 * 128KB ROM 을 가진 Plus 는 0xFD2 에 16x10 사이즈의 happymac 얼굴만 있다. 256KB ROM 을 가진 SE 는 0x125C 에 16x10 사이즈의 happymac 얼굴만 있다. (몸통, 디스켓 모양, 각각 Mask는 어디에 있는지 도저히 찾을 수 없었다! ) * 0x4E75 코드는 Rts(어셈블러로 return)에 해당하고 그 뒤 Hex 값이 아이콘일 가능성이 높다고 한다. Brown Doug는 ROM을 디스어셈블해서 저 코드를 찾았다고 했는데 미친짓이었다고 표현했다. 난 디스어셈블 시늉만 하고 답만 편히 받아 엄청난 시간절약을 했다. 그러나 ROM 디스어셈블 방법과 코드에 대해서는 여전히 이해를 못하고 있다. 더 많은 것을 찾아 공부해야 한다. 남은 문제는 32x32 아이콘을 Hex로 변경하고 롬파일 수정시 변경된 체크섬값을 계산하는 것이다. 이미지를 Hex 값으로 변경시켜주는 프로그램을 검색하니 여러가지가 있었다. 무료인 ezBMP가 괜찮았다. 롬파일에서 아이콘을 찾는 것은 Hex값을 이미지로 변경시켜주는 프로그램이 더 도움이 될 것이다. 그러나 그런 프로그램은 찾지 못했다. 하나하나 Hex값을 도트로 그려 해피맥 아이콘인지 확인 했다. 롬파일 최초 4byte는 체크섬 값이다. 이 값과 실제 체크섬값을 비교하고 다르면 에러메시지를 출력한다고 한다. 맥 롬파일 체크섬 계산 C++ 소스 (Ben Boldt's project) 를 훑어보았다. 반복문을 보니 최초 4byte 체크섬값은 체크섬계산시 제외하는 것 같았다. 각각의 Hex 값을 더해나가는 방식으로 체크섬을 계산하는 듯 했다. 소스디버거를 사용하여 실제 계산값과 최초 4byte 체크섬 값을 비교하는 루틴에 중단점을 설정하면 변경된 체크섬값을 얻을 수 있겠다는 생각이 들었다. 최초 4byte 값도 체크섬 계산에 참여한다면 체크섬값을 추정하기가 복잡해진다. 그러나 최초 4byte 값이 체크섬 계산에서 제외된다면 일이 쉬워진다. 롬파일을 수정하고 바로 ROM을 구워 테스트 하는 것은 쉬운일이 아니다. 그래서 먼저 윈도우용 바실리스크 II 에뮬레이터에서 시도해 보려 했다. 운좋게도 바실리스크 II 에뮬레이터 환경설정파일에서 ROM을 선택하면 체크섬값을 알려주었다! 빙고! Classic II 롬파일의 ? 마크 디스켓 이미지 Hex 값을 다른 32x32 아이콘 이미지 Hex 값으로 바꿔 주었다. 최초 4Byte 값이 체크섬값에 영향만 안주면 바실리스크가 알려준 값을 그대로 최초 4byte에 넣어주면 된다. ![]() 바실리스크에서 시동디스크가 없을때 나오는 물음표 디스켓 대신 변경된 아이콘이 나왔다! 최초 4Byte 값이 체크섬값에 영향을 안주어서 쉽게 해결되었다. Brown doug는 롬파일 체크섬 계산 소스를 공개한 Ben Boldt에게 매우 고마와 했다. 그런데 2000년경 바실리스크 개발자는 이미 체크섬 계산법을 알고 에뮬레이터를 만든것이다! 멋지게 보이게 이번엔 해피맥과 물음표 디스켓을 미키마우스로 바꾸어 보았다. ![]() 의도한 것과 다르게 흰색 물음표가 점멸한다. 원래 구상은 미키마우스가 흰색, 검은색으로 바뀌고 물음표는 검은색 이었다. * ezBMP 프로그램 설정이 잘못되어 반전된 Hex 값으로 출력되었기 때문이다. 해피미키는 순식간에 지나가서 갈무리 할 수 없었다. 하지만 확실히 보이긴 보였다. 미키마우스가 작아서 예뻐 보이진 않는다. 또다른 시도를 해보았다. ![]() ![]() 역시 전문가가 그린 도트 미키가 그럴 듯 하게 보인다. 약간의 고생을 해서 미키마우스 손이 하드디스크 방향을 가리키며 점멸하게 만들었다. 이제 롬파일을 4개로 쪼개면 되는데 문제가 생겼다. 햇빛에 노출시켰는데도 EPROM 이 지워지지 않는다. 마눌님께 아기 젖병소독기 어디있느냐 물었다. 이미 딴사람 줘버렸단다. 개똥도 약에 쓰려면 없다더니 꼭 맞다. 일부러 식당가서 물컵 자외선 소독기에 넣어 둘수도 없는 일. 뾰쪽한 수를 생각해 봐야겠다. - 해결책은 의외로 가까운 곳에 있었다. 강의실 뒤쪽에 자외선 살균소독기가 있었다. 자외선 살균소독해보니 초기화 된 듯했다. 그러나 다시 쓰는데 계속 실패했다. 알고보니 한 bit 가 초기화 안된 것이다. 다시 시도해 봐야 한다. |
||||||
<- Prev | ||||||
|
||||||