왠지 글성격은 엔진게시판에 써야할것 같지만 거긴 그냥 구글링에 쫙 쫙 나와버리니 이곳에 씁니다.
(로그인하고 레벨한 5정도 넣어주시면 감사할듯.. 레벨은 없어도 될려나)
기나긴 여정이였습니다.
2/1바이트 검사를 처음 겪어본것도 있었고 문자셋 덮어쓰기 기능에 대한 이해가없어서 무지 헤맸다는..
우선 중심부분을 알아보자.
1차 수정 할곳 가기 : 메인함수에서 CRT+N
위 화면처럼 MultiByteToWideChar > 맨위에 주소로 간다.
거길 가보면 MultiByteToWideChar 콜명령과 TextOut 콜명령이 한 함수에 있을겁니다.
여기서 왼쪽화면 코드페이지 3A4 > 3 으로 변경합니다.
여기서 한글 코드페이지를 몰라서 그냥 define된 3번으로 교체한건데
0 (CP_ACP) | ANSI code page |
1 (CP_OEMCP) | OEM code page |
2 (CP_MACCP) | Macintosh code page |
3 (CP_THREAD_ACP) | Windows 2000/XP: 호출 스렛드의 ANSI code page |
요렇단다. 그래서인지 한윈에서 어플로 실행하면 그냥 히라가나 나와버립니다.
아마 요부분만 한글코드페이지 지정해주면 어플에서도 한글이 나올듯합니다.
____________________________________________
바이너리 서치
8A 44 24 04 3C 80 73 03 33 C0 C3 3C A0 73 06 B8 01 00 00 00 C3 3C E0 1B C0 40 C3
_____________________________________________
두번째 수정할곳입니다.
왼쪽 화면에서 음영된 부분 0A0 > 오른쪽 화면처럼 0D0 로 변경한다.
2바이트중 상위바이트를 검사해서 A0 이상이면 1바이트를 유니코드로 변환시켜버린다.
일어는 9F FF 영역까지 쓰는것 같고 한글은 CF FF 영역까지 쓰는것 같더라. 그래서 요렇게 변시 시켜주니 잘된다..
____________________________________________
바이너리 서치
0F BE C0 83 C0 FE 83 F8 06
_____________________________________________
괜찮은 후킹지점 같아서 같이 올립니다.
위 바이너리로 서치를 한다음에 스샷에서 보이는 것 처럼 함수 시작위치에서 후킹을걸고 인자로 [ESP+0XC] 포인터 바꿔치기
여담..
먼가 쓸말이 많았는데 막상 쓰려니 할말이 없군요.
요놈은 아스키를 유니코드로 변환합니다. 고로 유니코드 스크립트를 잡아채면 만사 오케이인데 그런게 없더라.
왠지 메모리 맵에없는 문자 한개 한개를 유니코드로 변환시키고 한번 변환된 유니코드를 따로 메모리 맵에 모은다음에
출력할때는 거기에 매칭시키는 것 같다.
2바이트 1바이트 체크에 대해서...
프로펠러사를 파면서 쉼표를 아랄dll 에서 수정해볼까하고 생각하다보니 왜 저짓을 하는지 이해가 가더군요.
아스키를 유니코드로 한글자씩 변환시키려다보니 문자단위로 끊어놔야하는데 그래서 2바이트를 읽어서
상위바이트가 81 이상인지 체크 하는것 같더라. 1바이트문은 2F , 5D 요런식 81과 상위바이트를 검사해서
높으면 2바이트로해서 일어 최대 상위바이트 A0 (9F)를 검사해서 낮으면 2바이트를 유니코드로 변환시키는것 같더라.
머 정확하진 않지만 느낌이 그렇더라는....
BGI 엔진 찾으시는데 보탬이 됐으면 좋겠군요.
아래는 제가 올린 BGI 엔진 링크입니다. 참고 하실분은 하세요.
학왕팬디스크 学☆王 It’s Heartful Days!!
학왕 学☆王 -THE ROYAL SEVEN STARS-
아마 SHIFT-JIS가 932(3A4),
한글 ANSI가 949 (3B5)로 기억합니다...
그건 그렇고, BGI 파시느라 고생많으셨습니다.^^